본문 바로가기
Linux

Nginx - Reverse Proxy로 활용하기

by 올엠 2022. 12. 25.
반응형

Docker 환경에서 모듈별로 나누어 관리하는 것이  관리의 편의성을 높이기 된다.

역활 별로 시스템 구성을 나누어 관리하면, 유지보수 및 관리 편의성이 좋기 때문에,  Nginx 를 이용할 경우 Reverse Proxy를 이용해서 외부에서 연결되는 접점을 별도로 설정하는 방법에 대해서 정리보도록 하겠다.

 

Nginx는 Reverse Proxy로 구성하는 방법은 기본적으로 location에 proxy_pass를 기입하여 구성할 수 있다.

여기에 추가적으로 Proxy 관련된 옵션을 이용하여 보다 Proxy 설정을 할 수 있다.

그리고 SSL 인증서를 구성한 경우 인증서 경로를 설정해 주어야 하는데,  Certbot에서 구성시 확인되 인증서 파일 정보를 기입해 주면 된다.

무료 SSL 인증서인 Lets Encrypt 관련된 내용은 아래를 참고하자.

Ubuntu - Let's Encrypt으로 Nginx에 무료 SSL 적용 (asecurity.dev)

 

Ubuntu - Let's Encrypt으로 Nginx에 무료 SSL 적용

SSL 인증서는 구매하여 사용하기에는 큰 대형 사이트가 아니라면, 일반적인 작은 사이트 혹은 프리랜서용 사이트라면 부담이 클 수 있다. 이를 해결해 주는 것이 바로 Let's Encrypt 에서 제공하는

asecurity.dev

 

만약 Certbot으로 Nginx의 환경설정을 자동 구성한 경우 /etc/nginx/sites-enabled/default  에 기본적인 환경설정 파일이 생성되며, location에 proxy_pass 항목을 추가하도록 하자.

아래는 Reverse Proxy 서버의 해당 파일의 443 port에 대한 내용이다. 80 포트는 443으로 자동 Redirect하도록 구성한 경우 별도로 proxy_pass를 추가할 필요가 없다.

/etc/nginx/sites-enabled/default

server {

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
    server_name geoip.one; # managed by Certbot


        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                proxy_pass http://10.0.0.4:3000;
                try_files $uri $uri/ =404;
        } 
 		# pass PHP scripts to FastCGI server
        #
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
        #       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #       deny all;
        #}


    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/geoip.one/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/geoip.one/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = geoip.one) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80 ;
        listen [::]:80 ;
    server_name geoip.one;
    return 404; # managed by Certbot


}

정상적으로 구현하였다면, Nginx를 재시작하여 정상적으로 적용되었는지 확인할 수 있다.

sudo systemctl restart nginx

동작 확인을 위해서 내부 웹 서버에 Nginx 기본 파일인 /var/www/html/에 위치해 있다. Ubuntu 기준으로 /var/www/html/index.nginx-debian.html 이며 이 파일를 수정하여 테스트 해보도록 하자.

정상적으로 내부 Web 서버의 웹 페이지가 표시된다면 Reverse Proxy가 잘 작동하고 있는 것을 알 수 있다.

반응형