SSL Reverse Proxy with Lets Encrypt

    版本為 01:09, 27 Dec 2024

    到這個版本。

    返回到 版本存檔.

    查閱目前版本

    說明

    故事情境:我有一個主要網站 Main Web 是用 Nginx 架設,目前有以下需求需要完成:

    1. 租用另一部主機並建置 Reverse Proxy 服務,目的是避免主要網站主機直接曝露在公用網路上。
      注意:基於安全理由,主網站與 Reverse Proxy 應該是在不同的主機並且是不同的 IP 位址。
    2. 網站需要使用 Let's Encrypt 憑證的 SSL 加密,所以架構是
      Main Web -----[HTTP]----- Reverse Proxy -----[HTTPS]----- Client
    3. 防火牆設定原則
      • Main Web (RAIDA) 阻擋所有外部存取,僅開放來自 Reverse Proxy 的 HTTP 連線
      • Reverse Proxy 開放外部所有連線可存取 HTTPS
    4. 使用 docker 環境建置 Reverse Proxy 系統,包括 Lets Encrypt 憑證自動更新

    Reverse Proxy with Nginx

    新增 docker-compose.yml

    version: "2"
    
    services:
      nginx-proxy:
        restart: always
        image: nginx
        container_name: nginx-proxy
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - "/docker_vol/nginx-proxy/etc-nginx/conf.d:/etc/nginx/conf.d"
          - "/docker_vol/cert-letsencrypt:/etc/letsencrypt"   
          - "/docker_vol/data-letsencrypt:/data/letsencrypt"
    

    建立需要的目錄

    mkdir -p /docker_vol/nginx-proxy/etc-nginx/conf.d
    mkdir -p /docker_vol/cert-letsencrypt
    mkdir -p /docker_vol/data-letsencrypt  

    新增 Nginx 設定檔
    /docker_vol/nginx-proxy/etc-nginx/conf.d/proxy.conf

    server {
        listen 80;
        server_name _;
    
        location / {
            proxy_pass http://your-main-web-ip;
            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_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    http://your-main-web-ip 這裡填入主網站的 IP 位址

    啟動nginx-proxy 服務 (使用 docker-compose)

    第一次啟動,系統會自動新增與佈署需要的 containers

    #> docker-compose up -d
    

    佈署後檢查服務狀態

    #> docker-compose ps
    
        Name             Command          State                    Ports                  
    -------------------------------------------------------------------------------------
    nginx-proxy   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
    

    TIPs:

    如果一直無法正常啟動服務,試著先將 proxy.conf 移除,然後啟動試試;如果啟動正常,再將 proxy.conf 回復後重新啟動。

    Lets Encrypt

     

    Powered by MindTouch Core