Published on

블로그 개발일지 5

Authors
  • avatar
    Name
    JaeHyeok CHOI
    Twitter
    none

Nginx와 SSL

나름 보안을 신경 쓰기 위하여 Nginx를 설치해서 내 블로그 서버를 리버스-프록시 설정을 해주고자 한다. 추후에는 이 블로그에 IoT 제어 기능하고 WebRTC를 통해서 IP 카메라 제어도 진행할 예정이다. 따라서 HTTPS 인증이 필요하며, 그렇기 위해서는 SSL 인증 처리도 해주어야 한다.

SSL 인증

우선 HTTPS 접속을 위하여 SSL 인증을 먼저 알아보았다.

프로세스를 확인하기 위해서 아래의 두 사이트를 참고했다.

Nginx SSL 인증서 설치/설정/적용 가이드 [Let's encrypt] 인증서 발급 및 갱신법

SSL 인증서 발급은 유료인데, Let's encrypt 에서는 SSL 인증을 무료로 제공하는 대신 3개월 마다 갱신해야 되도록 제공한다.

Let's Encrypt

let's encrypt의 SSL 인증서 발급 방법은 다음과 같다.

  1. Webroot
  2. Web Server
  3. StandAlone

이중에서 나는 Nginx 를 사용할 것이므로 Webserver 방법을 채택하였다.

내가 참고한 블로그에서는 certbot tool을 사용하는데, 찾아보니 2024 2월자로 certbot은 더 이상 windows beta support를 지원하지 않는다고 한다...

zoracon-Certbot engineer : Window installer에 대한 지원을 유지하기 위해서는 해당 팀의 꾸준한 지원이 필요한데, 상당한 시간이 걸릴 것으로 판단된다.

대안으로 WSL2를 사용하거나, win-acme 등의 옵션을 제안해주었지만, Nginx 설정을 마치고 돌아와도 될 것 같아 잠시 여기까지만 기록해두고 나중에 다시 SSL 인증에 관한 일을 시작하고자 한다.

Nginx 설치

내 웹 서버에 리버스-프록시로 Nginx를 실행하기 위해서 nginx.conf를 다음과 같은 설정을 해주었다.

# nginx.conf
worker_processes  auto;

error_log  logs/error.log;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       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  logs/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    upstream next-server {
        server localhost:3000;
    }

    server {
        listen 80;
        server_name #서버 주소;

        access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://next-server;
            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_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_cache_bypass $http_upgrade;
        }
    }

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

upstream 설정: 내 WAS를 의미한다. HTTP 요청이 들어온 정보를 상위국에 전달한다는 의미인 것 같다. 이와같이 nginx와 연결할 WAS를 지정해주며, 밑에 있는 server 설정에서 지정한 upstream을 할당해 주어 프록시 설정을 해주면 된다.

server 설정: nginx의 web server를 설정한다. listen 을 통해서 연결할 포트를 설정하며, server_name은 클라이언트가 접속하는 주소로 설정된다.

location 설정: server 설정 중 들어온 요청을 분기할 때 사용한다. 지금은 WAS가 하나이기 때문에 location / 밖에 없지만, 예를 들어서 myblog/chat 과 myblog/blog 의 url을 분기할 때 사용할 수도 있다.

error_logaccess_log는 각각 nginx 프로세스의 에러 및 시스템 로그와 요청 내용을 로그로 찍어내는 설정이다. nginx 내부에 log 폴더 밑으로 접근 및 에러에 대한 로그를 저장해준다.

방화벽 설정

윈도우에서는 방화벽을 열어줘야 외부에서 접속이 가능하다.

일반적으로 80포트의 인바운드 규칙은 닫혀있으므로 이 포트를 열어주어야 접속이 가능하다.

제어판에서 위 경로로 접근하여

허용되는 앱 및 기능에서 nginx 의 개인/공용을 체크하여 준다.

이후 방화벽 설정에 들어가 고급설정 클릭

인바운드 규칙 -> 새 규칙 -> 포트 선택 -> 특정 로컬 포트에 80 입력 해준 뒤 규칙 설명을 적은 후 저장한다.

방화벽 설정을 한 번 해본 적이 있었지만, 오랜만에 한 번 더 하려니 헷갈렸다. 또한, nginx 프로그램의 방화벽 설정도 열어주어야 외부에서 프록시 설정이 가능해진다. (이것 때문에 2시간 정도 날렸다.)

이제 외부에서 내 서버의 주소의 80포트로 접속을 해보면 내 블로그가 나온다!