가벼우면서 높은 성능을 자랑하는 웹 서버이다. 그리고 프록시 서버 형태로 사용가능하고 인증서를 통해 ssl 처리도 해줄수 있기 때문에 선택했다.
SSl를 적용하기 이전에 개발 서버에 nginx.conf를 정의해서 localhost에서 사용했다. 인증서를 발급후에는 배포 서버에 nginx.conf 설정을 정의하려고 하는데 제대로 동작하지 않았다.
worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream app {
server java-api-server:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://app;
}
}
}
기존에 docker에서 사용한 nginx.conf 이다. 작성한 파일을 ./nginx/nginx.conf:/etc/nginx/nginx.conf 경로로 바인드 마운트해서 사용했다.
하지만 인증서 작성시에 443을 정의하고 관련된 설정을 해줘야 하는데 인터넷에서 찾은 default.conf 파일을 찾아서 nginx.conf에 적용했더니 동작하지 않았다.
upstream backend {
server java-api-server:8080;
}
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name mecastudy.com;
ssl_certificate /etc/letsencrypt/live/mecastudy.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mecastudy.com/privkey.pem;
location / {
proxy_pass http://backend;
proxy_redirect off;
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-Host $server_name;
}
}
왜 동작하지 않은 걸까? 조금 형태의 차이점은 있지만 이해가 되지 않았다.
nginx.conf는 nginx의 기본 설정을 담당한다.
default.conf은 nginx.conf에서 include해서 사용된다. 서버 설정 관련 파일이며 default2.conf, default3.conf는 여러 개의 파일을 추가해서 서버 관련 설정을 추가로 포함시킬 수 있다.
listen : 해당 포트로 들어오는 요청을 해당 server {} 블록의 내용에 맞게 처리하겠다는 것을 뜻한다.
server_name : 호스트 이름을 지정한다. 가상 호스트가 있는 경우 해당 호스트명을 써넣으면 된다. 만약 로컬에서 작업하고 있는 내용을 nginx를 통해 띄우려고 하는 경우에는 localhost라고 적으면 된다.
error_page : 요청결과의 http 상태코드가 지정된 http 상태코드와 일치할 경우, 해당 url로 이동한다. 보통 403, 404, 502 등의 에러처리를 위해 사용한다.
location / : 처음 요청이 들어왔을 때 ( server_name이 127.0.0.1인 경우 -> 127.0.0.1로 요청이 들어왔을 때 ) 보여줄 페이지들이 속해있는 경로와 초기 페이지인 index를 지정해준다. / url로 접속했을 경우 index.html, index.htm로 정의된 파일을 보여준다.
ssl_certificate: 생성된 인증서 설정 경로
upstream: proxy_pass 지시자를 활용해 nginx가 받은 요청을 넘겨 줄 서버를 정의
서로 사용하는 용도와 목적이 다르다. nginx.conf에서 서버 설정 파일을 분리하기 위해서 사용되는 것이 default.conf인데 이를 그대로 nginx.conf에 설정하면 당연히 에러가 난다. http 블록 내에 서버를 정의하는 방법을 사용하는 방법도 있을 수 있지만 서버 설정 파일은 꽤나 길고 복잡할 수 있기 때문에 default.conf를 사용하는 것이 좋을 수 있다.