super-mortal

Back

为网站配置SSL证书#

在同一个服务器上部署两个项目时,宝塔面板一键申请SSL证书的时候,会因为重定向问题导致验证失败,所以我学习了手动部署SSL证书的方法,做了这个笔记,以docker部署的项目为例(本文的Nginx是在主机上,监听的是主机端口),通过本文,可以确保申请的证书独立对应域名,让Nginx正确处理域名分流

一.确定docker映射到宿主机的端口#

  1. 理解端口映射
127.0.0.1:8088->80/tcp
        ↓       ↓  ↓
   主机端口 →  容器  协议
              端口
plaintext

含义:访问主机的 8088 端口 => 转发到容器的 80 端口

  1. 找到需要代理的端口,终端执行以下命令
docker ps --format "table {{.Names}}\t{{.Ports}}"
bash

找到要对外访问的容器,记下它的主机端口(冒号左边的数字)

二.创建 Nginx 配置文件#

假设

  • 你的域名:yourdomain.com
  • Docker 容器映射的主机端口:8088
  1. 创建配置文件
nano /usr/local/nginx/conf/conf.d/yourdomain.com.conf
bash
  1. 粘贴以下内容**(只需要把 yourdomain.com 和 8088 改成实际的值即可)**

三.申请 SSL 证书#

以 Let’s Encrypt 证书为例!Let’s Encrypt 是全球最受信赖的免费 CA,浏览器默认信任

  1. 先创建目录
mkdir -p /var/www/acme
mkdir -p /usr/local/nginx/conf/ssl/yourdomain.com
bash
  1. 申请 Let’s Encrypt 证书
/root/.acme.sh/acme.sh --issue -d yourdomain.com -w /var/www/acme --keylength ec-256 --server letsencrypt
bash

参数说明

参数含义
-d yourdomain.com要申请证书的域名
-w /var/www/acmeHTTP 验证目录(acme.sh 会在这个目录创建验证文件)
--keylength ec-256使用 ECDSA 256 位加密(更快更安全)
--server letsencrypt指定使用 Let’s Encrypt安装证书
  1. 安装证书到目录
/root/.acme.sh/acme.sh --install-cert -d yourdomain.com \
  --key-file /usr/local/nginx/conf/ssl/yourdomain.com/key.pem \
  --fullchain-file /usr/local/nginx/conf/ssl/yourdomain.com/fullchain.pem \
  --reloadcmd "nginx -s reload"
bash

四.证书到期更新#

Let’s Encrypt 的免费证书有效期是 90 天。安装的时候设置了--reloadcmd所以acme.sh 会在证书到期前 30 天自动续期,所以一般情况下不需要手动操作,安装时候就会自动设置定时任务每天检查

  1. 确认自动续期已配置
# 终端执行命令

crontab -l | grep acme.sh

# 正常输出,这是每天13点02分自动执行

2 13 \* \* \* "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
markdown
  1. 查看证书到期时间
# 查看所有证书

/root/.acme.sh/acme.sh --list

# 查看单个证书详情

/root/.acme.sh/acme.sh --info -d 你的域名
markdown
  1. 如果没有正确设置到定时任务自动续期,可以手动续期
# 强制续期(忽略是否到期)

/root/.acme.sh/acme.sh --renew -d 你的域名 --force

# 手动续期所有证书

/root/.acme.sh/acme.sh --cron --home "/root/.acme.sh"
markdown

五.测试并生效#

  1. 测试配置
/usr/local/nginx/sbin/nginx -t
bash
  1. 看到这些就对了:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
plaintext
  1. 重启 Nginx
/usr/local/nginx/sbin/nginx -s reload
bash

六.多个项目如何确保网站不互串#

  1. 检查现有配置
ls -la /usr/local/nginx/conf/conf.d/
bash

应该看到如下配置文件:

first.top.conf
second.top.conf
third.com.conf
plaintext
  1. 每个配置文件里的关键区别
网站server_nameproxy_pass
first.topfirst.tophttp://127.0.0.1:8317
second.topsecond.tophttp://127.0.0.1:8088
third.comthird.comhttp://127.0.0.1:8000

只要 server_name 不同,Nginx 就会精准匹配,互不干扰!

  1. 所以同一个服务器部署多个网站对应多个域名时,只需要在创建配置文件时候,正确填写对应的域名即可
# 1. 创建配置(改域名和端口)
nano /usr/local/nginx/conf/conf.d/实际域名.conf

# 2. 申请证书(改域名,必须加 --server letsencrypt)
/root/.acme.sh/acme.sh --issue -d 实际域名 -w /var/www/acme --keylength ec-256 --server letsencrypt

# 3. 安装证书(改域名)
/root/.acme.sh/acme.sh --install-cert -d 实际域名 \
  --key-file /usr/local/nginx/conf/ssl/实际域名/key.pem \
  --fullchain-file /usr/local/nginx/conf/ssl/实际域名/fullchain.pem \
  --reloadcmd "nginx -s reload"

# 4. 测试并重载
/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
bash

七.一键配置脚本#

整个流程相对来说不是很复杂不是很麻烦,但为了更加方便,我写了一键部署脚本,前提是nginx是通过编译安装的,当然里面也包含了一键安装nginx的脚本,目前已经开源,开源地址vps_tools

1.使用方法#

# 克隆仓库

git clone https://github.com/super-mortal/vps_tools.git

# 进入目录

cd vps_tools

# 给脚本添加执行权限

chmod +x ssl_cert.sh

# 运行交互式脚本

./ssl_cert.sh
markdown

2.注意事项#

# 先确认 443 端口真的是 Nginx 在监听
ss -tulnp | grep 443
# 查看 ufw 状态(Debian/Ubuntu)
ufw status
# 放行443端口(TCP协议,HTTPS标准端口)
ufw allow 443/tcp
# 重载防火墙规则,使配置生效
ufw reload
# 再次验证规则是否添加成功
ufw status
markdown

八.常见问题#

Q: 申请证书报错 “Can’t find directory”#

mkdir -p /var/www/acme
bash

Q: 申请证书报错 “Domain is not point to this server”#

域名 DNS 还没生效,等几分钟再试。或者检查域名 A 记录是否指向当前服务器 IP。

Q: HTTPS 能访问但显示不安全#

  1. 检查证书是不是 Let’s Encrypt:

    openssl x509 -in /usr/local/nginx/conf/ssl/你的域名/fullchain.pem -noout -issuer
    bash

    应该显示 Issuer: C = US, O = Let's Encrypt

  2. 如果不是 Let’s Encrypt,可能是其他的证书不受浏览器信任所以还是显示不安全,删除重新申请:

    /root/.acme.sh/acme.sh --remove -d 你的域名
    /root/.acme.sh/acme.sh --issue -d 你的域名 -w /var/www/acme --keylength ec-256 --server letsencrypt
    bash
  3. 如果是 Let’s Encrypt 的证书但仍然显示不安全,可能是浏览器缓存了旧的证书

为网站配置SSL证书
https://supermortal.cn/blog/wei-wang-zhan-pei-zhi-ssl-zheng-shu
作者 Mortal
发布时间 2026年3月24日
许可证 CC BY-SA 4.0