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. 获取Lets Encrypt免费SSL证书Lets 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域名证书提示Lets Encrypt证书有效期为90天但Certbot会自动设置定时任务在证书到期前续期。您可以通过以下命令测试自动续期是否正常工作sudo certbot renew --dry-run3. 配置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 valid300s; resolver_timeout 5s; # DH参数增强安全性 ssl_dhparam /etc/nginx/dhparam.pem; # HSTS头(强制HTTPS) add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload always; # 其他安全头 add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection 1; modeblock; # 网站根目录设置 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 StaplingOCSP Stapling可以减少客户端验证证书状态的时间ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid300s; resolver_timeout 5s;添加安全HTTP头add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload always; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection 1; modeblock;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;问题3SSL Labs评分不高确保使用TLS 1.2/1.3并禁用旧版本使用强加密套件启用OCSP Stapling配置HSTS头问题4HTTP/2不工作确认Nginx版本支持HTTP/21.9.5检查配置中是否正确添加了http2参数确保客户端支持HTTP/27. 高级配置与自动化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 DOMAINyourdomain.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 证书过期警告 adminexample.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是否正常工作检查服务器推送等高级功能WebPageTesthttps://www.webpagetest.org/全面评估网站性能可视化HTTPS对加载时间的影响Security Headers检查https://securityheaders.com/评估安全HTTP头的配置提供改进建议Mozilla Observatoryhttps://observatory.mozilla.org/全面的安全配置扫描根据最佳实践评分通过这些工具您可以全面了解当前配置的安全性和性能状况并根据建议进行进一步优化。