nginx 주요 설정 파일 및 디렉토리
/etc/nginx/
: nginx 서버가 사용하는 기본 설정이 저장된 루트 디렉토리에 해당./etc/nginx/nginx.conf
: nginx의 기본 설정파일로, 모든 설정에 대한 진입점에 해당. 또한 디렉토리에 위치한 모든 설정 파일을 포함하는 최상위 http 블록을 갖고 있음./etc/nginx/conf.d/
: 기본 HTTP 서버 설정 파일을 포함. nginx 설정은include
구문을 활용해 구조화함으로써 각 설정 파일을 간결하게 유지할 수 있다. 참고로, 몇몇 패키지 저장소에서 배포되는 nginx는 설치 시conf.d
디렉토리 대신site-enabled
디렉토리가 있고,symlink
를 통해site-available
디렉토리에 저장된 설정 파일들이 연결돼 있을 수 있다./var/log/nginx/
: nginx의 로그가 저장되는 디렉토리에 해당.access.log
,error.log
파일에 nginx 서버가 수신한 개별 요청에 대한 로그와 오류 발생 시 이벤트 내용을 저장한다.
기본 명령어 모음
nginx -v
: nginx 버전 정보 확인.nginx -V
: nginx 버전 정보 및 빌드 정보와 nginx 바이너리에 포함된 모듈을 보여주는 설정 인숫값을 확인.nginx -t
: nginx 설정 테스트nginx -T
: nginx 설정 테스트 후 결과를 화면에 보여줌.nginx -s reload
: nginx 서버를 중지하지 않고 설정 리로드. 패킷 손실 없이 설정을 리로드한다.sudo systemctl status nginx
: Ubuntu Linux 환경에서 nginx 서버의 현재 상태 확인.sudo systemctl start nginx
: nginx 서버 실행sudo systemctl restart nginx
: nginx 서버 재실행
Serving static contents
React/Vue와 같은 SPA, CSR FE App을 기준으로 정적 파일을 서빙한다면 기본 설정은 아래와 같다.
- FE App의 빌드 결과 산출물을 nginx 정적 파일 경로에 매칭시켜 서빙한다. →
root
경로를 적절하게 변경해도 좋다. try_file
구문 상$url
,$url/
은 FE App 빌드 결과 번들링된 파일을 script 형태로 요청하는 것에 대해 동적으로 경로를 찾아 갈 수 있도록 설정한다 보면 된다.
server {
listen 80 default.server;
server_name www.example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm
try_file $url $url/ index.html
}
}
proxy pass
server {
listen 80;
server_name localhost;
# BE Server
location ~ ^/(api|actuator) {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_pass http://localhost:8080;
}
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri /index.html;
}
root /var/www/html;
# Add index.php to the list if you are using PHP
# index index.html index.htm index.nginx-debian.html;
location /favicon.ico {
return 204;
access_log off;
log_not_found off;
}
}
FE와 BE를 별도로 띄운다면 위와 같은 location
처리 및 proxy_pass
를 사용한다. CORS나 기타 인증서 처리는 이 글에선 논외로 한다.
HTTPS Redirect
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
SSL/TLS offloading을 적용하는 경우 다른 문제겠지만, 보통은 IPv4, IPv6를 가리지 않고 80 port로 요청을 받은 뒤 301 응답으로 동일한 호스트명과 URI에 대해 HTTPS로 요청하도록 리다이렉트 시킨다.
nginx 설정 파일이 적용되지 않았을 때?
보통 설정 파일에 대한 symlink가 올바르게 적용됐는지를 확인해봐야 한다.
site-available
, site-enabled
같은 경로들이 간혹 기본 경로와 매칭이 안돼서 발생하는 경우가 있다.
이 경우, 아래와 같이 순서대로 지정해보자.
기타 check list
- 해당 서버 내 방화벽 설정은 어떻게 되어 있는지 확인할 것.
- 해당 서버가 IPv4, IPv6 모두 허용하는지 확인할 것.
- Redirect 처리나 CORS 적용 시 HTTP Request Header가
proxy_pass
전후로 유실되어 요청이 들어오는건 아닌지 확인할 것. - 백엔드 API의 네트워크 비용 최적화를 고려한다면
gzip
응답 처리도 고려해볼 것.