這是一個標準的 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。
修改後的步驟:
- 儲存設定檔。
- 執行
sudo apachectl configtest檢查語法。 - 執行
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!,代表憑證已下載完成。
- 您需要把
listen 80改成listen 443 ssl。 - 加入 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 已經幫你設好排程,但你可以執行這行指令測試看看是否能正常運作:Bash
sudo certbot renew --dry-run
