두 방식은 설정 경로와 관리 방식이 다릅니다. 상황에 맞게 고릅니다.
| 항목 | RPM 설치 | 소스 빌드 |
|---|---|---|
| 설정 경로 | /etc/nginx 고정 |
--prefix 로 지정, 이 레슨은 $BASE/nginx |
| 계정 | 패키지가 nginx 자동 생성 |
직접 useradd |
| systemd 유닛 | 패키지에 포함 | 직접 작성 |
| 모듈 | 빌드된 모듈만 사용 | --with-* 로 원하는 모듈 선택 |
| 업그레이드 | dnf 로 버전 교체 |
새로 빌드해 바이너리 교체 |
버전 관리가 편한 쪽은 RPM 이고, 서드파티 모듈이나 최신 기능이 필요하면 소스 빌드를 씁니다. 이 레슨은 두 방식을 모두 다루되, 폴더 구조와 nginx.conf 데모는 소스 빌드 경로($BASE/nginx) 기준으로 보여줍니다.
인터넷이 없는 서버는 인터넷 PC 에서 nginx RPM 과 의존 RPM(pcre2·openssl-libs 등)을 함께 받아 반입합니다. 의존성 하나라도 빠지면 dnf localinstall 이 실패합니다.
반입 전에는 항상 체크섬을 비교합니다. 인터넷 PC 가 게시한 sha256 값과 반입한 파일의 값이 다르면 전송 중 손상됐거나 다른 파일이 섞인 것이라 설치를 중단합니다.
nginx 소스 빌드는 C 컴파일러와 세 가지 개발 라이브러리가 필요합니다. gcc·make·pcre2-devel(정규식)·zlib-devel(gzip 압축)·openssl-devel(TLS) 입니다.
devel 패키지가 하나라도 없으면 configure 단계에서 해당 기능을 찾을 수 없다는 오류로 멈춥니다. RPM 설치와 마찬가지로 이 패키지들도 폐쇄망이면 미리 반입해야 합니다.
--prefix 는 설치 루트를 정하고, 나머지 경로 옵션은 이 레슨처럼 명시적으로 지정하지 않으면 --prefix 아래 기본값을 씁니다.
| 옵션 | 뜻 |
|---|---|
--prefix |
설치 루트, 이 레슨은 $BASE/nginx |
--with-http_ssl_module |
TLS(HTTPS) 지원 |
--with-http_realip_module |
프록시 뒤에서 실제 클라이언트 IP 읽기 |
--with-stream |
TCP·UDP 레벨 프록시(스트림 모듈) |
--with-http_v2_module |
HTTP/2 지원 |
--with-http_realip_module 은 nginx 를 Tomcat 앞에 두는 이 시리즈에서, 이 nginx 자신이 다른 프록시 뒤에 있을 때 필요합니다. 지금은 함께 켜 두고 다음 레슨에서 실제로 씁니다.
소스 빌드 결과는 $BASE/nginx 아래 conf·logs·html·sbin·run 으로 나뉩니다. conf/conf.d/ 는 사이트별 설정을 나눠 담는 폴더로, 다음 레슨의 리버스 프록시 설정이 여기 들어갑니다.
nginx.conf 는 events·http 두 블록이 뼈대입니다. events 는 연결 처리 방식, http 는 요청 처리 방식을 담습니다.
| 지시어 | 뜻 |
|---|---|
worker_processes auto |
CPU 코어 수만큼 워커 생성 |
worker_connections |
워커 하나가 처리할 최대 연결 수 |
include conf.d/*.conf |
사이트별 설정 파일을 모두 불러옴 |
keepalive_timeout |
클라이언트 연결 유지 시간(초) |
sendfile on |
커널이 파일을 직접 전송, 정적 파일에 유리 |
include 지시어 덕분에 사이트가 늘어나도 nginx.conf 본문은 그대로 두고 conf.d/ 에 파일만 추가하면 됩니다.
RPM 은 설치 과정에서 로그인 불가 nginx 계정을 자동으로 만듭니다. 소스 빌드는 이 계정을 손수 만들고 nginx.conf 의 user 지시어에 지정해야 워커 프로세스가 최소 권한으로 돕니다.
마스터 프로세스는 포트 바인딩 때문에 잠깐 root 로 뜨지만, 실제 요청을 처리하는 워커 프로세스는 지정한 계정으로 떨어집니다.
RPM 은 유닛 파일을 함께 설치하지만, 소스 빌드는 직접 작성해야 합니다. 핵심은 Type=forking(nginx 가 자식을 포크하고 부모는 종료), PIDFile, 안전한 재시작을 위한 ExecStartPre 의 nginx -t 입니다.
ExecReload 는 kill -HUP 으로 무중단 설정 재적용을, ExecStop 은 kill -QUIT 으로 처리 중인 연결을 끝낸 뒤 종료합니다.
firewall-cmd 는 포트 번호 대신 서비스 이름(http·https)으로 열 수 있습니다. 서비스 이름은 /usr/lib/firewalld/services/ 에 정의된 포트(80·443)로 매핑됩니다.
--permanent 로 등록한 규칙은 --reload 를 해야 실제로 적용됩니다. --permanent 없이 연 규칙은 재부팅하면 사라집니다.
RHEL 계열은 SELinux 가 기본으로 nginx 프로세스가 임의의 백엔드로 네트워크 연결을 여는 것을 막습니다. httpd_can_network_connect 불리언을 켜야 프록시로 Tomcat 에 연결할 수 있습니다.
정적 파일만 서비스하고 프록시를 쓰지 않는다면 이 불리언은 필요 없습니다. 이 시리즈는 다음 레슨에서 바로 프록시를 설정하므로 미리 켜 둡니다.
설정을 바꾼 뒤에는 항상 nginx -t 로 문법을 검사합니다. 통과하지 못한 설정으로 reload 하면 워커가 새 설정을 못 읽고 옛 설정으로 계속 돌거나 최악의 경우 서비스가 멈춥니다.
이 레슨은 실제 nginx 바이너리가 없어 중괄호 짝이 맞는지 awk 로 먼저 확인하고, nginx -t 는 명령 흐름만 보여줍니다. 서버에서는 이 검사를 생략하지 않습니다.
nginx -v 는 버전 한 줄만 보여주고, nginx -V 는 버전에 더해 configure 할 때 넣은 옵션 전체를 보여줍니다. 설치가 의도한 모듈로 됐는지는 -V 로 확인합니다.
기동 뒤에는 curl 로 응답 코드를 확인합니다. 200 이 아니면 journalctl -u nginx 나 error.log 로 원인을 찾습니다.