新增 SSL 的設定方式

這是一個標準的 Apache 設定需求。為了達成你的目標,我們需要在 <VirtualHost> 層級限制主機名稱(ServerName),並在 <Directory> 層級限制存取來源。

你可以將設定修改如下:

Apache

<VirtualHost *:80>
    # 1. 只接受特定的網域名稱
    ServerName note.findrichard.com
    
    DocumentRoot /var/www/wordpress

    <Directory /var/www/wordpress>
        Options FollowSymLinks
        # 建議將 AllowOverride 設為 All 以確保 WordPress 的 .htaccess 正常運作
        AllowOverride Limit Options FileInfo
        DirectoryIndex index.php

        # 2. 存取控制:只允許來自本機與代理伺服器
        <RequireAny>
            Require ip 192.168.116.73
            Require local
        </RequireAny>
    </Directory>

    <Directory /var/www/wordpress/wp-content>
        Options FollowSymLinks
        <RequireAny>
            Require ip 192.168.116.73
            Require local
        </RequireAny>
    </Directory>
</VirtualHost>

關鍵修改說明:

  • ServerName note.findrichard.com: 這確保了當請求進入伺服器時,Apache 只會將針對該網域的請求交給這個 VirtualHost 處理。如果有人嘗試用 IP 直接存取,且這是唯一的設定檔,他們可能會看到錯誤或預設頁面(取決於你的預設主機設定)。
  • <RequireAny> 區塊:
    • Require ip 192.168.116.73: 明確允許你的代理伺服器。
    • Require local: 允許伺服器自身存取(這對某些內部 cron job 或健康檢查很有幫助)。
  • 安全性提醒: 如果你的 WordPress 位於代理伺服器(Proxy)後方,建議安裝並啟用 mod_remoteip 模組,這樣 WordPress 的日誌才能記錄到真實訪客的 IP,而不是永遠只顯示 192.168.116.73

修改後的步驟:

  1. 儲存設定檔。
  2. 執行 sudo apachectl configtest 檢查語法。
  3. 執行 sudo systemctl restart apache2 (或 httpd) 套用變更。

Gemini 說了

這次的錯誤訊息從 Timeout (連不到) 變成了 404 (找不到檔案),這是一個好消息!這代表外網已經可以連到你的 Nginx 了,只是 Nginx 沒去你指定的 /var/www/letsencrypt 目錄找檔案。

這通常是因為 Nginx 的 location 設定沒有生效,或者被其他的設定覆蓋了。請按照以下步驟修正:

1. 檢查 Nginx 設定檔 (最關鍵)

請確認你的 note.findrichard.com 設定檔中,location ^~ /.well-known/acme-challenge/ 是放在 server 區塊內,且優先權最高

請將該區塊修改如下(注意 root 的寫法):

Nginx

