有一個自己的項目需要上線,域名解析完成后,發現只能使用 http 協議,這在瀏覽器上會限制,提示用戶不安全,所以需要把 HTTP 升級成 HTTPS 協議,但又不想花錢。
前提條件:
-
已經配置好 Nginx 服務器
-
域名已解析到您的服務器 IP
-
已開放 80 和 443 端口(可在阿里云控制臺的安全組設置中配置)
獲取證書
我們先獲取證書,我使用的是「Let's Encrypt」,這是一家為6億多個網站提供免費 TLS 證書的非營利組織。
Let's Encrypt 提供免費的證書,有效期為 90 天,可以自動續期。
安裝證書
我們需要先安裝 Certbot 和 Nginx 插件:
# 安裝 EPEL 倉庫
sudo?yum install epel-release -y
# 安裝 Certbot 和 Nginx 插件
sudo yum install certbot python3-certbot-nginx -y
獲取,然后安裝證書
sudo certbot?--nginx?-d your-domain.com
-
在操作過程中,Certbot 會詢問幾個問題:
-
輸入您的郵箱地址(用于緊急續期通知和安全公告)
-
同意服務條款
-
是否愿意共享郵箱(可選)
-
是否希望將所有 HTTP 流量重定向到 HTTPS(建議選擇 2,完全重定向)
配置 Nginx
提供一個 AI 反饋的 Nginx 配置:???
server?{
? ??listen?443?ssl;
? ??server_name?example.com www.example.com;
? ??ssl_certificate?/path/to/your/certificate.crt;
? ??ssl_certificate_key?/path/to/your/private.key;
? ??# 其他 SSL 配置
? ??ssl_protocols?TLSv1.2?TLSv1.3;
? ??ssl_prefer_server_ciphers?on;
? ??ssl_ciphers?ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
? ??# 網站根目錄等配置
? ??root?/var/www/html;
? ??index?index.html;
? ??# 其他配置...
}
# HTTP 重定向到 HTTPS
server?{
? ??listen?80;
? ??server_name?example.com www.example.com;
? ??return?301?https://$host$request_uri;
}
另外提供一個 Apache 的配置???????
<VirtualHost *:443>
? ??ServerName?example.com
? ??ServerAlias?www.example.com
? ??SSLEngine?on
? ??SSLCertificateFile?/path/to/your/certificate.crt
? ??SSLCertificateKeyFile?/path/to/your/private.key
? ??# 其他配置
? ??DocumentRoot?/var/www/html
? ??# 其他設置...
</VirtualHost>
# HTTP 重定向到 HTTPS
<VirtualHost *:80>
? ??ServerName?example.com
? ??ServerAlias?www.example.com
? ??Redirect?permanent / <https://example.com/>
</VirtualHost>
檢查 Nginx 配置
配置好以后,您可以檢查 Nginx 的配置,
sudo?cat?/etc/nginx/conf.d/your-config-file.conf
我服務器上 Nginx 的內容如下:???????
server?{
? ??listen? ? ? ?80;
? ??listen? ? ? ?[::]:80;
? ??server_name? your-domain.com;
? ??# 添加網站根目錄
? ??root?/usr/share/nginx/your-domain;
? ??# 為 Let's Encrypt 驗證添加特殊處理
? ??location?/.well-known/acme-challenge/ {
? ? ? ? ? ??allow?all;
? ? }
? ??# 其他請求繼續重定向到 HTTPS
? ??location?/ {
? ? ? ? ? ??return?301?https://$server_name$request_uri;
? ? }
}
# HTTPS server
server?{
? ??listen? ? ? ?443?ssl http2;
? ??listen? ? ? ?[::]:443?ssl http2;
? ??server_name? your-domain.com;
? ??client_max_body_size?50M;
? ??# 下載優化
? ??proxy_buffer_size?128k; ? ? ? ? ? ? ? ? ??# 代理響應的緩沖區大小
? ??proxy_buffers?4?256k; ? ? ? ? ? ? ? ? ? ??# 緩沖區數量和大小
? ??proxy_busy_buffers_size?256k; ? ? ? ? ? ??# 繁忙時緩沖區大小
? ??proxy_temp_file_write_size?256k; ? ? ? ? ?# 臨時文件寫入大小
? ??# 開啟 gzip 壓縮
? ??gzip?on;
? ??gzip_min_length?1k;
? ??gzip_comp_level?6;
? ??gzip_types?text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
? ??# 修改證書路徑為 Let's Encrypt 的證書路徑
? ??ssl_certificate? ? ?/etc/letsencrypt/live/your-domain.com/fullchain.pem;
? ??ssl_certificate_key?/etc/letsencrypt/live/your-domain.com/privkey.pem;
? ??ssl_session_cache?shared:SSL:1m;
? ??ssl_session_timeout??10m;
? ??ssl_ciphers?PROFILE=SYSTEM;
? ??ssl_prefer_server_ciphers?on;
? ??# 添加反向代理配置
? ??location?/ {
? ? ? ??proxy_pass?<http://localhost:3100>;
? ? ? ??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;
? ? }
? ??# Load configuration files for the default server block.
? ??include?/etc/nginx/default.d/*.conf;
? ??error_page?404?/404.html;
? ? ? ??location?= /40x.html {
? ? }
? ??error_page?500?502?503?504?/50x.html;
? ? ? ??location?= /50x.html {
? ? }
}
自動續期腳本
如果到期怎么辦?
我們可以設置自動續期的腳本:
確認當前狀態???????
# 檢查 Certbot 版本
certbot?--version
# 查看當前證書信息
sudo certbot certificates
測試續期功能
# 執行干運行測試,不實際更新證書
sudo?certbot renew --dry-run
創建腳本
sudo nano?/usr/local/bin/renew-letsencrypt.sh
添加內容:???????
#!/bin/bash
# 日志文件
LOG_FILE="/var/log/letsencrypt-renewal.log"
DATE=$(date?"+%Y-%m-%d %H:%M:%S")
# 記錄開始信息
echo?"[$DATE] 開始證書續期檢查..."?>>?$LOG_FILE
# 執行續期操作并記錄輸出
RENEWAL_OUTPUT=$(certbot renew --quiet 2>&1)
RENEWAL_STATUS=$?
# 檢查續期狀態
if?[?$RENEWAL_STATUS?-eq 0 ];?then
? ??echo?"[$DATE] 證書檢查/續期成功"?>>?$LOG_FILE
? ??# 檢查是否有證書被實際更新
? ??if?echo?"$RENEWAL_OUTPUT"?| grep -q?"renewal";?then
? ? ? ??echo?"[$DATE] 檢測到證書已更新,重新加載 Nginx"?>>?$LOG_FILE
? ? ? ? systemctl reload nginx
? ? ? ? NGINX_STATUS=$?
? ? ? ??if?[?$NGINX_STATUS?-eq 0 ];?then
? ? ? ? ? ??echo?"[$DATE] Nginx 重新加載成功"?>>?$LOG_FILE
? ? ? ??else
? ? ? ? ? ??echo?"[$DATE] 錯誤:Nginx 重新加載失敗,返回碼:?$NGINX_STATUS"?>>?$LOG_FILE
? ? ? ??fi
? ??else
? ? ? ??echo?"[$DATE] 沒有證書需要更新"?>>?$LOG_FILE
? ??fi
else
? ??echo?"[$DATE] 錯誤:證書續期失敗,返回碼:?$RENEWAL_STATUS"?>>?$LOG_FILE
? ??echo?"[$DATE] 錯誤詳情:?$RENEWAL_OUTPUT"?>>?$LOG_FILE
fi
echo?"[$DATE] 證書續期流程完成"?>>?$LOG_FILE
echo?"----------------------------------------"?>>?$LOG_FILE
設置執行權限
sudo?chmod?+x /usr/local/bin/renew-letsencrypt.sh
創建任務
sudo?crontab -e
添加以下內容:???????
# 每天凌晨 2:15 和下午 2:15 運行證書續期
15?2,14?* * * /usr/local/bin/renew-letsencrypt.sh
驗證任務設置
sudo?crontab -l
設置每周運行一次???????
sudo?chmod?+x /usr/local/bin/renew-letsencrypt.sh
sudo crontab -e
每周檢查一次???????
# 每周一上午9點檢查證書狀態
0?9?* *?1?/usr/local/bin/renew-letsencrypt.sh
手動續簽腳本???????
# 執行腳本
sudo /usr/local/bin/renew-letsencrypt.sh
# 檢查文件輸出
sudo?tail?-f /var/log/letsencrypt-renewal.log
查看證書信息
sudo?certbot certificates
會顯示出「已安裝證書的域名、存儲位置、到期日期、續期設置」證書有效期
比如:從 2025-04-21 到 2025-07-20(共 90 天,符合 Let's Encrypt 標準)。
Certbot 會在到期前 30 天(即 2025-06-20 左右)自動嘗試續期(你之前的 -dry-run 測試已確認續期配置正常)。
無需手動操作,除非續期失敗。