Nginx 部署 HTTPS 及 Let's Encrypt 证书全自动续签指南

前言:

为了提升网站的安全性和搜索引擎友好度,给网站部署 HTTPS 是必不可少的一环。本文将详细记录如何在 CentOS 环境下,使用 Nginx 部署 HTTPS,并通过 acme.sh 脚本实现 Let's Encrypt 免费证书的申请与全自动续签。

环境与路径约定(以本站为例):

  • 主域名:ynsstudy.cn (包含 www.ynsstudy.cn)
  • Nginx 安装目录:/usr/local/nginxvue
  • 前端静态文件目录:/var/www/vue_dist

一、 Nginx 配置 HTTP 自动跳转 HTTPS

在正式安装证书前,我们需要修改 Nginx 配置文件,将用户的 HTTP 访问请求自动重定向到 HTTPS,并为 HTTPS 服务预留好代码块和证书路径。

打开你的 nginx.conf,参考以下结构进行配置:

# 1. HTTP 自动跳转 HTTPS (监听 80 端口)server {
    listen80;
    server_name ynsstudy.cn www.ynsstudy.cn;
    
    # 301 永久重定向到 httpsreturn301 https://$host$request_uri;
}

# 2. HTTPS 核心业务服务 (监听 443 端口)server {
    listen443 ssl;
    server_name ynsstudy.cn www.ynsstudy.cn;

    # 证书绝对路径配置(稍后自动化脚本会将证书安装到这里)ssl_certificate /usr/local/nginxvue/ynsstudy.cn_bundle.crt;
    ssl_certificate_key /usr/local/nginxvue/ynsstudy.cn.key;
    
    # SSL 优化配置ssl_session_timeout5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_cipherson;

    # ========== 业务代理逻辑 ==========root /var/www/vue_dist;
    index index.html;

    # 前端 Vue SPA 路由兜底location / {
        try_files $uri $uri/ /index.html;
    }

    # 后端 API 反向代理示例(请根据实际后端地址修改)location /api/ {
        proxy_pass http://127.0.0.1:8080/; 
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

配置完成后,使用命令 /usr/local/nginxvue/sbin/nginx -t 测试语法是否正确。

二、 安装 acme.sh 自动化脚本 (国内服务器优化)

由于国内服务器直接访问 GitHub 可能存在网络超时问题,我们推荐使用 Gitee 镜像仓库来安装 acme.sh 工具。

# 1. 安装基础工具 git(如已安装可跳过)
yum install -y git

# 2. 克隆国内镜像仓库
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh

# 3. 执行安装(请将邮箱替换为你的真实邮箱,用于接收证书过期提醒)
./acme.sh --install -m your-email@example.com

# 4. 刷新环境变量让 acme.sh 命令全局生效
source ~/.bashrc

安装完成后,我们将默认的证书颁发机构从 ZeroSSL 切换为国内网络环境更稳定的 Let's Encrypt

acme.sh --set-default-ca --server letsencrypt

三、 申请并验证 SSL 证书

因为 Nginx 已经在运行,我们直接使用 Webroot 模式(通过本地网站的静态根目录)让 Let's Encrypt 完成域名的所有权验证。

执行以下申请命令:

acme.sh --issue -d ynsstudy.cn -d www.ynsstudy.cn -w /var/www/vue_dist

注:执行后耐心等待十几秒,当控制台输出绿色的 Cert success 时,即代表证书申请成功。

四、 将证书安装到 Nginx 并配置自动续签

申请成功后,千万不要直接复制 ~/.acme.sh/ 目录下的证书文件。我们需要使用 --install-cert 命令,让脚本把证书提取并覆盖到我们在 Nginx 中配置的指定路径,并绑定自动重启 Nginx 的动作。

复制执行以下完整命令:

acme.sh --install-cert -d ynsstudy.cn \
--key-file       /usr/local/nginxvue/ynsstudy.cn.key  \
--fullchain-file /usr/local/nginxvue/ynsstudy.cn_bundle.crt \
--reloadcmd     "/usr/local/nginxvue/sbin/nginx -s reload"

看到控制台输出 Reload successful 时,说明一切大功告成!

自动续签原理说明

acme.sh 此时已经在你的 Linux 系统中悄悄写入了一个 Cron 定时任务。系统每天会自动检查证书有效期,当证书剩余时间不足 30 天时,脚本会自动向 Let's Encrypt 重新申请,覆盖 /usr/local/nginxvue/ 下的旧证书文件,并自动执行 Nginx 的重载命令。全程零人工干预,一劳永逸。

排错小贴士:
如果在配置完成后,浏览器访问网站仍然显示旧的证书机构(如 TrustAsia)或显示“不安全”,通常是浏览器缓存或 Nginx 旧进程未完全释放导致。请尝试:

  1. 使用浏览器的无痕/隐私模式重新访问。
  2. 在服务器上硬重启 Nginx:
/usr/local/nginxvue/sbin/nginx -s stop
/usr/local/nginxvue/sbin/nginx