nginx는 가벼우면서도 성능이 뛰어난 웹 서버이다.
특히, 리버스프록시 구축을 위해 자주 사용한다.
프록시라는 말은 네트워크를 공부하다보면 자주 듣게되는 단어이다.
프록시는 클라이언트와 서버 사이를 이어주는 중계 역할을 하는 서버이다.
굳이 중간에 프록시 서버를 경유하는 이유는 보안, 성능, 안정성 등이 있다.
프록시 서버는 포워드 프록시, 리버스 프록시로 나뉜다.
포워드와 리버스 프록시의 차이점은 아래의 그림과 같다.
포워드 프록시는 클라이언트 바로 뒤에 위치한다.
클라이언트의 요청을 받아 인터넷을 통해 외부 서버에서 데이터를 가져와서 요청에 응답한다.
이러한 특성때문에 주로 정부, 기업같은 곳에서 사용한다.
클라이언트의 통신을 포워드 프록시 서버에서 관리하므로 클라이언트의 특정 사이트 접근을 막을 수 있다.
또한, 포워드 프록시 서버를 통해 요청하므로 클라이언트는 인터넷에서 자신의 IP 주소를 역추적해도 정체를 파악하기 어려워 보안 효과가 있다.
리버스 프록시는 웹서버/WAS 앞에 있다.
리버스 프록시는 클라이언트로부터 요청이 오면 요청에 맞는 웹서버로 전달해주는 역할을 한다.
포워드 프록시와는 반대로 클라이언트는 웹서버로 직접적인 접근이 불가능하여 웹서버를 보호하는 역할을 할 수 있으며,
리버스 프록시 뒤에 여러개의 WAS를 두고 사용자의 요청을 분산시켜 서버의 트래픽을 분산시켜 부하를 방지할 수 있다.
다시 nginx로 돌아와서, 루트 폴더에 nginx
폴더를 만들고 Dockerfile
을 만들어준다.
그리고 nginx 관련 파일을 세팅해야하는데
nginx 세팅을 위해 블로그를 돌아다니다보면 어떤 식으로 코드를 작성해야되는지 상당히 헷갈린다.
nginx.conf
와 default.conf
둘다 만드는 것도 있고, default.conf
하나만 만드는 것도 있다.
어떤 블로그는 project.conf
만 작성한다.
도대체 이 두 파일이 어떤 역할이길래 포스팅마다 방법이 다를까? 두 개의 차이점 및 세팅법을 알아보자
nginx.conf
는 nginx 기본 설정 파일이고 default.conf
는 nginx.conf
를 통해 include되는 서버 설정 파일이다.
즉, nginx.conf
는 nginx 전체의 설정, default.conf
는 서버 하나의 설정이라고 생각하면 된다.
최신 nginx 이미지를 다운받아서 nginx.conf
파일을 보면 아래와 같다.
(보통 nginx.conf
는 /usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx 경로 중 하나에 있다.)
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
중요한 점은 마지막 줄에서 include를 통해 conf.d
폴더의 .conf
파일을 모두 불러온다는 점이다.
또한, 기본 설정 파일이므로 nginx.conf
파일 이름을 변경해서는 안된다.
그리고 nginx 폴더에는 conf.d
라는 폴더도 같이 있는데, 해당 폴더는 default.conf
처럼 .conf
파일을 모아두는 폴더이다. nginx 이미지를 다운받아보면 해당 폴더에 있는 default.conf
를 찾을 수 있고 아래와 같다.
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
default.conf
는 말그대로 .conf
파일의 디폴트로 작성된 파일이고, nginx.conf을 통해 불러오기만 한다면 project.conf
, test.conf
등등 이름을 바꿔서 사용할 수 있다.
즉, nginx.conf
나 default.conf
를 작성하는 것은 설정을 바꾸기 위함인 것인데
만약 기존의 nginx.conf
를 그대로 쓴다면 서버 설정만 바꾸는 .conf
파일만 작성하는 것이고
nginx의 설정도 바꿔야 한다면 nginx.conf
도 새로 작성하는 것이다.
그리고 작성한 파일들은 docker-compose.yml
의 volumes
를 통해 마운트하거나 Dockerfile
으로 COPY 하는 방법을 통해 적용시킬 수 있다.
그래서 결국 어떻게 사용할건가 하면 nginx.conf
는 그대로 두고 .conf
파일만 작성하기로 했다.
.conf
파일을 만들고 이름은 project
라고 붙였다. (이름은 자유롭게 설정해도 된다)
# project.conf
server {
listen 80;
server_name example.org www.example.org *.example.org;
location / {
proxy_pass http://backend:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
listen
은 해당 포트로 들어오는 내용을 아래의 설정에 맞게 처리하겠다는 옵션이다.
server_name
은 호스트 이름을 지정하는 곳이다. 쉽게 생각하면 해당 주소로 접근하면 아래의 proxy_pass
로 넘겨준다는 의미이므로 만들어둔 웹페이지의 주소를 작성하면 된다.
proxy_pass
는 요청이 들어오면 해당 주소로 보내겠다는 옵션이다. 여기서 backend라고 작성한 부분은 컨테이너의 이름을 적으면 된다.
그리고 Dockerfile
을 아래와 같이 만들었다.
# Dockerfile
FROM nginx
COPY project.conf /etc/nginx/conf.d
간단하게 conf.d 폴더에 만든 .conf
파일을 복사하는 도커파일이다.