《Nginx 从入门到实践》系列四:Nginx HTTPS 配置与安全加固

  • 发布时间:2025年7月19日

系列最后一篇,写 HTTPS 和安全加固。我自己的博客上线第一天其实只有 HTTP,后来有一天在浏览器地址栏看到"不安全"三个字,怎么看怎么别扭,就决定把 HTTPS 安排上。现在免费证书已经很成熟了,个人站点完全没必要在这上面花钱。

一、申请免费证书

我用的工具是 acme.sh,一个开源免费的 ACME 客户端,支持 Let's Encrypt 等免费证书机构。安装很简单:

curl https://get.acme.sh | sh

然后申请证书,-w 参数指定用于验证的网站根目录:

acme.sh --issue -d keyt.srwz.net -w /var/www/html

验证通过后,把证书安装到 Nginx 的证书目录:

acme.sh --install-cert -d keyt.srwz.net \
    --key-file /etc/nginx/ssl/keyt.key \
    --fullchain-file /etc/nginx/ssl/keyt.pem \
    --reloadcmd "systemctl reload nginx"

acme.sh 会自己处理证书的自动续期,装好之后基本不用管。我唯一踩过的坑是服务器时间不对导致验证失败,同步时间后就好了,如果你遇到类似问题可以先检查一下 date。

二、Nginx 配置 HTTPS

申请到证书后,在 server 块里加上:

server {
    listen 443 ssl;
    server_name keyt.srwz.net;

    ssl_certificate /etc/nginx/ssl/keyt.pem;
    ssl_certificate_key /etc/nginx/ssl/keyt.key;

    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';
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    # 其余配置同 HTTP
}

几个说明:ssl_protocols 我建议只留 TLSv1.2 和 TLSv1.3,老旧的 TLSv1.0/1.1 有已知漏洞,直接禁用;ssl_ciphers 用上面这组 GCM 套件,兼顾兼容性和性能;ssl_session_cache 开启会话缓存,可以减少重复握手,对访问速度有帮助。

三、HTTP 自动跳转 HTTPS

配好 443 之后,还要把 80 端口的流量导过去,不然用户访问 http:// 开头的链接还是明文:

server {
    listen 80;
    server_name keyt.srwz.net;
    return 301 https://$host$request_uri;
}

return 301 是永久重定向,搜索引擎也会把权重迁移到新地址。我当初直接用了 302,发现每次访问都要多一次跳转,改成 301 之后就好了。

四、安全加固清单

除了 HTTPS,我把自己的安全加固经验整理成了一份清单,都是几行配置就能完成的事:

  1. 隐藏版本号:server_tokens off;,避免暴露 Nginx 的具体版本,减少被针对性攻击的风险。
  2. 限制请求体大小:client_max_body_size 10m;,防止有人通过上传大文件拖垮服务器。
  3. 设置安全响应头:在 server 块里加上 add_header X-Frame-Options "SAMEORIGIN"; 防止点击劫持;add_header X-Content-Type-Options "nosniff"; 防止 MIME 类型嗅探。
  4. 屏蔽敏感文件:很多人会把 .git、.env 之类的文件传到服务器上,一旦被访问就是灾难,我加了这条规则:
location ~ /\.(git|env|svn) { deny all; }
  1. 后台路径加保护:我的管理后台不在默认路径上,并且用 allow/deny 限制了只允许自己的 IP 访问;如果用 Nginx 自带的 basic auth(htpasswd 生成密码文件)也很方便。
  2. 日志监控:每天扫一眼 error.log,异常请求量明显增多时及时处理。我遇到过一次接口被刷,就是靠日志发现的,这个经历以后单独写一篇。

五、验证配置

配置完成后,可以用 curl -I https://keyt.srwz.net 看响应头是否带上了安全字段,也可以去一些在线检测站点看看证书链和 TLS 配置的评分。我自己的检查顺序是:证书有效 → 301 跳转正常 → 响应头齐全 → 页面无混合内容(https 页面里不能有 http 资源)。

写在最后

到这里,《Nginx 从入门到实践》系列就写完了。从安装、location、反向代理到 HTTPS 和安全加固,这四篇覆盖了我从零开始折腾 Nginx 的主要经历。Nginx 还有很多高级玩法,比如限流、缓存、灰度发布,我后面用到的时候会继续写。如果你也在折腾服务器,欢迎在评论区交流,一起进步。