Nginx 配置 HTTPS 实战:Let‘s Encrypt 免费证书 + HTTP/2 开启指南
Nginx 配置 HTTPS 实战:Let‘s Encrypt 免费证书 + HTTP/2 开启指南
在当今互联网环境中,网站安全性已成为不可忽视的重要指标。HTTPS不仅能够保护用户数据免受中间人攻击,还能提升搜索引擎排名和用户信任度。本文将手把手带您完成从零开始配置Nginx服务器HTTPS的全过程,包括免费SSL证书的获取、Nginx配置优化以及HTTP/2协议的启用。
1. 准备工作与环境检查
在开始配置之前,我们需要确保服务器环境满足基本要求。首先确认您的服务器已经安装了Nginx,并且拥有一个可用的域名指向该服务器。
检查Nginx版本(建议使用1.15.0以上版本以获得完整HTTP/2支持):
nginx -v验证服务器80和443端口是否开放:
sudo ufw status如果防火墙未开放这些端口,可以使用以下命令开启:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw reload确保您的域名DNS解析已正确设置,可以通过ping命令验证:
ping yourdomain.com2. 获取Let's Encrypt免费SSL证书
Let's Encrypt是一个免费、自动化且开放的证书颁发机构,由非盈利组织Internet Security Research Group(ISRG)运营。我们将使用Certbot工具来获取和自动续期证书。
首先安装Certbot及其Nginx插件:
sudo apt update sudo apt install certbot python3-certbot-nginx获取SSL证书(将yourdomain.com替换为您的实际域名):
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.comCertbot将引导您完成以下步骤:
- 输入您的电子邮件地址用于紧急通知
- 同意服务条款
- 选择是否共享电子邮件地址
- 自动验证域名所有权
- 选择是否将所有HTTP流量重定向到HTTPS
成功获取证书后,Certbot会自动在Nginx配置中添加SSL相关设置。证书文件通常存储在以下位置:
/etc/letsencrypt/live/yourdomain.com/包含以下关键文件:
fullchain.pem:证书链文件privkey.pem:私钥文件chain.pem:中间证书cert.pem:域名证书
提示:Let's Encrypt证书有效期为90天,但Certbot会自动设置定时任务在证书到期前续期。您可以通过以下命令测试自动续期是否正常工作:
sudo certbot renew --dry-run
3. 配置Nginx支持HTTPS
虽然Certbot已经自动配置了基本SSL设置,但为了获得最佳性能和安全性,我们需要进行更细致的调整。以下是优化后的Nginx配置示例:
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomain.com www.yourdomain.com; # SSL证书配置 ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # SSL协议配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; 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_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # OCSP Stapling配置 ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # DH参数增强安全性 ssl_dhparam /etc/nginx/dhparam.pem; # HSTS头(强制HTTPS) add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # 其他安全头 add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; # 网站根目录设置 root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } # 静态资源缓存设置 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; add_header Cache-Control "public, no-transform"; } }要应用此配置,您需要先生成DH参数文件(这可能需要几分钟时间):
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048然后测试Nginx配置并重新加载:
sudo nginx -t sudo systemctl reload nginx4. 启用HTTP/2协议
HTTP/2是HTTP协议的重大升级,提供了多路复用、头部压缩、服务器推送等特性,可以显著提升网站性能。在Nginx中启用HTTP/2非常简单,只需在listen指令后添加http2参数:
listen 443 ssl http2; listen [::]:443 ssl http2;验证HTTP/2是否成功启用:
- 使用Chrome开发者工具,在Network标签页查看协议列
- 使用curl命令:
curl -I https://yourdomain.com在响应头中应该能看到HTTP/2 200字样
HTTP/2带来的主要优势包括:
| 特性 | 说明 | 性能提升 |
|---|---|---|
| 多路复用 | 单个连接上并行传输多个请求 | 减少连接建立开销 |
| 头部压缩 | 使用HPACK算法压缩HTTP头部 | 减少传输数据量 |
| 服务器推送 | 服务器可以主动推送资源 | 减少客户端请求次数 |
| 流优先级 | 可以指定资源加载优先级 | 优化关键渲染路径 |
5. 性能优化与安全加固
5.1 TLS性能优化
TLS握手是HTTPS连接建立过程中最耗时的部分之一。通过以下设置可以显著减少握手时间:
ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off;5.2 安全加固配置
禁用不安全的协议和加密套件:
ssl_protocols TLSv1.2 TLSv1.3; 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;启用OCSP Stapling:OCSP Stapling可以减少客户端验证证书状态的时间:
ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s;添加安全HTTP头:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block";5.3 静态资源优化
对于静态资源,设置适当的缓存策略可以显著提升性能:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; add_header Cache-Control "public, no-transform"; }6. 常见问题排查
在配置HTTPS过程中可能会遇到各种问题,以下是一些常见问题及解决方法:
问题1:证书验证失败
- 检查域名是否正确且DNS解析正常
- 确保服务器80端口对外开放(Certbot验证需要)
- 查看Certbot日志:
sudo journalctl -u certbot
问题2:混合内容警告
- 确保网页中所有资源(图片、CSS、JS等)都使用HTTPS URL
- 可以使用Content Security Policy(CSP)来阻止混合内容:
add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'";问题3:SSL Labs评分不高
- 确保使用TLS 1.2/1.3并禁用旧版本
- 使用强加密套件
- 启用OCSP Stapling
- 配置HSTS头
问题4:HTTP/2不工作
- 确认Nginx版本支持HTTP/2(1.9.5+)
- 检查配置中是否正确添加了
http2参数 - 确保客户端支持HTTP/2
7. 高级配置与自动化
7.1 多域名配置
如果您需要为多个域名配置HTTPS,可以这样设置:
server { listen 443 ssl http2; server_name domain1.com www.domain1.com; ssl_certificate /etc/letsencrypt/live/domain1.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain1.com/privkey.pem; # 其他配置... } server { listen 443 ssl http2; server_name domain2.com www.domain2.com; ssl_certificate /etc/letsencrypt/live/domain2.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain2.com/privkey.pem; # 其他配置... }7.2 自动化证书续期
虽然Certbot已经设置了自动续期,但我们可以添加一个钩子脚本在续期后重新加载Nginx配置。创建/etc/letsencrypt/renewal-hooks/post/reload-nginx.sh:
#!/bin/bash systemctl reload nginx然后赋予执行权限:
chmod +x /etc/letsencrypt/renewal-hooks/post/reload-nginx.sh7.3 监控证书过期
可以设置一个简单的监控脚本来检查证书过期时间:
#!/bin/bash DOMAIN="yourdomain.com" EXPIRY=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -dates | grep 'notAfter' | cut -d'=' -f2) EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s) NOW_EPOCH=$(date +%s) DAYS_LEFT=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 )) if [ $DAYS_LEFT -lt 30 ]; then echo "证书将在$DAYS_LEFT天后过期!" | mail -s "证书过期警告" admin@example.com fi将此脚本添加到cronjob中定期运行:
0 0 * * * /path/to/check_ssl_expiry.sh8. 性能测试与验证
配置完成后,建议使用以下工具验证您的HTTPS配置:
SSL Labs测试:https://www.ssllabs.com/ssltest/
- 提供详细的SSL/TLS配置评估
- 检查协议支持、加密套件、密钥强度等
HTTP/2测试:https://tools.keycdn.com/http2-test
- 确认HTTP/2是否正常工作
- 检查服务器推送等高级功能
WebPageTest:https://www.webpagetest.org/
- 全面评估网站性能
- 可视化HTTPS对加载时间的影响
Security Headers检查:https://securityheaders.com/
- 评估安全HTTP头的配置
- 提供改进建议
Mozilla Observatory:https://observatory.mozilla.org/
- 全面的安全配置扫描
- 根据最佳实践评分
通过这些工具,您可以全面了解当前配置的安全性和性能状况,并根据建议进行进一步优化。