server {
    listen 80;
    server_name note.findrichard.com;

    # 確保這一段在最前面
    location ^~ /.well-known/acme-challenge/ {
        # 注意:這裡直接指向 /var/www/letsencrypt
        # 因為 Nginx 會自動把路徑補成 /var/www/letsencrypt/.well-known/acme-challenge/
        # 所以我們要把 root 改為上一層
        root /var/www/letsencrypt;
        default_type "text/plain";
        allow all;
        # 關閉快取,避免驗證失敗
        add_header Cache-Control "no-cache";
    }

    location / {
        proxy_pass http://192.168.116.76;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

2. 重新調整目錄結構 (配合 Nginx 的 root 邏輯)

Nginx 的 root 指令會把 URL 路徑拼接到後面。為了讓路徑正確,請執行:

Bash

# 建立完整的層級目錄
sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge/
# 給予權限
sudo chown -R www-data:www-data /var/www/letsencrypt
# 測試 Nginx 設定是否正確
sudo nginx -t
# 重新載入
sudo nginx -s reload

3. 自行手動測試 (通過後再跑 Certbot)

在跑 Certbot 之前,先自己產生一個檔案測試:

Bash

echo "find-richard-test" > /var/www/letsencrypt/.well-known/acme-challenge/test

然後在瀏覽器輸入:https://note.findrichard.com/.well-known/acme-challenge/test

  • 如果看到 “find-richard-test”: 代表路徑對了!可以跑下方的 Certbot 指令。
  • 如果還是 404: 代表你的 Nginx 設定檔可能有好幾個,或者有其他的 location 衝突了。

4. 正確的 Certbot 指令

測試成功後,請執行:

Bash

sudo certbot certonly --webroot -w /var/www/letsencrypt -d note.findrichard.com

💡 為什麼會 404?

在 Nginx 設定中,如果你寫 root /var/www/letsencrypt;,當請求 / .well-known/acme-challenge/abc 時,Nginx 實際會去找 /var/www/letsencrypt/.well-known/acme-challenge/abc。如果你的目錄下沒有這層子資料夾,就會報 404。

1. 修正 Nginx 設定檔

Nginx

# 第三個網域的設定
server {
    listen 80;
    server_name note.findrichard.com;

    # 確保這一段在最前面,處理 Let's Encrypt 驗證
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
        default_type "text/plain";
        allow all;
        add_header Cache-Control "no-cache";
    } # <--- 剛才漏掉的這個括號很重要!

    # 處理原本的網站轉發
    location / {
        proxy_pass http://192.168.116.76;
        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;
    }
}

2. 套用設定並檢查

請務必執行以下指令來確認語法是否正確:

Bash

# 檢查語法
sudo nginx -t

# 如果顯示 "syntax is ok", "test is successful",再重載
sudo nginx -s reload

3. 最後的目錄確認 (關鍵)

由於我們使用的是 root /var/www/letsencrypt;,請確認您的目錄結構如下(必須要有這兩層子目錄):

Bash

# 請執行這行確保目錄正確
sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge/

4. 再次執行 Certbot

現在 Nginx 應該能正確讀取檔案了,請執行:

Bash

sudo certbot certonly --webroot -w /var/www/letsencrypt -d note.findrichard.com

💡 成功後要做什麼?

一旦 Certbot 顯示 Congratulations!,代表憑證已下載完成。

  1. 您需要把 listen 80 改成 listen 443 ssl
  2. 加入 Certbot 給您的憑證路徑。

恭喜!看到 Successfully received certificate 代表最難的驗證關卡已經過了。現在憑證已經安全地儲存在你的 Nginx 中間主機上了。

最後一步,你需要修改 Nginx 設定檔,正式啟用 HTTPS (443 Port) 並將舊的 HTTP (80 Port) 導向加密連線。

1. 修改 Nginx 設定檔 (正式啟用 SSL)

請將 note.findrichard.com 的設定修改為以下架構:

Nginx

# HTTP 轉 HTTPS
server {
    listen 80;
    server_name note.findrichard.com;

    # 保留驗證路徑,方便未來自動續約
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
    }

    # 強制跳轉 HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

# HTTPS 設定
server {
    listen 443 ssl;
    server_name note.findrichard.com;

    # 憑證路徑 (使用剛才生成的路徑)
    ssl_certificate /etc/letsencrypt/live/note.findrichard.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/note.findrichard.com/privkey.pem;

    # 建議的 SSL 安全優化
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://192.168.116.76;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 關鍵:告知後端主機這是一個 HTTPS 請求
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

2. 套用設定

執行語法檢查並重新載入:

Bash

sudo nginx -t
sudo nginx -s reload

3. 測試與後續檢查

  • 開啟瀏覽器: 輸入 https://note.findrichard.com,應該會看到鎖頭圖標。
  • WordPress 設定: 如果後端是 WordPress,請進入後台「設定」>「一般」,將網址改為 https:// 開頭。
  • 自動續約測試: Certbot 已經幫你設好排程,但你可以執行這行指令測試看看是否能正常運作:Bashsudo certbot renew --dry-run