목차
Nginx
Nginx는 HTTP 요청을 받아 정적 파일을 제공하거나 다른 애플리케이션 서버로 전달하는 웹 서버이자 역방향 프록시다. 마스터 프로세스가 설정과 워커를 관리하고, 워커 프로세스가 이벤트 기반으로 연결을 처리한다. 동시 연결 처리에 유용하지만 실제 성능은 요청 종류, 파일 I/O, 업스트림 서버와 설정에 따라 달라진다.
우분투 설치
sudo apt update
sudo apt install nginx
nginx -v
sudo systemctl status nginx
MAC 설치
brew install nginx
nginx -v
주요 설정파일 디렉터리
-
/etc/nginx/
엔진엑스 서버가 사용하는 기본 설정이 저장된 루트 디렉터리로 이곳에 저장된 설정파일의 내용에 따라 동작. (mac os는 /usr/local/etc/nginx/ 에 위치)
-
/etc/nginx/nginx.conf 기본 설정파일로 모든 설정에 대한 진입점이며 최상위 http 블록을 가지고 있다. 또한 worker process count. tuning, 동적 모듈 적재와 같은 Global 설정항목 및 엔진엑스의 세부설정 파일에 대한 참조를 지정한다.
-
/etc/nginx/conf.d/
HTTP 서버의 기본 설정파일로 nginx.conf 파일이 가진 최상위 http 블록에 포함
-
/var/log/nginx/
엔진엑스의 로그가 저장되는 디렉터리 access.log, error.log가 있다.(mac os는 /usr/local/var/log/nginx)
엔진엑스 명령어
-
nginx -h
nginx 도움말
-
nginx -v
엔진엑스 버전 정보
-
nginx -V
엔진엑스의 버전 정보 및 빌드 정보, 바이너리에 포함된 모든 설정 정보 값
-
nginx -t
엔진엑스 설정을 시험
-
nginx -T
엔진엑스 설정을 시험하고 결과를 화면에 보여줌
-
nginx -s stop
nginx 서비스 종료
-
ps -ef | grep nginx
nginx 실행중인지 확인
무중댠으로 설정 리로드
- nginx -s reload
해당명령어를 이용하면 서버를 중지하지 않고 리로드 신호를 보내어 다시 읽어들이도록 지시한다.
정적 콘텐츠 서비스하기
해당설정은 80포트를 이용해 root의 html/경로에 저장된 정적 콘텐츠를 제공
## server블록을 선언하여 엔진엑스가 처리할 새로운 컨테스트를 정의
server {
## 80포트로 들어오는 요청을 수신하고 기본컨텍스트가 되도록 default_server 매개변수를 사용
listen 80 default_server;
## 서버 호스트명 도메인
server_name localhost;
## location블록은 URL 경로를 기반으로 하며 요청된 적합한 location 블록은 찾아낸다.
location / {
## root 지시자에 정의된 경로를 수신한 URI 값을 합쳐 요청된 파일을 찾는다.
root html;
## index 지시자는 URI에 더이상 참고할 경로 정보가 없을 때 nginx가 기본 파일 또는 파일 목록을 알려줌
index index.html index.htm;
}
}
요청이 처리되는 위치
클라이언트가 GET /images/logo.png를 보내면 Nginx는 먼저 listen과 server_name으로 가상 서버를 고르고, URI에 맞는 location을 찾는다. root 지시어는 해당 요청 URI를 파일 경로에 덧붙인다. 위 예에서 root html은 Nginx의 설정 기준 위치에 따라 해석되는 상대 경로라 배포 환경에서는 절대 경로를 쓰는 편이 확인하기 쉽다. index index.html은 디렉터리 요청에서 기본으로 찾는 파일 이름을 뜻하며 파일 목록 공개를 자동으로 의미하지 않는다.
flowchart LR C[클라이언트] --> N[Nginx의 server 선택] N --> L[location 선택] L -->|정적 파일| F[파일 시스템] L -->|애플리케이션 요청| A[업스트림 서버] F --> C A --> N
다음은 /srv/www/site에 정적 파일이 있고 애플리케이션이 같은 호스트의 127.0.0.1:8080에서 듣는 예다. 공개 사이트에서는 HTTPS와 실제 도메인, 접근 제어 정책을 별도로 설정해야 한다.
server {
listen 80;
server_name example.test;
root /srv/www/site;
location /assets/ {
try_files $uri =404;
}
location /api/ {
proxy_pass http://127.0.0.1:8080;
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_set_header X-Forwarded-Proto $scheme;
}
}
/assets/logo.png은 /srv/www/site/assets/logo.png에서 찾는다. try_files는 요청한 파일이 없으면 404를 반환한다. /api/users는 이 설정에서 업스트림으로 같은 URI가 전달된다. proxy_pass 값 끝에 /를 붙이면 URI 재작성 규칙이 달라질 수 있으므로 경로가 예상과 다르면 이 차이를 먼저 살핀다. X-Forwarded-* 헤더는 업스트림이 프록시 앞의 원래 요청 정보를 해석하는 데 쓰지만, 업스트림이 이 헤더를 무조건 신뢰하지 않도록 프록시 신뢰 범위를 지정해야 한다.
설정을 적용하고 검증하기
sudo nginx -t
sudo systemctl reload nginx
curl -i http://127.0.0.1/assets/logo.png -H 'Host: example.test'
curl -i http://127.0.0.1/api/health -H 'Host: example.test'
nginx -t가 실패하면 설정을 다시 읽히기 전에 오류의 파일과 줄 번호를 고친다. reload는 새 설정으로 워커를 교체해 기존 연결을 가능한 한 처리하며, 실패 시 기존 설정이 계속 동작할 수 있으므로 nginx -t와 실제 HTTP 응답을 모두 확인한다. 서버에서 curl은 되는데 외부에서 접속이 안 되면 방화벽·보안 그룹·DNS·포트 바인딩을 따로 점검한다.
| 관찰 | 먼저 확인할 지점 |
|---|---|
| 404 | server_name, 선택된 location, root와 실제 파일 경로 |
| 403 | 상위 디렉터리까지의 실행 권한, 파일 읽기 권한, 보안 정책 |
| 502 | 업스트림 프로세스와 주소·포트, Nginx 오류 로그 |
| 설정 수정 후 변화 없음 | nginx -t, 실제 로드한 설정 파일, reload 결과 |
nginx -T는 include된 설정을 함께 출력하므로 같은 포트를 듣는 다른 server 블록과 충돌할 때 유용하다. 배포판 패키지와 nginx.org 패키지, Homebrew는 기본 설정 경로가 다를 수 있다. 설치한 바이너리가 어느 설정을 읽는지 nginx -V의 --conf-path를 확인한다. 접근 로그와 오류 로그는 배포판 설정의 경로를 확인해 열람한다.