Dev/Web

Nginx SSL 설정

newtype 2022. 11. 16. 09:41

개인 프로젝트 공간을 Lightsail로 옮기면서 Apache에서 Nginx로 변경했습니다. 옮기고 나니 저사양에서는 Nginx가 훨씬 좋았습니다. 설정도 간단하고, 성능도 좋아졌네요.
Nginx에서 SSL 설정 방법을 설명합니다.

개인 환경

  • static html 페이지 몇 개가 노출 되야 합니다.
  • node.js로 8080 포트로 서비스가 올라갑니다.
  • grafana가 3000 포트로 올라갑니다.

SSL 기본 설정

server_name에 도메인을 넣고, static html 노출을 위해 web root 경로를 지정합니다.
키 파일을 지정하고, favicon 관련 불필요한 설정 off 했습니다.

server {
    server_name  mydomain.com;
    listen 443 ssl;

    location / {
        root   /home/bitnami/www;
        index  index.html index.htm;
    }

    ssl_certificate /home/bitnami/letsencrypt/certificates/mydomain.com.crt;
    ssl_certificate_key /home/bitnami/letsencrypt/certificates/mydomain.com.key;

    location = /favicon.ico {
        return 204;
        access_log     off;
        log_not_found  off;
    }
}

WebSocket 가상 호스트

node 8080 서비스는 추가로 서브 도메인 인증서를 발급받아 가상 호스트로 연결 했습니다.

websocket을 사용하는데, WebSocket connection to 'wss://node.mydomain.com/socket.io/?EIO=4&transport=websocket&sid=zn6gwaXKvWzDK35JAAA6' failed: 에러가 발생 합니다.
이를 해결하기 위해, proxy_http_version, proxy_set_header 설정을 몇 가지 추가합니다.

server {
    server_name  node.mydomain.com;
    listen 443 ssl;

    location / {
        proxy_pass   http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }


    ssl_certificate /home/bitnami/letsencrypt/certificates/node.mydomain.com.crt;
    ssl_certificate_key /home/bitnami/letsencrypt/certificates/node.mydomain.com.key;
}

Grafana 가상 호스트

grafana를 docker-compose로 설치해서 사용중인데, datasource PostgreSQL Connection 설정시 origin not allowed 에러가 발생합니다.
이를 해결하기 위해, proxy_set_header 설정을 몇 가지 추가합니다.

server {
    server_name  teslamate.mydomain.com;
    listen 443 ssl;

    location / {
        proxy_pass   http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 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;
    }

    ssl_certificate /home/bitnami/letsencrypt/certificates/teslamate.mydomain.com.crt;
    ssl_certificate_key /home/bitnami/letsencrypt/certificates/teslamate.mydomain.com.key;
}
반응형