用 Nginx 部署网站并开启 HTTPS(Let's Encrypt 免费证书)
发布于 2026-10-28
这篇把一个静态网页部署到 VPS 上,并用 Let’s Encrypt 的免费证书开启 HTTPS。动态网站(WordPress、Node、Python 应用)的 HTTPS 部分也是同样的做法。
开始前请先完成新 VPS 到手先做这 6 件事,并确认防火墙放行了 80 和 443 端口。

第 1 步:安装 Nginx
sudo apt install -y nginx

装完后 Nginx 会自动启动。在浏览器打开 http://你的IP,能看到 “Welcome to nginx!” 就说明装好了。
第 2 步:放网页,写站点配置
新建网站目录,放一个首页:
sudo mkdir -p /var/www/mysite
echo '<h1>Hello from my VPS</h1>' | sudo tee /var/www/mysite/index.html
新建站点配置文件:
sudo nano /etc/nginx/sites-available/mysite
填入下面的内容,把 example.com 换成你的域名:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/mysite;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
按 Ctrl+O 保存、回车确认、Ctrl+X 退出。然后停用默认站点,启用新站点,检查配置:
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
sudo nginx -t

看到 syntax is ok 和 test is successful 后,重新加载 Nginx 让配置生效:
sudo systemctl reload nginx
在自己电脑上访问一下,能拿到刚才写的首页就对了:

第 3 步:把域名解析到 VPS
在域名的 DNS 管理后台(买域名的地方,或 Cloudflare、DNSPod 等)加两条记录:
| 类型 | 名称 | 内容 |
|---|---|---|
| A | @ | 你的 VPS IP |
| A | www | 你的 VPS IP |
解析一般几分钟生效。用 ping example.com 看返回的是不是你的 IP。
用 Cloudflare 并开了代理(橙色云朵)时,ping 到的是 Cloudflare 的 IP,这是正常的。申请证书前可以先关掉代理,证书签好再打开;或者保持代理开着,把 Cloudflare 的 SSL 模式设为“完全(严格)”。
第 4 步:用 Certbot 申请免费证书
安装 Certbot 和它的 Nginx 插件:
sudo apt install -y certbot python3-certbot-nginx
申请证书,Certbot 会自动修改 Nginx 配置、开启 HTTPS:
sudo certbot --nginx -d example.com -d www.example.com
第一次运行会让你填邮箱(证书快到期时提醒你)并同意服务条款。成功后会提示证书保存的位置。这时访问 https://example.com,浏览器地址栏就有小锁了。
申请失败最常见的三个原因:
- 域名还没解析到这台 VPS:先确认第 3 步生效。
- 80 端口没放行:Let’s Encrypt 要从外网访问你服务器的 80 端口做验证,检查
ufw和商家控制台的安全组。 - 申请太频繁:同一个域名短时间内失败太多次会被临时限制。调试时可以加
--dry-run参数先演练,不算次数。
第 5 步:确认证书会自动续期
Let’s Encrypt 证书有效期 90 天。用 apt 装的 Certbot 自带定时任务,到期前自动续期。用下面的命令演练一次续期,确认流程是通的:
sudo certbot renew --dry-run
看到 Congratulations, all simulated renewals succeeded 就没问题。下图是本站服务器的真实演练结果:

本站(vpsdigest.com)服务器上的续期演练,2026-10-28
之后更新网站
把新的网页文件覆盖到 /var/www/mysite,刷新浏览器就能看到,不用重启 Nginx。改了 Nginx 配置才需要 sudo nginx -t 检查后再 sudo systemctl reload nginx。