配置 Nginx 以支持 HTTPS 是保障网站安全和提升用户信任的关键步骤。本指南将带你从零开始,完成证书准备、基础配置、安全加固、性能优化到最终的验证与维护,帮助你快速部署一个安全、高效的 HTTPS 。
第一步:准备 SSL证书
在配置 Nginx 之前,你需要为你的域名准备一份 SSL/TLS 证书。证书通常包含一个”证书文件”(`.crt` 或 `.pem`)和一个私钥文件(`.key`)。
你可以根据实际需求选择合适的证书类型:
证书类型 验证级别 适用场 特点
DV证书 (域名验证) 低 个人博客、测试环境、小型网站 仅验证域名所有权,颁发速度快(几分钟内),多为免费。
OV证书 (组织验证) 中 | 企业官网、展示型网站 | 验证企业身份,能在证书中看到公司信息,提升可信度。
EV证书 (扩展验证) 高 金融、电商、大型企业网站 | 验证最严格,在浏览器地址栏直接显示公司名称(绿色),但价格较高。
对于大多数用户,推荐使用 Let's Encrypt 提供的免费 DV 证书。你可以通过 `certbot` 工具快速获取并自动配置:
```bash
# 安装 Certbot 和 Nginx 插件(以 Ubuntu/Debian 为例)
sudo apt update
sudo apt install certbot python3-certbot-nginx
# 获取证书并自动修改 Nginx 配置
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
`certbot` 会自动处理证书的获取和安装,非常适合新手。如果无法使用自动工具,你也可以手动生成自签名证书用于测试环境。
第二步:配置 Nginx 基础 HTTPS 服务
获取证书后,就可以开始配置 Nginx 了。核心是创建一个监听 `443` 端口的 `server` 块,并指定证书和私钥的路径。
1. 编辑 Nginx 配置文件。通常位于 `/etc/nginx/sites-available/yourdomain.com`(具体路径可能因系统和安装方式而异)。
2. 添加以下基础 HTTPS 配置:
```nginx
server {
listen 443 ssl; # 监听 443 端口,并启用 SSL
server_name yourdomain.com www.yourdomain.com;
# 证书文件路径(如果使用 Certbot,路径会自动生成)
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# 网站根目录等其他配置
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
关键点:
- `listen 443 ssl;` 指令告诉 Nginx 在 443 端口启用 SSL/TLS 。
- `ssl_certificate` 和 `ssl_certificate_key` 的路径必须正确,且 Nginx 工作进程需要有读取私钥文件的权限。
3. 配置 HTTP 自动跳转 HTTPS:为了让所有访问者都使用安全连接,建议添加一个监听 80 端口的 `server` 块,将所有 HTTP 请求重定向到 HTTPS。
```nginx
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
# 301 永久重定向到 HTTPS 地址
return 301 https://$host$request_uri;
}
这样,当用户访问 `http://yourdomain.com` 时,会被自动转发到 `https://yourdomain.com`。
第三步:安全与性能深度优化
完成基础配置后,可以通过以下指令显著提升连接的安全性和握手性能。将这些指令添加到你的 HTTPS `server` 块中。
核心安全配置
```nginx
server {
listen 443 ssl http2; # 启用 HTTP/2 协议,提升页面加载速度
server_name yourdomain.com www.yourdomain.com;
# ... 证书配置 ...
# 1. 协议与加密套件
ssl_protocols TLSv1.2 TLSv1.3; # 仅启用安全的 TLS 协议版本
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; # 使用现代、安全的加密套件
ssl_prefer_server_ciphers on; # 优先使用服务器的加密套件顺序,而非客户端的
# 2. 密钥交换增强
ssl_ecdh_curve secp384r1; # 指定一个安全的椭圆曲线
ssl_dhparam /etc/nginx/dhparam.pem; # 使用至少2048位的DH参数,增强前向保密性
# 3. 启用 HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # 告诉浏览器在接下来的一年内强制使用 HTTPS 访问你的站点和所有子域名
# 4. 会话缓存(性能优化)
ssl_session_cache shared:SSL:10m; # 在工作进程间共享 10MB 的会话缓存,约可存储 40000 个会话
ssl_session_timeout 10m; # 会话超时时间
ssl_session_tickets off; # 禁用有安全风险的会话票据
# 5. OCSP Stapling (性能与隐私优化)
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s; # 使用公共 DNS 解析器查询证书状态
resolver_timeout 5s;
# ... 其他 location 配置 ...
}
注意事项:
- 生成 `dhparam.pem` 文件需要一些时间,请提前在服务器上执行:`sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048`。
- HSTS 的 `max-age` 值从短时间开始设置(如 5 分钟),确认无误后再逐步增加,避免因配置错误导致网站长时间无法访问。
第四步:验证、维护与排障
配置完成后,必须进行验证,并建立持续的维护机制。
1. 验证配置并重载服务
```bash
# 检查 Nginx 配置文件语法是否正确
sudo nginx -t
# 如果语法无误,平滑重载 Nginx 使配置生效
sudo nginx -s reload
# 或者
sudo systemctl reload nginx
2. 全面测试你的 HTTPS 网站
浏览器访问:用浏览器打开 `https://yourdomain.com`,查看地址栏是否有安全的“锁”形图标。
在线工具测试:访问 SSL Labs 的 SSL Server Test(`https://www.ssllabs.com/ssltest/`),输入你的域名,它会对你的 SSL/TLS 配置进行全面评分并提供详细报告,是检验配置是否安全的重要参考。
命令行测试:
```bash
# 使用 curl 查看连接详情
curl -vI https://yourdomain.com
# 使用 openssl 测试协议和证书
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
3. 证书自动续期:Let's Encrypt 证书有效期为 90 天。`certbot` 通常会自动添加定时任务(cron job)来续期。你也可以手动测试续期是否正常:
```bash
sudo certbot renew --dry-run
常见问题与注意事项
证书链不完整:如果浏览器提示证书不受信任,但证书又是从正规 CA 签发的,很可能是因为中间证书缺失。你需要将服务器证书与中间证书合并成一个 `.chained.crt` 文件供 Nginx 使用。Certbot 生成的 `fullchain.pem` 已经包含了完整的证书链。
私钥权限:确保私钥文件(`.key`)的权限是 `600`,即只有 root 用户可读写,防止泄露。
防火墙:确保服务器的防火墙放行了 443 端口(如 `ufw allow 443/tcp`)。
多 HTTPS 域名共用 IP:如果多个 HTTPS 域名共用同一个 IP 地址,浏览器可能会因为 SSL 握手发生在 HTTP 请求之前而收到默认证书。最佳实践是为每个 HTTPS 站点分配独立 IP,或者确保所有站点使用来自同一张多域名或通配符证书。
按照以上步骤操作,你就能成功地为 Nginx 配置一个既安全又高效的 HTTPS 服务。如果在配置过程中遇到任何具体的错误提示,欢迎随时咨询,我们会尽力帮你排查。