
很多站长在同一台VPS上托管多个域名,但如果每个站点都单独买证书,既麻烦又费钱。其实用Nginx反向代理配合Let’s Encrypt的Certbot工具,一条命令就能自动签发和续期证书。本文手把手教你从零配置一台Ubuntu VPS,让它同时托管多个HTTPS站点,证书全自动管理,完全不用操心。
一、环境准备:安装Nginx和Certbot
首先确保你的Ubuntu系统是最新的,然后安装Nginx和Certbot。Certbot是Let’s Encrypt官方推荐的证书管理工具,支持自动签发和续期。
# 更新系统包
sudo apt update && sudo apt upgrade -y
# 安装Nginx
sudo apt install -y nginx
# 安装Certbot及Nginx插件
sudo apt install -y certbot python3-certbot-nginx
# 启动Nginx并设置开机自启
sudo systemctl enable --now nginx
# 验证安装
certbot --version
nginx -v
安装完成后,确认防火墙放行了80和443端口。如果你使用UFW防火墙:
sudo ufw allow 'Nginx Full'
sudo ufw status
二、配置Nginx反向代理:多站点server块
假设我们要在同一台机器上托管两个站点:blog.example.com指向一个Node.js应用(端口3000),api.example.com指向一个Python Flask应用(端口5000)。每个站点都需要独立的server配置块。

先创建两个站点的配置文件:
# 博客站点配置
sudo tee /etc/nginx/sites-available/blog.example.com << 'EOF'
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
EOF
# API站点配置
sudo tee /etc/nginx/sites-available/api.example.com << 'EOF'
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF
# 启用站点配置
sudo ln -s /etc/nginx/sites-available/blog.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/api.example.com /etc/nginx/sites-enabled/
# 测试并重载
sudo nginx -t && sudo systemctl reload nginx
这里的关键参数说明:proxy_set_header X-Forwarded-Proto $scheme让后端应用知道原始请求是否是HTTPS,proxy_http_version 1.1支持WebSocket长连接。配置完成后先用80端口测试,确保反向代理工作正常再申请证书。
三、一键申请Let's Encrypt证书
Certbot的Nginx插件可以自动修改Nginx配置,加上SSL相关参数。一条命令搞定:
# 为两个域名同时申请证书
sudo certbot --nginx -d blog.example.com -d api.example.com
# 或者分别申请(更灵活)
sudo certbot --nginx -d blog.example.com
sudo certbot --nginx -d api.example.com
执行过程中Certbot会要求你输入邮箱(用于证书到期提醒)并同意服务条款。完成后,Certbot会自动修改Nginx配置,添加SSL证书路径、启用HTTPS监听,并配置HTTP到HTTPS的301跳转。
查看Certbot自动修改后的配置:
sudo cat /etc/nginx/sites-available/blog.example.com
你会看到Certbot自动添加了类似这样的内容:
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/blog.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
四、自动续期:设置定时任务

Let's Encrypt证书有效期只有90天,但Certbot内置了续期机制。我们只需要确认定时任务是否生效:
# 检查是否已有自动续期的systemd timer或cron
certbot renew --dry-run
# 查看系统自带的timer
systemctl list-timers | grep certbot
# 如果没有timer,手动添加cron任务
sudo crontab -e
# 添加以下行(每天凌晨2点尝试续期)
# 0 2 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"
--dry-run参数会模拟续期过程但不真正签发证书,用来验证配置是否正确。--deploy-hook确保续期成功后自动重载Nginx,让新证书生效。
五、进阶优化:安全加固与性能调优
基础配置跑起来之后,还可以做一些优化。创建一个全局的SSL安全配置文件,所有站点共享:
sudo tee /etc/nginx/snippets/ssl-params.conf << 'EOF'
# TLS版本限制
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';
# 会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
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;
# HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
EOF
然后在每个站点的server块中引用:
include /etc/nginx/snippets/ssl-params.conf;
此外,开启Gzip压缩可以显著提升页面加载速度:
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml;
总结
通过Nginx反向代理+Let's Encrypt的组合,一台VPS可以轻松托管多个HTTPS站点。核心要点如下:
- 分步推进:先配好反向代理确认HTTP能通,再申请证书,避免排查困难。
-
Certbot自动化:一条命令完成证书签发和Nginx配置修改,不需要手动拼SSL参数。
-
续期不能忘:用
certbot renew --dry-run验证自动续期是否正常工作。 -
安全加固:限制TLS版本、启用HSTS、开启OCSP Stapling,让HTTPS不仅有锁图标,还真正安全。
整套方案完全免费,适合个人站长和小团队使用。如果你的站点流量不大,一台最低配的VPS就能跑起多个HTTPS站点,性价比极高。
汤不热吧