
哈囉!各位網路世界的探險家們,還有那些正為了網站安全傷透腦筋的站長們!👋 今天,我要來跟大家聊一個超實用、超重要,而且還能讓你省下大把鈔票的網站架設議題:如何在 Azure Linux VM 上,用 Nginx 搭配 Let’s Encrypt 服務,把你的網站從「裸奔」的 HTTP 時代,一鍵升級到「穿上防彈衣」的 HTTPS 安全模式!
你可能會想:「HTTPS?那是什麼?聽起來好複雜,是不是要花很多錢買憑證啊?」別擔心!這就是 Let’s Encrypt 存在的意義!它就像是網站界的「免費安全大使」,讓你不用花一毛錢,就能拿到全球公認的 SSL/TLS 憑證。而 Nginx 呢?它就是你的網站「超級守門員」,高效又可靠,幫你把流量管理得服服貼貼。再加上 Azure Linux VM 這個「雲端基地」,簡直是天作之合!
在這篇文章裡,我會用最白話、最口語的方式,一步一步帶你從零開始,搞定 Nginx 和 Let’s Encrypt 的設定。就算你是個網路新手,只要跟著我的腳步,保證你也能輕鬆上手,讓你的網站不僅安全滿分,還能讓 Google 大神更愛你(因為 HTTPS 對 SEO 可是有加分的喔!)。
準備好了嗎?繫好安全帶,我們準備起飛囉!🚀
Nginx 小教室:你的網站守門員
在我們開始動手之前,先來認識一下今天的主角之一:Nginx(發音是「Engine-X」)。它可不是什麼普通的網路伺服器,而是一個超級高效、輕量級的 Web 伺服器,同時也是一個強大的反向代理伺服器、負載平衡器和 HTTP 快取。簡單來說,它就是你網站的「超級守門員」兼「交通指揮官」!
Nginx 是什麼?為什麼它這麼受歡迎?
想像一下,你的網站就像一間熱門的餐廳。當客人(使用者)湧入時,你需要一個能快速引導他們入座、點餐,並把點好的菜送到他們面前的服務生。Nginx 就是這個「服務生」,而且還是個動作超快、效率超高的服務生!
Nginx 之所以這麼受歡迎,主要有幾個原因:
- 高效能、低資源消耗:Nginx 採用了事件驅動(Event-driven)的非同步架構,這讓它在處理大量併發連線時,依然能保持極高的效能,而且記憶體和 CPU 的消耗都非常低。這對於資源有限的 VM 來說,簡直是福音!
- 強大的反向代理能力:這是 Nginx 最常用的功能之一。它可以把使用者發來的請求,轉發給後端的應用程式伺服器(例如 Node.js、Python Flask、Java Spring Boot 等),然後再把後端的回應傳回給使用者。這樣一來,你的應用程式伺服器就不用直接暴露在網際網路上了,大大提升了安全性。同時,它也能作為負載平衡器,把流量分散到多個後端伺服器,避免單點故障。這就像是餐廳的「總管」,把客人分配給不同的廚師,確保出餐順暢。
- 靜態檔案服務:Nginx 在處理靜態檔案(例如 HTML、CSS、JavaScript、圖片等)方面表現非常出色。它可以直接快速地提供這些檔案,減輕後端應用程式伺服器的負擔。
- 易於擴展和配置:Nginx 的設定檔語法簡潔明瞭,而且支援模組化,讓你可以根據需求靈活配置。
Nginx 的主要功能:靜態檔案服務、反向代理、負載平衡
簡單來說,Nginx 在你的網站架構中,通常扮演著以下幾個關鍵角色:
- 靜態檔案服務:當使用者請求你的網站圖片、CSS 樣式表或 JavaScript 檔案時,Nginx 可以直接把這些檔案丟給他們,速度飛快!
- 反向代理:當使用者請求需要後端處理的動態內容時(例如登入、提交表單、查詢資料庫),Nginx 會把這些請求轉發給你的應用程式伺服器,然後再把應用程式伺服器的回應傳回給使用者。這就像是你的網站有一個「秘密通道」,把外部請求安全地送到內部處理。
- 負載平衡:如果你的網站流量很大,一台應用程式伺服器可能撐不住。這時候,Nginx 就可以把流量平均分配給多台應用程式伺服器,確保網站穩定運行,不會因為流量過大而崩潰。這就像是餐廳裡有好多個廚師,Nginx 會把訂單平均分給他們,讓每個廚師都不會太忙,出餐速度也能保持一致。
Nginx 設定檔結構解析:nginx.conf
, sites-available
, sites-enabled
, conf.d
Nginx 的設定檔就像是一本「武功秘笈」,裡面記載著 Nginx 該如何運作。在 Ubuntu 系統上,Nginx 的設定檔通常分佈在幾個關鍵位置。理解這些目錄結構,能讓你更有效率地管理你的 Nginx 設定。
Nginx 目錄結構樹狀圖
為了讓大家更直觀地理解,我特別製作了一個 Nginx 目錄結構的樹狀圖。這就像是 Nginx 的「家譜」,讓你一眼就能看出誰是誰,誰在哪裡!
說明:
/etc/nginx/
:這是 Nginx 的主設定目錄,所有 Nginx 相關的設定檔都放在這裡。nginx.conf
:Nginx 的主設定檔。它會包含(include
)其他子設定檔,形成一個完整的設定體系。通常,你會在這裡設定一些全域性的參數,例如worker_processes
(Nginx 工作進程的數量)、log
設定等。conf.d/
:這個目錄通常用來存放一些獨立的、全域性的設定片段,例如gzip.conf
(壓縮設定)、proxy.conf
(代理設定)等。Nginx 會自動載入這個目錄下所有以.conf
結尾的檔案。sites-available/
:這個目錄用來存放你所有網站的設定檔。你可以為每個網站建立一個獨立的設定檔,例如your-website.com.conf
。這些設定檔在這裡只是「可用」的,並不會立即生效。sites-enabled/
:這個目錄存放的是「已啟用」的網站設定檔。通常,你會透過建立符號連結(symbolic link,ln -s
命令)的方式,將sites-available
目錄中的設定檔連結到sites-enabled
目錄。只有連結到這裡的設定檔,Nginx 才會去讀取並啟用。mime.types
:定義了 Nginx 處理不同檔案類型時的 MIME 類型對應關係。/var/www/html/
:這是 Nginx 預設的網站根目錄,通常用來存放你的網站靜態檔案(例如index.html
)。/var/log/nginx/
:Nginx 的日誌檔存放目錄,包括access.log
(存取日誌)和error.log
(錯誤日誌)。這些日誌對於排查問題和分析網站流量非常重要。
常見 Nginx 設定範例
了解了目錄結構,我們來看看幾個常見的 Nginx 設定範例,這些都是你未來會經常用到的「招式」!
靜態網站設定
如果你只有一個純靜態的網站(例如部落格、公司簡介頁面),Nginx 可以非常高效地提供服務。以下是一個簡單的範例:
server {
listen 80;
server_name your-website.com www.your-website.com;
root /var/www/html/your-website;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
解釋:
listen 80;
:Nginx 會監聽 80 埠,這是 HTTP 流量的標準埠。server_name your-website.com www.your-website.com;
:指定你的網站域名。當使用者透過這些域名存取時,Nginx 會使用這個server
區塊的設定。root /var/www/html/your-website;
:指定你的網站檔案存放的根目錄。Nginx 會從這個目錄下尋找請求的檔案。index index.html index.htm;
:當使用者只輸入域名而沒有指定檔案時,Nginx 會自動尋找index.html
或index.htm
作為預設首頁。location / { ... }
:這個區塊定義了如何處理所有路徑的請求(/
代表根路徑)。try_files $uri $uri/ =404;
:這是一個非常實用的指令。它會依序嘗試尋找:$uri
:請求的 URI(例如/about.html
)。$uri/
:如果$uri
是一個目錄,則嘗試尋找該目錄下的index
檔案(例如/about/index.html
)。=404
:如果以上都找不到,則返回 404 錯誤。
反向代理設定 (與後端服務串接)
如果你有一個後端應用程式(例如 API 服務、Node.js 應用程式),Nginx 可以作為反向代理,將外部請求轉發給後端服務。這不僅能保護你的後端服務,還能提供負載平衡、SSL 終止等功能。
server {
listen 80;
server_name api.your-website.com;
location / {
proxy_pass http://localhost:5000; # 你的後端服務監聽的地址和埠
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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;
}
}
解釋:
proxy_pass http://localhost:5000;
:這是反向代理的核心指令,它會將所有請求轉發到http://localhost:5000
這個地址。你需要將localhost:5000
替換成你實際的後端服務地址和埠。proxy_http_version 1.1;
:設定代理請求的 HTTP 協定版本為 1.1。proxy_set_header ...;
:這些指令用於設定轉發給後端服務的 HTTP 請求頭。這些請求頭包含了原始請求的一些重要資訊,例如Host
(原始請求的域名)、X-Real-IP
(真實的客戶端 IP 地址)、X-Forwarded-For
(經過代理的客戶端 IP 地址鏈)和X-Forwarded-Proto
(原始請求的協定,例如 HTTP 或 HTTPS)。這些對於後端服務獲取正確的客戶端資訊非常重要。
上傳檔案大小限制 (client_max_body_size
)
如果你允許使用者上傳檔案,你可能會遇到 Nginx 預設的檔案上傳大小限制(通常是 1MB)。當上傳的檔案超過這個限制時,Nginx 會返回 413 Request Entity Too Large 錯誤。你可以透過設定 client_max_body_size
來調整這個限制。
server {
listen 80;
server_name your-website.com;
client_max_body_size 20m; # 設定上傳檔案上限為 20MB
location / {
proxy_pass http://localhost:5000;
# ... 其他 proxy 設定 ...
}
}
解釋:
client_max_body_size 20m;
:將客戶端請求體的最大大小設定為 20 兆位元組(MB)。你可以根據需求調整這個值,例如100m
代表 100MB,1g
代表 1GB。這個指令可以放在http
區塊(對所有server
生效)或server
區塊(只對當前server
生效)。
搞懂了 Nginx 的基本概念和設定,是不是覺得它其實沒那麼難?它就像一個多才多藝的工具箱,能幫你處理各種網站流量問題。接下來,我們要請出另一位重量級嘉賓:Let’s Encrypt,讓你的網站穿上 HTTPS 的「金鐘罩」!
Let’s Encrypt 與 Certbot:免費 SSL 憑證的救星
在這個網路詐騙橫行、個資外洩頻傳的時代,網站的安全性變得比以往任何時候都重要。而 HTTPS(Hypertext Transfer Protocol Secure)就是保護網站安全的第一道防線。它透過 SSL/TLS 協定對網站流量進行加密,確保使用者與網站之間的通訊不會被第三方竊聽或篡改。簡單來說,就是讓你的網站從「公開信件」變成「加密郵件」,只有收件人才能解讀。
為什麼需要 SSL/TLS 憑證?
你可能會問:「我的網站又沒有什麼機密資料,為什麼還要用 HTTPS?」嗯,這可不是有沒有機密資料的問題,而是關乎「信任」和「使用者體驗」!
- 資料加密:這是最核心的功能。HTTPS 會加密使用者與網站之間傳輸的所有資料,包括登入資訊、信用卡號碼、個人資料等等。這就像給你的資料加上一把鎖,只有正確的鑰匙(SSL/TLS 憑證)才能打開。沒有加密的 HTTP 網站,資料就像在光天化日下裸奔,誰都能看見。
- 身份驗證:SSL/TLS 憑證不僅加密資料,還能驗證網站的身份。當你存取一個 HTTPS 網站時,瀏覽器會檢查憑證是否有效,確認你連接的是真正的網站,而不是惡意釣魚網站。這就像是網站的「身份證」,證明它是真的!
- 提升 SEO 排名:Google 爸爸早就明確表示,HTTPS 是一個重要的排名因素。如果你想讓你的網站更容易被搜尋到,那麼 HTTPS 絕對是必備的!
- 提升使用者信任:當使用者看到瀏覽器網址列上的「安全鎖」圖示時,他們會感到更安心,更願意在你的網站上進行互動或交易。沒有安全鎖的網站,可能會被瀏覽器標記為「不安全」,嚇跑你的訪客。
- 支援新技術:許多新的網路技術和瀏覽器功能(例如 HTTP/2、Service Workers、Geolocation API 等)都要求網站必須使用 HTTPS。
所以,不管你的網站是部落格、電商還是企業官網,HTTPS 都是不可或缺的!
Let’s Encrypt 是什麼?免費、自動化、開放的憑證頒發機構
以前,要取得 SSL/TLS 憑證,你可能需要向商業憑證頒發機構(CA)購買,而且價格不菲。這對於許多個人部落客或小型企業來說,是一筆不小的開銷。但!是!Let’s Encrypt 的出現,徹底改變了這個局面!
Let’s Encrypt 是一個由非營利組織 Internet Security Research Group (ISRG) 營運的免費、自動化、開放的憑證頒發機構 [1]。它的目標是讓所有網站都能輕鬆實現 HTTPS 加密,從而為所有人構建更加安全的網際網路。簡單來說,它就是一個「佛心來著」的組織,免費提供 SSL/TLS 憑證,讓大家都能享受到安全的網路環境。
Let’s Encrypt 的憑證有效期通常是 90 天,但你可以透過自動化工具輕鬆續期,幾乎可以做到「一勞永逸」!
Certbot:Let’s Encrypt 的官方客戶端工具,自動化憑證申請與部署
有了 Let’s Encrypt 提供免費憑證,那要怎麼申請和安裝呢?這時候,我們的另一位英雄就登場了:Certbot!
Certbot 是由 Electronic Frontier Foundation (EFF) 開發的一個開源工具,它是 Let’s Encrypt 官方推薦的客戶端 [2]。Certbot 的主要功能就是自動化地為你的網站申請、安裝和續期 Let’s Encrypt 憑證。它支援多種 Web 伺服器(包括 Nginx 和 Apache),而且使用起來非常簡單。
Certbot 就像是一個「憑證管家」,你只要告訴它你的域名和 Web 伺服器類型,它就能自動幫你搞定所有繁瑣的憑證申請和設定工作,讓你從此告別手動申請憑證的痛苦!
憑證驗證方式:HTTP-01 挑戰 (webroot 模式)
Let’s Encrypt 在頒發憑證之前,需要驗證你確實擁有該域名。它支援多種驗證方式,其中最常用、也最適合 Nginx 的就是 HTTP-01 挑戰,通常搭配 webroot 模式使用。
HTTP-01 挑戰的原理很簡單:
- Certbot 會在你的網站根目錄下(例如
/var/www/html
)建立一個臨時的檔案,路徑類似於/.well-known/acme-challenge/你的驗證碼
。 - Let’s Encrypt 的伺服器會透過 HTTP 請求(通常是 80 埠)存取這個檔案,如果能夠成功讀取到檔案內容,就表示你確實控制著這個域名。
- 驗證成功後,Let’s Encrypt 就會頒發憑證給你。
這就是為什麼在後面的設定步驟中,我們會特別強調要讓 Nginx 在 80 埠上提供 .well-known/acme-challenge/
路徑的服務,並且確保 80 埠是開放的。這是 Certbot 能夠順利申請憑證的關鍵!
Azure Linux VM 環境準備:萬事俱備,只欠東風
在我們正式開始設定 Nginx 和 Let’s Encrypt 之前,你需要先準備好你的 Azure Linux VM 環境。這就像是蓋房子前的「打地基」工作,地基打得穩,房子才能蓋得高又安全!
建立 Azure Linux VM (Ubuntu Server)
首先,你需要在 Azure 上建立一台 Linux 虛擬機器。這裡我們以 Ubuntu Server 為例,因為它穩定、易用,而且有大量的社群支援。
建立 VM 的步驟我就不贅述了,Azure 官方文件 [3] 有非常詳細的教學。在建立過程中,有幾個重點你需要注意:
- 選擇 Ubuntu Server 映像:建議選擇最新的 LTS (Long Term Support) 版本,例如 Ubuntu Server 22.04 LTS。
- 選擇適當的 VM 大小:根據你的網站流量和應用程式需求選擇。對於一般的部落格或小型網站,B 系列或 D 系列的 VM 就足夠了。
- 設定 SSH 金鑰:這是連接 VM 的最安全方式。請務必妥善保管你的私密金鑰。
- 設定網路:這是最重要的部分,我們會在下一節詳細說明。
開放網路埠:80 (HTTP) 和 443 (HTTPS)
Azure VM 的網路安全是由「網路安全群組 (Network Security Group, NSG)」來控制的。NSG 就像是 VM 的「防火牆」,它決定了哪些流量可以進出你的 VM。為了讓你的網站能夠被外部存取,你必須在 NSG 中開放 80 埠(用於 HTTP 流量和 Certbot 驗證)和 443 埠(用於 HTTPS 流量)。
Azure NSG 設定示意圖
為了讓大家更清楚 NSG 的作用,我畫了一個簡單的示意圖:
說明:
- 所有來自網際網路的流量,都會先經過 NSG 的「審查」。
- 只有 NSG 中允許的埠(例如 80 和 443),流量才能進入你的 Azure VM。
- 進入 VM 後,Nginx 會監聽這些埠,並處理相應的請求。
如何在 Azure 入口網站設定 NSG:
- 登入 Azure 入口網站。
- 導航到你的虛擬機器。
- 在左側選單中,點擊「網路」。
- 在「網路介面」下方,點擊你的網路介面名稱。
- 在左側選單中,點擊「網路安全群組」。
- 點擊你的 NSG 名稱。
- 在「輸入安全性規則」下,點擊「新增輸入安全性規則」。
- 新增兩條規則:
- HTTP (80 埠):
- 來源:Any
- 來源埠範圍:*
- 目的地:Any
- 目的地埠範圍:80
- 協定:TCP
- 動作:允許
- 優先順序:較低的數字表示較高的優先順序(例如 100)
- 名稱:AllowHTTP
- HTTPS (443 埠):
- 來源:Any
- 來源埠範圍:*
- 目的地:Any
- 目的地埠範圍:443
- 協定:TCP
- 動作:允許
- 優先順序:較低的數字表示較高的優先順序(例如 110)
- 名稱:AllowHTTPS
- HTTP (80 埠):
除了 Azure NSG,如果你在 VM 內部也啟用了防火牆(例如 UFW),也需要開放這些埠。我們會在「常見問題與排錯」部分詳細說明。
DNS 設定:將你的網域指向 VM 的公用 IP
這是非常關鍵的一步!你需要將你的網域(例如 your-website.com
或 api.your-website.com
)指向你的 Azure VM 的公用 IP 地址。這通常在你的域名註冊商或 DNS 服務提供商那裡進行設定。
你需要新增一條 A 記錄 (Address Record),將你的域名解析到 VM 的公用 IP。例如:
類型 | 主機/名稱 | 值 (IP 地址) | TTL (秒) |
---|---|---|---|
A | @ (或 your-website.com) | 你的 Azure VM 公用 IP | 3600 |
A | www | 你的 Azure VM 公用 IP | 3600 |
重要提醒: DNS 記錄的更新需要時間才能在全球範圍內生效(這個過程稱為 DNS 傳播,通常需要幾分鐘到幾小時不等)。在進行後續步驟之前,請務必確認你的域名已經正確解析到你的 VM IP。你可以使用 dig
或 nslookup
命令來檢查,例如:dig +short your-website.com
。
安裝 Nginx 和 Certbot
最後,在你的 Azure Linux VM 上安裝 Nginx 和 Certbot。這些都是透過套件管理器來安裝的,非常簡單。
透過 SSH 連接到你的 VM:
ssh -i /path/to/your/private_key.pem your_username@your_vm_public_ip
更新套件庫並安裝 Nginx:
sudo apt update
sudo apt install nginx -y
安裝 Certbot:
Certbot 官方推薦使用 snapd
來安裝,因為這樣可以確保你總是使用最新版本的 Certbot。如果你的 Ubuntu 版本較舊,可能需要先安裝 snapd
。
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
現在,你的 Azure Linux VM 環境已經準備就緒,Nginx 和 Certbot 也都安裝好了。接下來,就是最精彩的部分:手把手教你設定 Nginx 搭配 Let’s Encrypt,讓你的網站 HTTPS 上線!
手把手教學:Nginx + Let’s Encrypt 設定全攻略
終於來到實戰環節了!前面我們已經把「地基」打好了,現在要開始「蓋房子」了。這個部分會詳細說明如何一步一步設定 Nginx 和 Certbot,讓你的網站成功啟用 HTTPS。請務必仔細跟著每個步驟操作!
步驟一:安裝 Nginx
這個步驟我們在環境準備時已經做過了,但為了教學的完整性,這裡再列一次。
- 更新套件庫:確保你的系統套件列表是最新的。
sudo apt update
- 安裝 Nginx:
sudo apt install nginx -y
-y
參數會自動回答「是」,省去你手動確認的麻煩。 - 啟動 Nginx 服務並設定開機自啟:
sudo systemctl start nginx sudo systemctl enable nginx
start
會立即啟動 Nginx 服務,enable
則會讓 Nginx 在系統啟動時自動運行。 - 檢查 Nginx 狀態:確認 Nginx 服務是否正常運行。如果看到
sudo systemctl status nginx
active (running)
,就表示 Nginx 已經成功啟動了!
現在,你可以在瀏覽器中輸入你的 VM 公用 IP 地址,應該會看到 Nginx 的預設歡迎頁面。如果看不到,請檢查 Azure NSG 和 VM 內部的防火牆設定(例如 UFW),確保 80 埠是開放的。
步驟二:設定 Nginx 暫時版 (HTTP-only) 以便 Certbot 驗證
這是非常重要的一個步驟,也是許多人第一次設定時容易卡關的地方!
為什麼需要暫時版?
當你第一次申請 Let’s Encrypt 憑證時,你的 Nginx 設定檔中還沒有 SSL 憑證的路徑。如果你直接把 HTTPS 的設定寫進去,Nginx 會因為找不到憑證檔案而無法啟動,導致 nginx -t
檢查失敗,Certbot 也無法正常工作。所以,我們需要先建立一個「臨時」的 Nginx 設定,只監聽 80 埠,並確保 Certbot 能夠透過 HTTP-01 挑戰來驗證你的域名。
我們將修改 /etc/nginx/sites-available/default
這個預設的 Nginx 網站設定檔。在修改之前,強烈建議你先備份原始檔案!
備份原始設定檔:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak.$(date +%s)
這個命令會建立一個帶有時間戳的備份檔案,方便你日後恢復。
建立 webroot 目錄:Certbot 需要一個目錄來存放驗證檔案。我們通常會使用
/var/www/html
。sudo mkdir -p /var/www/html
修改
/etc/nginx/sites-available/default
設定檔:將以下內容寫入該檔案。請將your-domain.com
替換成你自己的域名。server { listen 80; server_name your-domain.com; # 上傳上限:20MB (這個可以根據你的需求調整或移除) client_max_body_size 20m; location / { proxy_pass http://localhost:5000; # 替換成你的後端服務地址和埠 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # ACME 驗證(webroot)路徑,這是 Certbot 驗證域名的關鍵! location ~ ^/\.well-known/acme-challenge/ { root /var/www/html; allow all; } }
程式碼範例:Nginx HTTP-only 暫時設定檔
你可以直接使用
tee
命令將上述內容寫入檔案,這樣可以避免手動編輯時的錯誤:sudo tee /etc/nginx/sites-available/default >/dev/null <<'EOF' server { listen 80; server_name your-domain.com; # 上傳上限:20MB client_max_body_size 20m; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # ACME 驗證(webroot) location ~ ^/\.well-known/acme-challenge/ { root /var/www/html; allow all; } } EOF
請注意: 將
your-domain.com
替換為你的實際域名,並將http://localhost:5000
替換為你的後端服務地址和埠。測試 Nginx 設定並重新載入:
sudo nginx -t && sudo systemctl reload nginx
sudo nginx -t
:這個命令會檢查 Nginx 設定檔的語法是否有錯誤。如果看到test is successful
,就表示語法正確。sudo systemctl reload nginx
:如果語法正確,這個命令會重新載入 Nginx 設定,而不會中斷現有的服務。如果 Nginx 服務沒有運行,它會自動啟動。
如果這一步出現錯誤,請仔細檢查你的設定檔內容,特別是語法和路徑是否正確。常見的錯誤可能是少了分號
;
或者括號不匹配。
步驟三:安裝 Certbot
這個步驟我們在環境準備時也提過了,這裡再強調一次。
- 安裝
snapd
(如果尚未安裝):sudo snap install core; sudo snap refresh core
- 安裝 Certbot:這會將
sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
certbot
命令連結到/usr/bin/
,讓你可以在任何地方直接使用certbot
。
步驟四:申請 Let’s Encrypt 憑證 (使用 webroot 模式)
現在,Nginx 已經準備好處理 Certbot 的驗證請求了,我們可以正式申請憑證了!
確認 DNS A 記錄已指向本機 IP:在執行 Certbot 之前,請務必再次確認你的域名已經正確解析到你的 Azure VM 的公用 IP 地址。你可以使用
dig
命令來檢查:dig +short your-domain.com
如果返回的是你的 VM 公用 IP,那就沒問題了。
確認防火牆已開放 TCP 80 埠:Certbot 進行 HTTP-01 驗證時,需要從外部網路透過 80 埠存取你的 VM。請確保 Azure NSG 和 VM 內部的防火牆(例如 UFW)都已開放 80 埠。
執行 Certbot 命令申請憑證:我們將使用
certonly
模式和webroot
驗證方式。certonly
表示只申請憑證,不自動修改 Nginx 設定檔(因為我們稍後會手動修改)。sudo certbot certonly --webroot \ -w /var/www/html \ -d your-domain.com \ --agree-tos -m your-email@example.com --no-eff-email
程式碼範例:Certbot webroot 模式申請指令
請注意:
- 將
your-domain.com
替換為你的實際域名。 - 將
your-email@example.com
替換為你的真實電子郵件地址。Certbot 會用這個地址來發送憑證過期提醒。 --agree-tos
:表示你同意 Let’s Encrypt 的服務條款。-m
:指定你的電子郵件地址。--no-eff-email
:表示你不想接收 EFF 的推廣郵件。
如果一切順利,你會看到類似
Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain.com/fullchain.pem
的成功訊息!- 將
憑證生成路徑說明: 成功申請憑證後,Certbot 會將憑證檔案存放在以下路徑:
/etc/letsencrypt/live/your-domain.com/fullchain.pem
:這是你的網站憑證和中間憑證的組合檔案,Nginx 設定時會用到。/etc/letsencrypt/live/your-domain.com/privkey.pem
:這是你的憑證私鑰檔案,非常重要,請務必妥善保管,不要洩露!/etc/letsencrypt/options-ssl-nginx.conf
:Certbot 為 Nginx 生成的推薦 SSL 設定片段。/etc/letsencrypt/ssl-dhparams.pem
:Diffie-Hellman 參數,用於增強 SSL 安全性。
這些檔案都是符號連結,指向
/etc/letsencrypt/archive/
目錄下的實際檔案。這樣做的好處是,當憑證續期時,符號連結會自動更新,而你的 Nginx 設定檔不需要修改。
步驟五:啟用 HTTPS (Nginx 設定檔恢復)
憑證已經申請成功了!現在,我們要將 Nginx 設定檔改回完整的 HTTPS 版本,並設定 HTTP 自動跳轉到 HTTPS,讓你的網站全面進入安全模式!
修改
/etc/nginx/sites-available/default
設定檔:將以下內容寫入該檔案。請將your-domain.com
替換成你自己的域名,並將http://localhost:5000
替換為你的後端服務地址和埠。server { listen 443 ssl; # 監聽 443 埠,啟用 SSL server_name your-domain.com; # 上傳上限:20MB (如果之前設定過,可以保留) client_max_body_size 20m; # SSL 憑證路徑,指向 Certbot 生成的檔案 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 包含 Certbot 推薦的 SSL 設定 include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_pass http://localhost:5000; # 替換成你的後端服務地址和埠 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; 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 自動跳轉 HTTPS (301 Redirect) server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; }
程式碼範例:Nginx HTTPS 完整設定檔
同樣地,你可以使用
tee
命令將上述內容寫入檔案:sudo tee /etc/nginx/sites-available/default >/dev/null <<'EOF' server { listen 443 ssl; server_name your-domain.com; client_max_body_size 20m; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; 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; } ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; } EOF
再次提醒: 將
your-domain.com
替換為你的實際域名,並將http://localhost:5000
替換為你的後端服務地址和埠。測試 Nginx 設定並重新載入:
sudo nginx -t && sudo systemctl reload nginx
如果一切順利,
nginx -t
應該會顯示test is successful
,並且 Nginx 服務會重新載入。現在,你就可以在瀏覽器中輸入你的域名,應該會自動跳轉到 HTTPS,並且看到網址列上的安全鎖了!恭喜你,你的網站已經成功升級 HTTPS 了!🎉
常見問題與排錯:別怕,你不是一個人!
在設定的過程中,難免會遇到一些「小插曲」或「小麻煩」。別擔心,這都是正常的!我整理了一些常見的問題和解決方案,讓你遇到困難時不再手足無措。這就像是你的「排錯錦囊」,遇到問題就打開它!
常見問題與解決方案對照表
問題描述 | 可能原因 | 解決方案 | 相關指令/參考 |
---|---|---|---|
nginx: [emerg] cannot load certificate | 憑證檔案不存在或路徑錯誤,通常發生在憑證尚未申請成功就配置 HTTPS。 | 先用 HTTP-only 模式啟動 Nginx,讓 Nginx 能正常運行,再執行 Certbot 申請憑證。憑證申請成功後,再將 Nginx 設定檔改回 HTTPS 版本。 | 參考文章中「步驟二:設定 Nginx 暫時版」與「步驟四:申請 Let’s Encrypt 憑證」 |
Certbot 驗證失敗:Timeout during connect (likely firewall problem) | Certbot 無法從外部網路透過 80 埠存取你的 VM,通常是 DNS 解析錯誤、Azure NSG 或 VM 內部防火牆(UFW)未開放 80 埠。 | 1. 檢查 DNS A 記錄:確認你的域名已正確解析到 VM 的公用 IP。dig +short your-domain.com 。2. 檢查 Azure NSG:確保 80 埠的輸入規則已允許。3. 檢查 VM 內部防火牆 (UFW):如果啟用了 UFW,確保 80 埠已開放。sudo ufw status 。 | dig +short your-domain.com , Azure 入口網站 NSG 設定, sudo ufw allow 80/tcp , sudo ufw enable |
Nginx 服務無法啟動或重載 | Nginx 設定檔語法錯誤。 | 使用 sudo nginx -t 命令檢查設定檔語法。它會明確指出錯誤在哪一行。根據錯誤訊息修正後,再重新載入 Nginx。 | sudo nginx -t , sudo systemctl reload nginx |
上傳檔案過大導致錯誤 (413 Request Entity Too Large) | Nginx 預設的 client_max_body_size 限制了上傳檔案的大小。 | 在 Nginx 設定檔的 http 區塊或 server 區塊中,新增或修改 client_max_body_size 參數,例如 client_max_body_size 20m; 。 | 在 http { ... } 或 server { ... } 區塊中新增 client_max_body_size 20m; |
網站無法自動跳轉 HTTPS | Nginx 設定檔中沒有配置 HTTP (80 埠) 到 HTTPS (443 埠) 的 301 跳轉規則。 | 在 Nginx 設定檔中新增一個 server 區塊,監聽 80 埠,並使用 return 301 https://$host$request_uri; 進行跳轉。 | 參考文章中「步驟五:啟用 HTTPS」的 Nginx 完整設定檔 |
快速排錯小撇步:
- 善用
sudo nginx -t
:這是 Nginx 排錯的「瑞士刀」!每次修改設定檔後,務必先執行這個命令檢查語法。它會告訴你哪裡出錯了,精準又有效。 - 檢查日誌檔:Nginx 的日誌檔
/var/log/nginx/error.log
和/var/log/nginx/access.log
是排查問題的寶庫。當網站出現問題時,第一時間去查看這些日誌,通常能找到線索。 - 確認埠是否開放:使用
curl
命令從外部測試你的埠是否可達。例如:curl -I http://your-domain.com
(檢查 80 埠) 和curl -I https://your-domain.com
(檢查 443 埠)。如果連線逾時,很可能是防火牆問題。 - DNS 解析檢查:使用
dig
或nslookup
命令確認你的域名是否正確解析到你的 VM IP。dig +short your-domain.com
。 - 一步一步來:當遇到問題時,不要急著修改一大堆設定。回想一下你最近做了什麼修改,然後一步一步地排查。如果實在找不到問題,可以嘗試恢復到上一個正常工作的狀態。
記住,排錯的過程就像偵探辦案,需要耐心和細心。只要你掌握了這些工具和方法,大部分問題都能迎刃而解!
憑證自動續期:一勞永逸的秘訣
Let’s Encrypt 憑證的有效期是 90 天。你可能會想:「天啊,每三個月就要手動續期一次,那不是很麻煩嗎?」別擔心!Certbot 早就幫你想好了,它有自動續期的機制,讓你幾乎可以做到「一勞永逸」!
Certbot 自動續期機制:certbot renew
命令
Certbot 提供了一個 renew
命令,可以自動檢查你的憑證是否即將過期,並嘗試進行續期。當憑證有效期少於 30 天時,certbot renew
就會嘗試續期。如果憑證還在有效期內,它就不會做任何操作。
你可以手動執行一次 certbot renew
來測試:
sudo certbot renew --dry-run
--dry-run
參數表示「模擬運行」,它會執行續期過程,但不會真正修改你的憑證。這是一個很好的測試方式,可以確保你的自動續期設定是正確的。
如果看到類似 The following certificates are not due for renewal yet:
的訊息,表示你的憑證還在有效期內,不需要續期。如果看到 Cert not due for renewal, but simulating renewal for dry run
,表示模擬續期成功。
Cron Job 設定:確保定期執行續期
為了讓憑證自動續期,我們需要設定一個定時任務(Cron Job),讓系統每天自動執行 certbot renew
命令。Certbot 在安裝時通常會自動幫你設定好這個 Cron Job,你可以在 /etc/cron.d/certbot
或 /etc/crontab
中找到相關設定。
Certbot 通常會建立一個每天執行兩次的 Cron Job,例如:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew
這個 Cron Job 會在每天的 0 點和 12 點執行 certbot renew
命令。perl -e 'sleep int(rand(3600))'
是一個小技巧,它會讓命令隨機延遲 0 到 3600 秒(1 小時)執行,這樣可以避免所有 Certbot 使用者在同一時間點向 Let’s Encrypt 伺服器發送請求,減輕伺服器壓力。
如何檢查 Certbot 的 Cron Job 是否存在:
ls -l /etc/cron.d/certbot
如果檔案存在,通常就表示 Certbot 的自動續期已經設定好了。你也可以手動編輯 Crontab 來新增或修改定時任務:
sudo crontab -e
然後在檔案末尾新增一行(如果 Certbot 沒有自動設定的話):
0 0,12 * * * /usr/bin/certbot renew --quiet
這表示每天的 0 點和 12 點執行 certbot renew
命令,--quiet
參數表示安靜模式,只在有錯誤時才輸出訊息。
續期失敗的可能原因與解決方案
雖然 Certbot 自動續期很方便,但偶爾還是會遇到一些問題。以下是一些常見的續期失敗原因和解決方案:
- DNS 解析問題:如果你的域名 DNS 記錄發生變化,或者 DNS 服務出現問題,Certbot 可能無法驗證你的域名,導致續期失敗。請檢查 DNS A 記錄是否仍然指向你的 VM IP。
- 防火牆問題:如果 80 埠或 443 埠被防火牆阻擋,Certbot 無法進行 HTTP-01 挑戰,續期也會失敗。請檢查 Azure NSG 和 VM 內部防火牆設定。
- Nginx 設定檔問題:如果你在 Nginx 設定檔中做了不當的修改,導致 Nginx 無法正常啟動或處理 Certbot 的驗證請求,續期也會失敗。請確保你的 Nginx 設定檔語法正確,並且
.well-known/acme-challenge/
路徑可以被外部存取。 - Webroot 目錄不存在或權限問題:如果你移除了
/var/www/html
目錄,或者該目錄的權限不正確,Certbot 可能無法寫入驗證檔案。請確保該目錄存在且 Nginx 有讀寫權限。 - Certbot 版本過舊:雖然
snapd
會自動更新 Certbot,但如果你的 Certbot 版本過舊,可能會遇到一些已知問題。可以嘗試手動更新 Certbot:sudo snap refresh certbot
。
如果自動續期失敗,Certbot 會發送電子郵件通知你。所以,請務必在申請憑證時提供一個有效的電子郵件地址,並定期檢查你的信箱。
總結:你的網站,現在更安全、更專業!
恭喜你!走到這裡,你已經成功地在 Azure Linux VM 上,用 Nginx 搭配 Let’s Encrypt 服務,為你的網站穿上了 HTTPS 的「安全防彈衣」!這不僅讓你的網站更加安全,保護了使用者資料,還能提升你的 SEO 排名,讓更多人找到你的網站。是不是很有成就感呢?
回顧一下,我們今天學到了什麼:
- Nginx:你的網站超級守門員,高效處理流量,提供靜態檔案服務和強大的反向代理功能。
- Let’s Encrypt:免費、自動化、開放的 SSL/TLS 憑證提供者,讓 HTTPS 不再是高不可攀的技術。
- Certbot:Let’s Encrypt 的官方客戶端工具,自動化憑證申請、安裝和續期,讓你省心省力。
- Azure Linux VM 環境準備:建立 VM、開放網路埠、設定 DNS,為網站上線打下堅實基礎。
- 手把手設定流程:從 Nginx 安裝、暫時版設定、Certbot 申請憑證,到最終啟用 HTTPS 和自動跳轉,每個步驟都清晰明瞭。
- 常見問題與排錯:遇到問題不再慌張,有了排錯錦囊,大部分問題都能輕鬆解決。
- 憑證自動續期:設定 Cron Job,讓你的憑證永不過期,一勞永逸。
現在,你的網站不僅安全滿分,還具備了專業級的 HTTPS 加密。這對於提升使用者信任、保護資料隱私,以及在競爭激烈的網路世界中脫穎而出,都至關重要。希望這篇文章能幫助你輕鬆搞定網站安全,讓你的網路事業更上一層樓!
別忘了,網路世界變化快速,持續學習和探索是保持領先的關鍵。如果你在實踐過程中遇到任何問題,或者有新的想法,都歡迎留言討論。我會盡力提供幫助!
祝你的網站安全又高效,流量滾滾來!下次見!👋
參考資料
手把手教學:Nginx + Let's Encrypt 設定全攻略
終於來到實戰環節了!前面我們已經把「地基」打好了,現在要開始「蓋房子」了。這個部分會詳細說明如何一步一步設定 Nginx 和 Certbot,讓你的網站成功啟用 HTTPS。請務必仔細跟著每個步驟操作!
步驟一:安裝 Nginx
這個步驟我們在環境準備時已經做過了,但為了教學的完整性,這裡再列一次。
- 更新套件庫:確保你的系統套件列表是最新的。
sudo apt update
- 安裝 Nginx:
sudo apt install nginx -y
-y
參數會自動回答「是」,省去你手動確認的麻煩。 - 啟動 Nginx 服務並設定開機自啟:
sudo systemctl start nginx sudo systemctl enable nginx
start
會立即啟動 Nginx 服務,enable
則會讓 Nginx 在系統啟動時自動運行。 - 檢查 Nginx 狀態:確認 Nginx 服務是否正常運行。如果看到
sudo systemctl status nginx
active (running)
,就表示 Nginx 已經成功啟動了!
現在,你可以在瀏覽器中輸入你的 VM 公用 IP 地址,應該會看到 Nginx 的預設歡迎頁面。如果看不到,請檢查 Azure NSG 和 VM 內部的防火牆設定(例如 UFW),確保 80 埠是開放的。
步驟二:設定 Nginx 暫時版 (HTTP-only) 以便 Certbot 驗證
這是非常重要的一個步驟,也是許多人第一次設定時容易卡關的地方!
為什麼需要暫時版?
當你第一次申請 Let's Encrypt 憑證時,你的 Nginx 設定檔中還沒有 SSL 憑證的路徑。如果你直接把 HTTPS 的設定寫進去,Nginx 會因為找不到憑證檔案而無法啟動,導致 nginx -t
檢查失敗,Certbot 也無法正常工作。所以,我們需要先建立一個「臨時」的 Nginx 設定,只監聽 80 埠,並確保 Certbot 能夠透過 HTTP-01 挑戰來驗證你的域名。
我們將修改 /etc/nginx/sites-available/default
這個預設的 Nginx 網站設定檔。在修改之前,強烈建議你先備份原始檔案!
備份原始設定檔:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak.$(date +%s)
這個命令會建立一個帶有時間戳的備份檔案,方便你日後恢復。
建立 webroot 目錄:Certbot 需要一個目錄來存放驗證檔案。我們通常會使用
/var/www/html
。sudo mkdir -p /var/www/html
修改
/etc/nginx/sites-available/default
設定檔:將以下內容寫入該檔案。請將your-domain.com
替換成你自己的域名。server { listen 80; server_name your-domain.com; # 上傳上限:20MB (這個可以根據你的需求調整或移除) client_max_body_size 20m; location / { proxy_pass http://localhost:5000; # 替換成你的後端服務地址和埠 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # ACME 驗證(webroot)路徑,這是 Certbot 驗證域名的關鍵! location ~ ^/\.well-known/acme-challenge/ { root /var/www/html; allow all; } }
程式碼範例:Nginx HTTP-only 暫時設定檔
你可以直接使用
tee
命令將上述內容寫入檔案,這樣可以避免手動編輯時的錯誤:sudo tee /etc/nginx/sites-available/default >/dev/null <<\'EOF\' server { listen 80; server_name your-domain.com; # 上傳上限:20MB client_max_body_size 20m; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # ACME 驗證(webroot) location ~ ^/\.well-known/acme-challenge/ { root /var/www/html; allow all; } } EOF
請注意: 將
your-domain.com
替換為你的實際域名,並將http://localhost:5000
替換為你的後端服務地址和埠。測試 Nginx 設定並重新載入:
sudo nginx -t && sudo systemctl reload nginx
sudo nginx -t
:這個命令會檢查 Nginx 設定檔的語法是否有錯誤。如果看到test is successful
,就表示語法正確。sudo systemctl reload nginx
:如果語法正確,這個命令會重新載入 Nginx 設定,而不會中斷現有的服務。如果 Nginx 服務沒有運行,它會自動啟動。
如果這一步出現錯誤,請仔細檢查你的設定檔內容,特別是語法和路徑是否正確。常見的錯誤可能是少了分號
;
或者括號不匹配。
步驟三:安裝 Certbot
這個步驟我們在環境準備時也提過了,這裡再強調一次。
- 安裝
snapd
(如果尚未安裝):sudo snap install core; sudo snap refresh core
- 安裝 Certbot:這會將
sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
certbot
命令連結到/usr/bin/
,讓你可以在任何地方直接使用certbot
。
步驟四:申請 Let's Encrypt 憑證 (使用 webroot 模式)
現在,Nginx 已經準備好處理 Certbot 的驗證請求了,我們可以正式申請憑證了!
確認 DNS A 記錄已指向本機 IP:在執行 Certbot 之前,請務必再次確認你的域名已經正確解析到你的 Azure VM 的公用 IP 地址。你可以使用
dig
命令來檢查:dig +short your-domain.com
如果返回的是你的 VM 公用 IP,那就沒問題了。
確認防火牆已開放 TCP 80 埠:Certbot 進行 HTTP-01 驗證時,需要從外部網路透過 80 埠存取你的 VM。請確保 Azure NSG 和 VM 內部的防火牆(例如 UFW)都已開放 80 埠。
執行 Certbot 命令申請憑證:我們將使用
certonly
模式和webroot
驗證方式。certonly
表示只申請憑證,不自動修改 Nginx 設定檔(因為我們稍後會手動修改)。sudo certbot certonly --webroot \ -w /var/www/html \ -d your-domain.com \ --agree-tos -m your-email@example.com --no-eff-email
程式碼範例:Certbot webroot 模式申請指令
請注意:
- 將
your-domain.com
替換為你的實際域名。 - 將
your-email@example.com
替換為你的真實電子郵件地址。Certbot 會用這個地址來發送憑證過期提醒。 --agree-tos
:表示你同意 Let's Encrypt 的服務條款。-m
:指定你的電子郵件地址。--no-eff-email
:表示你不想接收 EFF 的推廣郵件。
如果一切順利,你會看到類似
Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain.com/fullchain.pem
的成功訊息!- 將
憑證生成路徑說明: 成功申請憑證後,Certbot 會將憑證檔案存放在以下路徑:
/etc/letsencrypt/live/your-domain.com/fullchain.pem
:這是你的網站憑證和中間憑證的組合檔案,Nginx 設定時會用到。/etc/letsencrypt/live/your-domain.com/privkey.pem
:這是你的憑證私鑰檔案,非常重要,請務必妥善保管,不要洩露!/etc/letsencrypt/options-ssl-nginx.conf
:Certbot 為 Nginx 生成的推薦 SSL 設定片段。/etc/letsencrypt/ssl-dhparams.pem
:Diffie-Hellman 參數,用於增強 SSL 安全性。
這些檔案都是符號連結,指向
/etc/letsencrypt/archive/
目錄下的實際檔案。這樣做的好處是,當憑證續期時,符號連結會自動更新,而你的 Nginx 設定檔不需要修改。
步驟五:啟用 HTTPS (Nginx 設定檔恢復)
憑證已經申請成功了!現在,我們要將 Nginx 設定檔改回完整的 HTTPS 版本,並設定 HTTP 自動跳轉到 HTTPS,讓你的網站全面進入安全模式!
修改
/etc/nginx/sites-available/default
設定檔:將以下內容寫入該檔案。請將your-domain.com
替換成你自己的域名,並將http://localhost:5000
替換為你的後端服務地址和埠。server { listen 443 ssl; # 監聽 443 埠,啟用 SSL server_name your-domain.com; # 上傳上限:20MB (如果之前設定過,可以保留) client_max_body_size 20m; # SSL 憑證路徑,指向 Certbot 生成的檔案 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 包含 Certbot 推薦的 SSL 設定 include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_pass http://localhost:5000; # 替換成你的後端服務地址和埠 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \'upgrade\'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; 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 自動跳轉 HTTPS (301 Redirect) server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; }
程式碼範例:Nginx HTTPS 完整設定檔
同樣地,你可以使用
tee
命令將上述內容寫入檔案:sudo tee /etc/nginx/sites-available/default >/dev/null <<\'EOF\' server { listen 80; server_name your-domain.com; # 上傳上限:20MB client_max_body_size 20m; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # ACME 驗證(webroot) location ~ ^/\.well-known/acme-challenge/ { root /var/www/html; allow all; } } EOF
再次提醒: 將
your-domain.com
替換為你的實際域名,並將http://localhost:5000
替換為你的後端服務地址和埠。測試 Nginx 設定並重新載入:
sudo nginx -t && sudo systemctl reload nginx
如果一切順利,
nginx -t
應該會顯示test is successful
,並且 Nginx 服務會重新載入。現在,你就可以在瀏覽器中輸入你的域名,應該會自動跳轉到 HTTPS,並且看到網址列上的安全鎖了!恭喜你,你的網站已經成功升級 HTTPS 了!🎉
常見問題與排錯:別怕,你不是一個人!
在設定的過程中,難免會遇到一些「小插曲」或「小麻煩」。別擔心,這都是正常的!我整理了一些常見的問題和解決方案,讓你遇到困難時不再手足無措。這就像是你的「排錯錦囊」,遇到問題就打開它!
常見問題與解決方案對照表
問題描述 | 可能原因 | 解決方案 | 相關指令/參考 |
---|---|---|---|
nginx: [emerg] cannot load certificate | 憑證檔案不存在或路徑錯誤,通常發生在憑證尚未申請成功就配置 HTTPS。 | 先用 HTTP-only 模式啟動 Nginx,讓 Nginx 能正常運行,再執行 Certbot 申請憑證。憑證申請成功後,再將 Nginx 設定檔改回 HTTPS 版本。 | 參考文章中「步驟二:設定 Nginx 暫時版」與「步驟四:申請 Let's Encrypt 憑證」 |
Certbot 驗證失敗:Timeout during connect (likely firewall problem) | Certbot 無法從外部網路透過 80 埠存取你的 VM,通常是 DNS 解析錯誤、Azure NSG 或 VM 內部防火牆(UFW)未開放 80 埠。 | 1. 檢查 DNS A 記錄:確認你的域名已正確解析到 VM 的公用 IP。dig +short your-domain.com 。2. 檢查 Azure NSG:確保 80 埠的輸入規則已允許。3. 檢查 VM 內部防火牆 (UFW):如果啟用了 UFW,確保 80 埠已開放。sudo ufw status 。 | dig +short your-domain.com , Azure 入口網站 NSG 設定, sudo ufw allow 80/tcp , sudo ufw enable |
Nginx 服務無法啟動或重載 | Nginx 設定檔語法錯誤。 | 使用 sudo nginx -t 命令檢查設定檔語法。它會明確指出錯誤在哪一行。根據錯誤訊息修正後,再重新載入 Nginx。 | sudo nginx -t , sudo systemctl reload nginx |
上傳檔案過大導致錯誤 (413 Request Entity Too Large) | Nginx 預設的 client_max_body_size 限制了上傳檔案的大小。 | 在 Nginx 設定檔的 http 區塊或 server 區塊中,新增或修改 client_max_body_size 參數,例如 client_max_body_size 20m; 。 | 在 http { ... } 或 server { ... } 區塊中新增 client_max_body_size 20m; |
網站無法自動跳轉 HTTPS | Nginx 設定檔中沒有配置 HTTP (80 埠) 到 HTTPS (443 埠) 的 301 跳轉規則。 | 在 Nginx 設定檔中新增一個 server 區塊,監聽 80 埠,並使用 return 301 https://$host$request_uri; 進行跳轉。 | 參考文章中「步驟五:啟用 HTTPS」的 Nginx 完整設定檔 |
快速排錯小撇步:
- 善用
sudo nginx -t
:這是 Nginx 排錯的「瑞士刀」!每次修改設定檔後,務必先執行這個命令檢查語法。它會告訴你哪裡出錯了,精準又有效。 - 檢查日誌檔:Nginx 的日誌檔
/var/log/nginx/error.log
和/var/log/nginx/access.log
是排查問題的寶庫。當網站出現問題時,第一時間去查看這些日誌,通常能找到線索。 - 確認埠是否開放:使用
curl
命令從外部測試你的埠是否可達。例如:curl -I http://your-domain.com
(檢查 80 埠) 和curl -I https://your-domain.com
(檢查 443 埠)。如果連線逾時,很可能是防火牆問題。 - DNS 解析檢查:使用
dig
或nslookup
命令確認你的域名是否正確解析到你的 VM IP。dig +short your-domain.com
。 - 一步一步來:當遇到問題時,不要急著修改一大堆設定。回想一下你最近做了什麼修改,然後一步一步地排查。如果實在找不到問題,可以嘗試恢復到上一個正常工作的狀態。
記住,排錯的過程就像偵探辦案,需要耐心和細心。只要你掌握了這些工具和方法,大部分問題都能迎刃而解!
憑證自動續期:一勞永逸的秘訣
Let's Encrypt 憑證的有效期是 90 天。你可能會想:「天啊,每三個月就要手動續期一次,那不是很麻煩嗎?」別擔心!Certbot 早就幫你想好了,它有自動續期的機制,讓你幾乎可以做到「一勞永逸」!
Certbot 自動續期機制:certbot renew
命令
Certbot 提供了一個 renew
命令,可以自動檢查你的憑證是否即將過期,並嘗試進行續期。當憑證有效期少於 30 天時,certbot renew
就會嘗試續期。如果憑證還在有效期內,它就不會做任何操作。
你可以手動執行一次 certbot renew
來測試:
sudo certbot renew --dry-run
--dry-run
參數表示「模擬運行」,它會執行續期過程,但不會真正修改你的憑證。這是一個很好的測試方式,可以確保你的自動續期設定是正確的。
如果看到類似 The following certificates are not due for renewal yet:
的訊息,表示你的憑證還在有效期內,不需要續期。如果看到 Cert not due for renewal, but simulating renewal for dry run
,表示模擬續期成功。
Cron Job 設定:確保定期執行續期
為了讓憑證自動續期,我們需要設定一個定時任務(Cron Job),讓系統每天自動執行 certbot renew
命令。Certbot 在安裝時通常會自動幫你設定好這個 Cron Job,你可以在 /etc/cron.d/certbot
或 /etc/crontab
中找到相關設定。
Certbot 通常會建立一個每天執行兩次的 Cron Job,例如:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e \'sleep int(rand(3600))\' && certbot -q renew
這個 Cron Job 會在每天的 0 點和 12 點執行 certbot renew
命令。perl -e \'sleep int(rand(3600))\'
是一個小技巧,它會讓命令隨機延遲 0 到 3600 秒(1 小時)執行,這樣可以避免所有 Certbot 使用者在同一時間點向 Let's Encrypt 伺服器發送請求,減輕伺服器壓力。
如何檢查 Certbot 的 Cron Job 是否存在:
ls -l /etc/cron.d/certbot
如果檔案存在,通常就表示 Certbot 的自動續期已經設定好了。你也可以手動編輯 Crontab 來新增或修改定時任務:
sudo crontab -e
然後在檔案末尾新增一行(如果 Certbot 沒有自動設定的話):
0 0,12 * * * /usr/bin/certbot renew --quiet
這表示每天的 0 點和 12 點執行 certbot renew
命令,--quiet
參數表示安靜模式,只在有錯誤時才輸出訊息。
續期失敗的可能原因與解決方案
雖然 Certbot 自動續期很方便,但偶爾還是會遇到一些問題。以下是一些常見的續期失敗原因和解決方案:
- DNS 解析問題:如果你的域名 DNS 記錄發生變化,或者 DNS 服務出現問題,Certbot 可能無法驗證你的域名,導致續期失敗。請檢查 DNS A 記錄是否仍然指向你的 VM IP。
- 防火牆問題:如果 80 埠或 443 埠被防火牆阻擋,Certbot 無法進行 HTTP-01 挑戰,續期也會失敗。請檢查 Azure NSG 和 VM 內部防火牆設定。
- Nginx 設定檔問題:如果你在 Nginx 設定檔中做了不當的修改,導致 Nginx 無法正常啟動或處理 Certbot 的驗證請求,續期也會失敗。請確保你的 Nginx 設定檔語法正確,並且
.well-known/acme-challenge/
路徑可以被外部存取。 - Webroot 目錄不存在或權限問題:如果你移除了
/var/www/html
目錄,或者該目錄的權限不正確,Certbot 可能無法寫入驗證檔案。請確保該目錄存在且 Nginx 有讀寫權限。 - Certbot 版本過舊:雖然
snapd
會自動更新 Certbot,但如果你的 Certbot 版本過舊,可能會遇到一些已知問題。可以嘗試手動更新 Certbot:sudo snap refresh certbot
。
如果自動續期失敗,Certbot 會發送電子郵件通知你。所以,請務必在申請憑證時提供一個有效的電子郵件地址,並定期檢查你的信箱。
總結:你的網站,現在更安全、更專業!
恭喜你!走到這裡,你已經成功地在 Azure Linux VM 上,用 Nginx 搭配 Let's Encrypt 服務,為你的網站穿上了 HTTPS 的「安全防彈衣」!這不僅讓你的網站更加安全,保護了使用者資料,還能提升你的 SEO 排名,讓更多人找到你的網站。是不是很有成就感呢?
回顧一下,我們今天學到了什麼:
- Nginx:你的網站超級守門員,高效處理流量,提供靜態檔案服務和強大的反向代理功能。
- Let's Encrypt:免費、自動化、開放的 SSL/TLS 憑證提供者,讓 HTTPS 不再是高不可攀的技術。
- Certbot:Let's Encrypt 的官方客戶端工具,自動化憑證申請、安裝和續期,讓你省心省力。
- Azure Linux VM 環境準備:建立 VM、開放網路埠、設定 DNS,為網站上線打下堅實基礎。
- 手把手設定流程:從 Nginx 安裝、暫時版設定、Certbot 申請憑證,到最終啟用 HTTPS 和自動跳轉,每個步驟都清晰明瞭。
- 常見問題與排錯:遇到問題不再慌張,有了排錯錦囊,大部分問題都能輕鬆解決。
- 憑證自動續期:設定 Cron Job,讓你的憑證永不過期,一勞永逸。
現在,你的網站不僅安全滿分,還具備了專業級的 HTTPS 加密。這對於提升使用者信任、保護資料隱私,以及在競爭激烈的網路世界中脫穎而出,都至關重要。希望這篇文章能幫助你輕鬆搞定網站安全,讓你的網路事業更上一層樓!
別忘了,網路世界變化快速,持續學習和探索是保持領先的關鍵。如果你在實踐過程中遇到任何問題,或者有新的想法,都歡迎留言討論。我會盡力提供幫助!
祝你的網站安全又高效,流量滾滾來!下次見!👋
參考資料
步驟五:啟用 HTTPS (Nginx 設定檔恢復)
憑證已經申請成功了!現在,我們要將 Nginx 設定檔改回完整的 HTTPS 版本,並設定 HTTP 自動跳轉到 HTTPS,讓你的網站全面進入安全模式!
修改
/etc/nginx/sites-available/default
設定檔:將以下內容寫入該檔案。請將your-domain.com
替換成你自己的域名,並將http://localhost:5000
替換為你的後端服務地址和埠。server { listen 443 ssl; # 監聽 443 埠,啟用 SSL server_name your-domain.com; # 上傳上限:20MB (如果之前設定過,可以保留) client_max_body_size 20m; # SSL 憑證路徑,指向 Certbot 生成的檔案 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 包含 Certbot 推薦的 SSL 設定 include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_pass http://localhost:5000; # 替換成你的後端服務地址和埠 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; 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 自動跳轉 HTTPS (301 Redirect) server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; }
程式碼範例:Nginx HTTPS 完整設定檔
同樣地,你可以使用
tee
命令將上述內容寫入檔案:sudo tee /etc/nginx/sites-available/default >/dev/null <<'EOF' server { listen 443 ssl; server_name your-domain.com; client_max_body_size 20m; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; } EOF
再次提醒: 將
your-domain.com
替換為你的實際域名,並將http://localhost:5000
替換為你的後端服務地址和埠。測試 Nginx 設定並重新載入:
sudo nginx -t && sudo systemctl reload nginx
如果一切順利,
nginx -t
應該會顯示test is successful
,並且 Nginx 服務會重新載入。現在,你就可以在瀏覽器中輸入你的域名,應該會自動跳轉到 HTTPS,並且看到網址列上的安全鎖了!恭喜你,你的網站已經成功升級 HTTPS 了!🎉
常見問題與排錯:別怕,你不是一個人!
在設定的過程中,難免會遇到一些「小插曲」或「小麻煩」。別擔心,這都是正常的!我整理了一些常見的問題和解決方案,讓你遇到困難時不再手足無措。這就像是你的「排錯錦囊」,遇到問題就打開它!
常見問題與解決方案對照表
問題描述 | 可能原因 | 解決方案 | 相關指令/參考 |
---|---|---|---|
nginx: [emerg] cannot load certificate | 憑證檔案不存在或路徑錯誤,通常發生在憑證尚未申請成功就配置 HTTPS。 | 先用 HTTP-only 模式啟動 Nginx,讓 Nginx 能正常運行,再執行 Certbot 申請憑證。憑證申請成功後,再將 Nginx 設定檔改回 HTTPS 版本。 | 參考文章中「步驟二:設定 Nginx 暫時版」與「步驟四:申請 Let’s Encrypt 憑證」 |
Certbot 驗證失敗:Timeout during connect (likely firewall problem) | Certbot 無法從外部網路透過 80 埠存取你的 VM,通常是 DNS 解析錯誤、Azure NSG 或 VM 內部防火牆(UFW)未開放 80 埠。 | 1. 檢查 DNS A 記錄:確認你的域名已正確解析到 VM 的公用 IP。dig +short your-domain.com 。2. 檢查 Azure NSG:確保 80 埠的輸入規則已允許。3. 檢查 VM 內部防火牆 (UFW):如果啟用了 UFW,確保 80 埠已開放。sudo ufw status 。 | dig +short your-domain.com , Azure 入口網站 NSG 設定, sudo ufw allow 80/tcp , sudo ufw enable |
Nginx 服務無法啟動或重載 | Nginx 設定檔語法錯誤。 | 使用 sudo nginx -t 命令檢查設定檔語法。它會明確指出錯誤在哪一行。根據錯誤訊息修正後,再重新載入 Nginx。 | sudo nginx -t , sudo systemctl reload nginx |
上傳檔案過大導致錯誤 (413 Request Entity Too Large) | Nginx 預設的 client_max_body_size 限制了上傳檔案的大小。 | 在 Nginx 設定檔的 http 區塊或 server 區塊中,新增或修改 client_max_body_size 參數,例如 client_max_body_size 20m; 。 | 在 http { ... } 或 server { ... } 區塊中新增 client_max_body_size 20m; |
網站無法自動跳轉 HTTPS | Nginx 設定檔中沒有配置 HTTP (80 埠) 到 HTTPS (443 埠) 的 301 跳轉規則。 | 在 Nginx 設定檔中新增一個 server 區塊,監聽 80 埠,並使用 return 301 https://$host$request_uri; 進行跳轉。 | 參考文章中「步驟五:啟用 HTTPS」的 Nginx 完整設定檔 |
快速排錯小撇步:
- 善用
sudo nginx -t
:這是 Nginx 排錯的「瑞士刀」!每次修改設定檔後,務必先執行這個命令檢查語法。它會告訴你哪裡出錯了,精準又有效。 - 檢查日誌檔:Nginx 的日誌檔
/var/log/nginx/error.log
和/var/log/nginx/access.log
是排查問題的寶庫。當網站出現問題時,第一時間去查看這些日誌,通常能找到線索。 - 確認埠是否開放:使用
curl
命令從外部測試你的埠是否可達。例如:curl -I http://your-domain.com
(檢查 80 埠) 和curl -I https://your-domain.com
(檢查 443 埠)。如果連線逾時,很可能是防火牆問題。 - DNS 解析檢查:使用
dig
或nslookup
命令確認你的域名是否正確解析到你的 VM IP。dig +short your-domain.com
。 - 一步一步來:當遇到問題時,不要急著修改一大堆設定。回想一下你最近做了什麼修改,然後一步一步地排查。如果實在找不到問題,可以嘗試恢復到上一個正常工作的狀態。
記住,排錯的過程就像偵探辦案,需要耐心和細心。只要你掌握了這些工具和方法,大部分問題都能迎刃而解!
憑證自動續期:一勞永逸的秘訣
Let’s Encrypt 憑證的有效期是 90 天。你可能會想:「天啊,每三個月就要手動續期一次,那不是很麻煩嗎?」別擔心!Certbot 早就幫你想好了,它有自動續期的機制,讓你幾乎可以做到「一勞永逸」!
Certbot 自動續期機制:certbot renew
命令
Certbot 提供了一個 renew
命令,可以自動檢查你的憑證是否即將過期,並嘗試進行續期。當憑證有效期少於 30 天時,certbot renew
就會嘗試續期。如果憑證還在有效期內,它就不會做任何操作。
你可以手動執行一次 certbot renew
來測試:
sudo certbot renew --dry-run
--dry-run
參數表示「模擬運行」,它會執行續期過程,但不會真正修改你的憑證。這是一個很好的測試方式,可以確保你的自動續期設定是正確的。
如果看到類似 The following certificates are not due for renewal yet:
的訊息,表示你的憑證還在有效期內,不需要續期。如果看到 Cert not due for renewal, but simulating renewal for dry run
,表示模擬續期成功。
Cron Job 設定:確保定期執行續期
為了讓憑證自動續期,我們需要設定一個定時任務(Cron Job),讓系統每天自動執行 certbot renew
命令。Certbot 在安裝時通常會自動幫你設定好這個 Cron Job,你可以在 /etc/cron.d/certbot
或 /etc/crontab
中找到相關設定。
Certbot 通常會建立一個每天執行兩次的 Cron Job,例如:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew
這個 Cron Job 會在每天的 0 點和 12 點執行 certbot renew
命令。perl -e 'sleep int(rand(3600))'
是一個小技巧,它會讓命令隨機延遲 0 到 3600 秒(1 小時)執行,這樣可以避免所有 Certbot 使用者在同一時間點向 Let’s Encrypt 伺服器發送請求,減輕伺服器壓力。
如何檢查 Certbot 的 Cron Job 是否存在:
ls -l /etc/cron.d/certbot
如果檔案存在,通常就表示 Certbot 的自動續期已經設定好了。你也可以手動編輯 Crontab 來新增或修改定時任務:
sudo crontab -e
然後在檔案末尾新增一行(如果 Certbot 沒有自動設定的話):
0 0,12 * * * /usr/bin/certbot renew --quiet
這表示每天的 0 點和 12 點執行 certbot renew
命令,--quiet
參數表示安靜模式,只在有錯誤時才輸出訊息。
續期失敗的可能原因與解決方案
雖然 Certbot 自動續期很方便,但偶爾還是會遇到一些問題。以下是一些常見的續期失敗原因和解決方案:
- DNS 解析問題:如果你的域名 DNS 記錄發生變化,或者 DNS 服務出現問題,Certbot 可能無法驗證你的域名,導致續期失敗。請檢查 DNS A 記錄是否仍然指向你的 VM IP。
- 防火牆問題:如果 80 埠或 443 埠被防火牆阻擋,Certbot 無法進行 HTTP-01 挑戰,續期也會失敗。請檢查 Azure NSG 和 VM 內部防火牆設定。
- Nginx 設定檔問題:如果你在 Nginx 設定檔中做了不當的修改,導致 Nginx 無法正常啟動或處理 Certbot 的驗證請求,續期也會失敗。請確保你的 Nginx 設定檔語法正確,並且
.well-known/acme-challenge/
路徑可以被外部存取。 - Webroot 目錄不存在或權限問題:如果你移除了
/var/www/html
目錄,或者該目錄的權限不正確,Certbot 可能無法寫入驗證檔案。請確保該目錄存在且 Nginx 有讀寫權限。 - Certbot 版本過舊:雖然
snapd
會自動更新 Certbot,但如果你的 Certbot 版本過舊,可能會遇到一些已知問題。可以嘗試手動更新 Certbot:sudo snap refresh certbot
。
如果自動續期失敗,Certbot 會發送電子郵件通知你。所以,請務必在申請憑證時提供一個有效的電子郵件地址,並定期檢查你的信箱。
總結:你的網站,現在更安全、更專業!
恭喜你!走到這裡,你已經成功地在 Azure Linux VM 上,用 Nginx 搭配 Let’s Encrypt 服務,為你的網站穿上了 HTTPS 的「安全防彈衣」!這不僅讓你的網站更加安全,保護了使用者資料,還能提升你的 SEO 排名,讓更多人找到你的網站。是不是很有成就感呢?
回顧一下,我們今天學到了什麼:
- Nginx:你的網站超級守門員,高效處理流量,提供靜態檔案服務和強大的反向代理功能。
- Let’s Encrypt:免費、自動化、開放的 SSL/TLS 憑證提供者,讓 HTTPS 不再是高不可攀的技術。
- Certbot:Let’s Encrypt 的官方客戶端工具,自動化憑證申請、安裝和續期,讓你省心省力。
- Azure Linux VM 環境準備:建立 VM、開放網路埠、設定 DNS,為網站上線打下堅實基礎。
- 手把手設定流程:從 Nginx 安裝、暫時版設定、Certbot 申請憑證,到最終啟用 HTTPS 和自動跳轉,每個步驟都清晰明瞭。
- 常見問題與排錯:遇到問題不再慌張,有了排錯錦囊,大部分問題都能輕鬆解決。
- 憑證自動續期:設定 Cron Job,讓你的憑證永不過期,一勞永逸。
現在,你的網站不僅安全滿分,還具備了專業級的 HTTPS 加密。這對於提升使用者信任、保護資料隱私,以及在競爭激烈的網路世界中脫穎而出,都至關重要。希望這篇文章能幫助你輕鬆搞定網站安全,讓你的網路事業更上一層樓!
別忘了,網路世界變化快速,持續學習和探索是保持領先的關鍵。如果你在實踐過程中遇到任何問題,或者有新的想法,都歡迎留言討論。我會盡力提供幫助!
祝你的網站安全又高效,流量滾滾來!下次見!👋
參考資料
的實際域名。
* 將 your-email@example.com
替換為你的真實電子郵件地址。Certbot 會用這個地址來發送憑證過期提醒。
* --agree-tos
:表示你同意 Let's Encrypt 的服務條款。
* -m
:指定你的電子郵件地址。
* --no-eff-email
:表示你不想接收 EFF 的推廣郵件。
如果一切順利,你會看到類似 `Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain.com/fullchain.pem` 的成功訊息!
憑證生成路徑說明: 成功申請憑證後,Certbot 會將憑證檔案存放在以下路徑:
/etc/letsencrypt/live/your-domain.com/fullchain.pem
:這是你的網站憑證和中間憑證的組合檔案,Nginx 設定時會用到。/etc/letsencrypt/live/your-domain.com/privkey.pem
:這是你的憑證私鑰檔案,非常重要,請務必妥善保管,不要洩露!/etc/letsencrypt/options-ssl-nginx.conf
:Certbot 為 Nginx 生成的推薦 SSL 設定片段。/etc/letsencrypt/ssl-dhparams.pem
:Diffie-Hellman 參數,用於增強 SSL 安全性。
這些檔案都是符號連結,指向
/etc/letsencrypt/archive/
目錄下的實際檔案。這樣做的好處是,當憑證續期時,符號連結會自動更新,而你的 Nginx 設定檔不需要修改。
步驟五:啟用 HTTPS (Nginx 設定檔恢復)
憑證已經申請成功了!現在,我們要將 Nginx 設定檔改回完整的 HTTPS 版本,並設定 HTTP 自動跳轉到 HTTPS,讓你的網站全面進入安全模式!
修改
/etc/nginx/sites-available/default
設定檔:將以下內容寫入該檔案。請將your-domain.com
替換成你自己的域名,並將http://localhost:5000
替換為你的後端服務地址和埠。server { listen 443 ssl; # 監聽 443 埠,啟用 SSL server_name your-domain.com; # 上傳上限:20MB (如果之前設定過,可以保留) client_max_body_size 20m; # SSL 憑證路徑,指向 Certbot 生成的檔案 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 包含 Certbot 推薦的 SSL 設定 include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_pass http://localhost:5000; # 替換成你的後端服務地址和埠 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; 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 自動跳轉 HTTPS (301 Redirect) server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; }
程式碼範例:Nginx HTTPS 完整設定檔
同樣地,你可以使用
tee
命令將上述內容寫入檔案:sudo tee /etc/nginx/sites-available/default >/dev/null <<'EOF' server { listen 443 ssl; server_name your-domain.com; client_max_body_size 20m; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; } EOF
再次提醒: 將
your-domain.com
替換為你的實際域名,並將http://localhost:5000
替換為你的後端服務地址和埠。測試 Nginx 設定並重新載入:
sudo nginx -t && sudo systemctl reload nginx
如果一切順利,
nginx -t
應該會顯示test is successful
,並且 Nginx 服務會重新載入。現在,你就可以在瀏覽器中輸入你的域名,應該會自動跳轉到 HTTPS,並且看到網址列上的安全鎖了!恭喜你,你的網站已經成功升級 HTTPS 了!🎉
常見問題與排錯:別怕,你不是一個人!
在設定的過程中,難免會遇到一些「小插曲」或「小麻煩」。別擔心,這都是正常的!我整理了一些常見的問題和解決方案,讓你遇到困難時不再手足無措。這就像是你的「排錯錦囊」,遇到問題就打開它!
常見問題與解決方案對照表
問題描述 | 可能原因 | 解決方案 | 相關指令/參考 |
---|---|---|---|
nginx: [emerg] cannot load certificate | 憑證檔案不存在或路徑錯誤,通常發生在憑證尚未申請成功就配置 HTTPS。 | 先用 HTTP-only 模式啟動 Nginx,讓 Nginx 能正常運行,再執行 Certbot 申請憑證。憑證申請成功後,再將 Nginx 設定檔改回 HTTPS 版本。 | 參考文章中「步驟二:設定 Nginx 暫時版」與「步驟四:申請 Let's Encrypt 憑證」 |
Certbot 驗證失敗:Timeout during connect (likely firewall problem) | Certbot 無法從外部網路透過 80 埠存取你的 VM,通常是 DNS 解析錯誤、Azure NSG 或 VM 內部防火牆(UFW)未開放 80 埠。 | 1. 檢查 DNS A 記錄:確認你的域名已正確解析到 VM 的公用 IP。dig +short your-domain.com 。2. 檢查 Azure NSG:確保 80 埠的輸入規則已允許。3. 檢查 VM 內部防火牆 (UFW):如果啟用了 UFW,確保 80 埠已開放。sudo ufw status 。 | dig +short your-domain.com , Azure 入口網站 NSG 設定, sudo ufw allow 80/tcp , sudo ufw enable |
Nginx 服務無法啟動或重載 | Nginx 設定檔語法錯誤。 | 使用 sudo nginx -t 命令檢查設定檔語法。它會明確指出錯誤在哪一行。根據錯誤訊息修正後,再重新載入 Nginx。 | sudo nginx -t , sudo systemctl reload nginx |
上傳檔案過大導致錯誤 (413 Request Entity Too Large) | Nginx 預設的 client_max_body_size 限制了上傳檔案的大小。 | 在 Nginx 設定檔的 http 區塊或 server 區塊中,新增或修改 client_max_body_size 參數,例如 client_max_body_size 20m; 。 | 在 http { ... } 或 server { ... } 區塊中新增 client_max_body_size 20m; |
網站無法自動跳轉 HTTPS | Nginx 設定檔中沒有配置 HTTP (80 埠) 到 HTTPS (443 埠) 的 301 跳轉規則。 | 在 Nginx 設定檔中新增一個 server 區塊,監聽 80 埠,並使用 return 301 https://$host$request_uri; 進行跳轉。 | 參考文章中「步驟五:啟用 HTTPS」的 Nginx 完整設定檔 |
快速排錯小撇步:
- 善用
sudo nginx -t
:這是 Nginx 排錯的「瑞士刀」!每次修改設定檔後,務必先執行這個命令檢查語法。它會告訴你哪裡出錯了,精準又有效。 - 檢查日誌檔:Nginx 的日誌檔
/var/log/nginx/error.log
和/var/log/nginx/access.log
是排查問題的寶庫。當網站出現問題時,第一時間去查看這些日誌,通常能找到線索。 - 確認埠是否開放:使用
curl
命令從外部測試你的埠是否可達。例如:curl -I http://your-domain.com
(檢查 80 埠) 和curl -I https://your-domain.com
(檢查 443 埠)。如果連線逾時,很可能是防火牆問題。 - DNS 解析檢查:使用
dig
或nslookup
命令確認你的域名是否正確解析到你的 VM IP。dig +short your-domain.com
。 - 一步一步來:當遇到問題時,不要急著修改一大堆設定。回想一下你最近做了什麼修改,然後一步一步地排查。如果實在找不到問題,可以嘗試恢復到上一個正常工作的狀態。
記住,排錯的過程就像偵探辦案,需要耐心和細心。只要你掌握了這些工具和方法,大部分問題都能迎刃而解!
憑證自動續期:一勞永逸的秘訣
Let's Encrypt 憑證的有效期是 90 天。你可能會想:「天啊,每三個月就要手動續期一次,那不是很麻煩嗎?」別擔心!Certbot 早就幫你想好了,它有自動續期的機制,讓你幾乎可以做到「一勞永逸」!
Certbot 自動續期機制:certbot renew
命令
Certbot 提供了一個 renew
命令,可以自動檢查你的憑證是否即將過期,並嘗試進行續期。當憑證有效期少於 30 天時,certbot renew
就會嘗試續期。如果憑證還在有效期內,它就不會做任何操作。
你可以手動執行一次 certbot renew
來測試:
sudo certbot renew --dry-run
--dry-run
參數表示「模擬運行」,它會執行續期過程,但不會真正修改你的憑證。這是一個很好的測試方式,可以確保你的自動續期設定是正確的。
如果看到類似 The following certificates are not due for renewal yet:
的訊息,表示你的憑證還在有效期內,不需要續期。如果看到 Cert not due for renewal, but simulating renewal for dry run
,表示模擬續期成功。
Cron Job 設定:確保定期執行續期
為了讓憑證自動續期,我們需要設定一個定時任務(Cron Job),讓系統每天自動執行 certbot renew
命令。Certbot 在安裝時通常會自動幫你設定好這個 Cron Job,你可以在 /etc/cron.d/certbot
或 /etc/crontab
中找到相關設定。
Certbot 通常會建立一個每天執行兩次的 Cron Job,例如:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew
這個 Cron Job 會在每天的 0 點和 12 點執行 certbot renew
命令。perl -e 'sleep int(rand(3600))'
是一個小技巧,它會讓命令隨機延遲 0 到 3600 秒(1 小時)執行,這樣可以避免所有 Certbot 使用者在同一時間點向 Let's Encrypt 伺服器發送請求,減輕伺服器壓力。
如何檢查 Certbot 的 Cron Job 是否存在:
ls -l /etc/cron.d/certbot
如果檔案存在,通常就表示 Certbot 的自動續期已經設定好了。你也可以手動編輯 Crontab 來新增或修改定時任務:
sudo crontab -e
然後在檔案末尾新增一行(如果 Certbot 沒有自動設定的話):
0 0,12 * * * /usr/bin/certbot renew --quiet
這表示每天的 0 點和 12 點執行 certbot renew
命令,--quiet
參數表示安靜模式,只在有錯誤時才輸出訊息。
續期失敗的可能原因與解決方案
雖然 Certbot 自動續期很方便,但偶爾還是會遇到一些問題。以下是一些常見的續期失敗原因和解決方案:
- DNS 解析問題:如果你的域名 DNS 記錄發生變化,或者 DNS 服務出現問題,Certbot 可能無法驗證你的域名,導致續期失敗。請檢查 DNS A 記錄是否仍然指向你的 VM IP。
- 防火牆問題:如果 80 埠或 443 埠被防火牆阻擋,Certbot 無法進行 HTTP-01 挑戰,續期也會失敗。請檢查 Azure NSG 和 VM 內部防火牆設定。
- Nginx 設定檔問題:如果你在 Nginx 設定檔中做了不當的修改,導致 Nginx 無法正常啟動或處理 Certbot 的驗證請求,續期也會失敗。請確保你的 Nginx 設定檔語法正確,並且
.well-known/acme-challenge/
路徑可以被外部存取。 - Webroot 目錄不存在或權限問題:如果你移除了
/var/www/html
目錄,或者該目錄的權限不正確,Certbot 可能無法寫入驗證檔案。請確保該目錄存在且 Nginx 有讀寫權限。 - Certbot 版本過舊:雖然
snapd
會自動更新 Certbot,但如果你的 Certbot 版本過舊,可能會遇到一些已知問題。可以嘗試手動更新 Certbot:sudo snap refresh certbot
。
如果自動續期失敗,Certbot 會發送電子郵件通知你。所以,請務必在申請憑證時提供一個有效的電子郵件地址,並定期檢查你的信箱。
總結:你的網站,現在更安全、更專業!
恭喜你!走到這裡,你已經成功地在 Azure Linux VM 上,用 Nginx 搭配 Let's Encrypt 服務,為你的網站穿上了 HTTPS 的「安全防彈衣」!這不僅讓你的網站更加安全,保護了使用者資料,還能提升你的 SEO 排名,讓更多人找到你的網站。是不是很有成就感呢?
回顧一下,我們今天學到了什麼:
- Nginx:你的網站超級守門員,高效處理流量,提供靜態檔案服務和強大的反向代理功能。
- Let's Encrypt:免費、自動化、開放的 SSL/TLS 憑證提供者,讓 HTTPS 不再是高不可攀的技術。
- Certbot:Let's Encrypt 的官方客戶端工具,自動化憑證申請、安裝和續期,讓你省心省力。
- Azure Linux VM 環境準備:建立 VM、開放網路埠、設定 DNS,為網站上線打下堅實基礎。
- 手把手設定流程:從 Nginx 安裝、暫時版設定、Certbot 申請憑證,到最終啟用 HTTPS 和自動跳轉,每個步驟都清晰明瞭。
- 常見問題與排錯:遇到問題不再慌張,有了排錯錦囊,大部分問題都能輕鬆解決。
- 憑證自動續期:設定 Cron Job,讓你的憑證永不過期,一勞永逸。
現在,你的網站不僅安全滿分,還具備了專業級的 HTTPS 加密。這對於提升使用者信任、保護資料隱私,以及在競爭激烈的網路世界中脫穎而出,都至關重要。希望這篇文章能幫助你輕鬆搞定網站安全,讓你的網路事業更上一層樓!
別忘了,網路世界變化快速,持續學習和探索是保持領先的關鍵。如果你在實踐過程中遇到任何問題,或者有新的想法,都歡迎留言討論。我會盡力提供幫助!
祝你的網站安全又高效,流量滾滾來!下次見!👋