[Docker] Docker compose로 Django, Nginx 띄우기 - 2 (nginx, nginx.conf, default.conf)

JinUk Lee·2024년 10월 11일
0

Docker

목록 보기
7/10
post-custom-banner

nginx

nginx는 가벼우면서도 성능이 뛰어난 웹 서버이다.

특히, 리버스프록시 구축을 위해 자주 사용한다.

프록시, 리버스 프록시

프록시라는 말은 네트워크를 공부하다보면 자주 듣게되는 단어이다.

프록시는 클라이언트와 서버 사이를 이어주는 중계 역할을 하는 서버이다.

굳이 중간에 프록시 서버를 경유하는 이유는 보안, 성능, 안정성 등이 있다.

프록시 서버는 포워드 프록시, 리버스 프록시로 나뉜다.

포워드와 리버스 프록시의 차이점은 아래의 그림과 같다.

포워드 프록시

포워드 프록시는 클라이언트 바로 뒤에 위치한다.

클라이언트의 요청을 받아 인터넷을 통해 외부 서버에서 데이터를 가져와서 요청에 응답한다.

이러한 특성때문에 주로 정부, 기업같은 곳에서 사용한다.

클라이언트의 통신을 포워드 프록시 서버에서 관리하므로 클라이언트의 특정 사이트 접근을 막을 수 있다.

또한, 포워드 프록시 서버를 통해 요청하므로 클라이언트는 인터넷에서 자신의 IP 주소를 역추적해도 정체를 파악하기 어려워 보안 효과가 있다.

리버스 프록시

리버스 프록시는 웹서버/WAS 앞에 있다.

리버스 프록시는 클라이언트로부터 요청이 오면 요청에 맞는 웹서버로 전달해주는 역할을 한다.

포워드 프록시와는 반대로 클라이언트는 웹서버로 직접적인 접근이 불가능하여 웹서버를 보호하는 역할을 할 수 있으며,

리버스 프록시 뒤에 여러개의 WAS를 두고 사용자의 요청을 분산시켜 서버의 트래픽을 분산시켜 부하를 방지할 수 있다.

nginx.conf, default.conf

다시 nginx로 돌아와서, 루트 폴더에 nginx 폴더를 만들고 Dockerfile을 만들어준다.

그리고 nginx 관련 파일을 세팅해야하는데

nginx 세팅을 위해 블로그를 돌아다니다보면 어떤 식으로 코드를 작성해야되는지 상당히 헷갈린다.

nginx.confdefault.conf 둘다 만드는 것도 있고, default.conf 하나만 만드는 것도 있다.

어떤 블로그는 project.conf 만 작성한다.

도대체 이 두 파일이 어떤 역할이길래 포스팅마다 방법이 다를까? 두 개의 차이점 및 세팅법을 알아보자

nginx.conf

nginx.conf는 nginx 기본 설정 파일이고 default.confnginx.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 파일 이름을 변경해서는 안된다.

default.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.confdefault.conf를 작성하는 것은 설정을 바꾸기 위함인 것인데

만약 기존의 nginx.conf를 그대로 쓴다면 서버 설정만 바꾸는 .conf 파일만 작성하는 것이고

nginx의 설정도 바꿔야 한다면 nginx.conf도 새로 작성하는 것이다.

그리고 작성한 파일들은 docker-compose.ymlvolumes 를 통해 마운트하거나 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 파일을 복사하는 도커파일이다.

profile
개발자 지망생
post-custom-banner

0개의 댓글