공식 빌드 환경을 기반으로 하지 않고, 최신 보안 라이브러리와 맞춤 모듈을 포함해 Nginx를 소스 코드로부터 직접 빌드하고 운영 체제 수준에서 안정적으로 관리하는 방법을 설명합니다.
1. 종속성 라이브러리 준비
기본 시스템 패키지 관리자를 통해 필수 개발 헤더 및 라이브러리를 설치합니다:
yum groupinstall "Development Tools" -y
yum install -y pcre-devel zlib-devel gcc make
OpenSSL 1.1.1 시리즈는 보안 강화를 위해 별도 소스 설치가 권장됩니다. 최신 LTS 버전인 openssl-1.1.1w를 사용합니다:
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar xzvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
make -j$(nproc)
sudo make install
2. Nginx 소스 컴파일 및 설치
Nginx 1.24.x 안정 버전을 다운로드하고, OpenSSL과의 연동을 명시적으로 지정합니다:
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar xzvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
다음과 같이 확장 기능을 활성화한 구성 명령어를 실행합니다:
./configure \
--prefix=/opt/nginx \
--sbin-path=/opt/nginx/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-openssl=/usr/local/src/openssl-1.1.1w \
--with-openssl-opt=enable-tls1_3
빌드 및 설치:
make -j$(nproc) && sudo make install
3. 라이브러리 경로 해결
OpenSSL을 커스텀 위치에 설치했기 때문에, 동적 링커가 공유 라이브러리를 찾을 수 있도록 /etc/ld.so.conf.d/에 경로를 등록합니다:
echo "/usr/local/openssl/lib" | sudo tee /etc/ld.so.conf.d/openssl.conf
sudo ldconfig
4. 구조화된 설정 관리
단일 nginx.conf 파일 대신, 계층형 디렉터리 구조를 활용해 유지보수성을 향상시킵니다:
sudo mkdir -p /etc/nginx/{sites-available,sites-enabled,snippets}
sudo ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
예: /etc/nginx/sites-available/app-api
upstream api_backend {
least_conn;
server 192.168.5.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.5.11:8080 max_fails=3 fail_timeout=30s;
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
location /health {
return 200 'OK';
add_header Content-Type text/plain;
}
location / {
proxy_pass http://api_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
메인 설정 파일 /etc/nginx/nginx.conf 내부에서 포함 선언:
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 전역 성능 설정
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 2;
types_hash_max_size 2048;
# 사이트 설정 로드
include /etc/nginx/sites-enabled/*;
}
5. systemd 서비스 등록 (CentOS 7+)
레거시 init 스크립트 대신 현대적인 systemd 유닛 파일을 생성합니다:
sudo tee /etc/systemd/system/nginx.service <<'EOF'
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
서비스 활성화 및 시작:
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
6. 핵심 운영 명령어 요약
sudo nginx -t: 설정 문법 검사sudo nginx -s reload: 설정 재적용 (그라데이션)sudo nginx -s stop: 즉시 종료sudo nginx -s quit: 그라데이션 종료 (활성 요청 완료 후)sudo journalctl -u nginx -f: 실시간 로그 모니터링
7. 성능 최적화 팁
하이트래픽 환경을 위한 주요 튜닝 파라미터 예시 (/etc/nginx/nginx.conf 내 events 블록):
events {
use epoll;
worker_connections 16384;
multi_accept on;
}
http {
# 파일 디스크립터 제한 상향 조정
worker_rlimit_nofile 65536;
# 연결 재사용
keepalive_requests 10000;
keepalive_timeout 1s;
# 압축 및 캐시
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types application/json text/css application/javascript;
}
시스템 레벨 조정 (영구 적용을 위해 /etc/sysctl.conf에 추가):
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
fs.file-max = 2097152
적용: sudo sysctl -p