서버 인증서 적용기3. Nginx reverse proxy설정하기

1. 개요

드디어 발급한 서브도메인에 각각 인증서를 적용하고, nginx로 리버스 프록시 서버를 설정해 실제 artifactory 및 gitlab으로 접속할 수 있도록 만들 예정이다.

어떻게 해야하는지 아예 모르는 상태에서 시작했더니 이 때 가장 많이 헤맸었다…T.T nginx 대신 apache를 사용할 수도 있겠지만, 좀 더 최근에 개발되었고, 대규모 비동기 처리에 적합한 nginx를 사용해 처리하고자 했다.


2. Reverse proxy?

img.png 먼저 리버스 프록시는, 클라이언트와 실제 서비스 서버 간에 중계하는 역할을 한다.

21.11.11.11서버의 8080포트로는 gitlab이, 7070포트로는 artifactory가 서비스되고 있다고 하자.

리버스 프록시 서버가 없다면 각각 21.11.11.11:8080, 21.11.11.11:7070으로 접속해야 했겠지만, 서버가 있다면 8080과 7070포트가 오픈되어있지 않더라도 각각의 서브도메인에 맞게 gitlab.kello.comartifactory.kello.com로 실제 서비스에 연결해줄 수 있다.

또한, http://gitlab.kello.com로 접속하면 강제로 https://gitlab.kello.com로 리다이렉트하게 만들 수도 있다.

그 밖에도 로드밸런싱 및 캐싱 등도 가능한데, 해당 챕터에서는 그에 관련된 내용은 다루지 않을 예정이다.


3. nginx설정

2.1. nginx설치

Nginx 공식문서를 참고해 nginx를 설치한다.

http및 https로 접속할 수 있게 할 것이므로, 서버의 80, 443방화벽이 열려있는 상태여야 한다.

apt update
apt install nginx


2.2. nginx.conf설정

worker_processes 3;

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;
        listen [::]:80;

        return 301 https://$host$request_uri;
    }
}

/etc/nginx/nginx.conf에서 실제 nginx설정을 변경할 수 있다.

먼저, http로 접속했을 시 강제로 https로 리다이렉트하도록 설정한다. 이렇게하면 해당 서버의 80포트로 접속하게되면, 요청한 uri를 443으로 접속하도록 바꾸어준다.


2.3. gitlab설정

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name gitlab.kello.com;

        ssl_certificate      /etc/letsencrypt/live/gitlab.kello.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/gitlab.kello.com/privkey.pem;

        ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 5m;

        location / {
            client_max_body_size 0;
            gzip off;

            proxy_read_timeout      300;
            proxy_connect_timeout   300;

            proxy_redirect          off;
            proxy_request_buffering off;
            proxy_buffering off;

            proxy_http_version 1.1;

            proxy_set_header    Host                $http_host;
            proxy_set_header    X-Real-IP           $remote_addr;
            proxy_set_header    X-Forwarded-Ssl     on;
            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Proto   $scheme;

            proxy_pass http://127.0.0.1:1111;
        }
    }

이 부분에서 첫 화면 외에는 제대로 프록시되지 않아 고생을 했는데, gitlab포럼에 올라온 글을 보고 제대로 설정할 수 있었다.

상단의 server설정을 2.2의 nginx.conf의 http블록에 추가한다.

gitlab.kello.com로 접속하면 이전 챕터에서 발급한 인증서를 적용하고, 해당 서버의 1111포트에서 운영 중인 서비스로 접속하도록 설정한 내용을 담고 있다.


2.4. artifactory설정

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name artifactory.kello.com;

        ssl_certificate      /etc/letsencrypt/live/artifactory.kello.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/artifactory.kello.com/privkey.pem;

        if ($http_x_forwarded_proto = '') {
            set $http_x_forwarded_proto  $scheme;
        }
        rewrite ^/$ /ui/ redirect;
        rewrite ^/ui$ /ui/ redirect;
        chunked_transfer_encoding on;
        client_max_body_size 0;

        location / {
            proxy_read_timeout  2400s;
            proxy_pass_header   Server;
            proxy_cookie_path   ~*^/.* /;
            proxy_pass          http://127.0.0.1:13009;
            proxy_next_upstream error timeout non_idempotent;
            proxy_next_upstream_tries    1;
            proxy_set_header    X-JFrog-Override-Base-Url $http_x_forwarded_proto://$host:$server_port;
            proxy_set_header    X-Forwarded-Port  $server_port;
            proxy_set_header    X-Forwarded-Proto $http_x_forwarded_proto;
            proxy_set_header    Host              $http_host;
            proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;

            location ~ ^/artifactory/ {
                proxy_pass    http://127.0.0.1:8081;
            }
        }
    }

다음으로 artifactory.kello.com으로 접속하면 해당 서버의 8081포트로 접속할 수 있도록 설정한다.

역시 이전 챕터에서 발급받은 인증서를 적용해주었으며, 나머지는 공식 문서의 설정을 참고했다.


2.5. nginx기동

2.5.1. nginx설정 유효성 체크
nginx -t

앞서 설정한 내용이 유효한지 체크한다. 설정이 유효해야 정상적으로 서버가 기동된다.


2.5.1. nginx기동
systemctl start nginx

nginx를 기동한다.

nginx가 기동되면서 80과 443포트가 오픈된다. 드디어 발급한 서브도메인을 통해 원하는 서비스로 접속할 수 있다. 관련 접속 로그는 아래와 같이 확인할 수 있다.

  • nginx접속로그 : /var/log/nginx/access.log
  • nginx실패로그 : /var/log/nginx/error.log


3. 결론

이렇게 nginx reverse proxy서버를 구축했다.

일단 프록시 설정은 완성되었으나, gitlab의 일부 화면에서 이전 ip를 물고있다거나 https git clone이 실패하는 현상이 있었다. 다음 챕터에서는 해당 이슈의 트러블슈팅 과정을 정리할 예정이다.