很多站长把网站跑起来之后,访问地址还是 http://,地址栏里一把灰色的"不安全"小锁。浏览器越来越严格,HTTP 站点不仅影响观感,还可能在统计和收录上吃亏。这篇文章就带你从零开始,在 VPS 上配置 Nginx 反向代理,并配上免费的 HTTPS 证书,实现全站加密。全程都是免费方案,照着做就能搞定。
一、为什么要用反向代理
反向代理最直接的作用,是把 80/443 端口的请求转发给后端程序。比如你的网站跑在 8080 端口的 Node.js 上,或者本机 9000 端口的 PHP-FPM 上,Nginx 接收外部请求后转发过去,用户完全感知不到后端细节。这样做的好处有三点:
1. 统一入口:域名和端口只需暴露一个 80/443,后端服务不用直接面对公网;
2. 性能提升:Nginx 对静态文件、连接复用、压缩的处理非常高效;
3. 方便加 HTTPS:证书和跳转逻辑都集中在 Nginx 一层,后端不用改代码。
二、安装 Nginx
以 Ubuntu/Debian 系统为例,先更新软件源再安装:
apt update && apt install -y nginx
CentOS/Rocky 系统则是:
yum install -y nginx
安装完成后启动并设置开机自启:
systemctl enable --now nginx
此时访问服务器 IP,看到 Nginx 的欢迎页就说明安装成功了。
三、配置反向代理
Nginx 的站点配置在 /etc/nginx/conf.d/ 目录下,我们新建一个站点文件,假设域名是 example.com,后端服务跑在 127.0.0.1:3000:
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
保存后先测试配置,再重载 Nginx:
nginx -t && systemctl reload nginx
如果你的后端是 PHP(比如常见的 LNMP 架构),location 里通常还要加上 try_files 和 fastcgi 相关的配置,原理是一样的:让 Nginx 把请求交给 PHP-FPM 处理。
四、申请免费的 HTTPS 证书
这里推荐使用 acme.sh,它比 certbot 更轻量,支持自动续期。先安装:
curl https://get.acme.sh | sh -s email=you@example.com
然后签发证书,HTTP 验证方式要求 80 端口可访问:
~/.acme.sh/acme.sh --issue -d example.com -d www.example.com --webroot /var/www/html
签发成功后,把证书安装到 Nginx 的证书目录:
~/.acme.sh/acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.pem \
--reloadcmd "systemctl reload nginx"
五、配置 HTTPS 并强制跳转
在原来的 server 块里加上 443 监听,并新建一个 80 端口的 server 块做跳转:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://127.0.0.1:3000;
# 其余 proxy_set_header 同上
}
}
重载后访问 https://example.com,看到小绿锁就说明全站加密已经生效。此时即使有人用 http 访问,也会被 301 自动跳到 https。
六、证书自动续期
acme.sh 安装时会自动添加定时任务,默认 60 天检查一次,到期前 30 天自动续期,无需手动干预。可以执行下面命令确认定时任务存在:
crontab -l | grep acme
如果看到类似 "0 0 * * * ...acme.sh..." 的记录,说明自动续期已经就位。这里提醒一下:续期依赖 80 端口验证,如果以后把 80 端口关了,记得改用 DNS API 方式续期。
七、常见问题排查
1. 证书签发失败:确认域名解析已经指向当前服务器,且 80 端口没有被防火墙拦截;
2. 502 Bad Gateway:一般是后端服务没启动,或者 proxy_pass 的地址端口写错了;
3. 强制跳转不生效:检查 80 端口的 server 块是否配置正确,并确认没有其他配置抢占 80;
4. 证书到期没续上:登录服务器执行 ~/.acme.sh/acme.sh --renew -d example.com 手动续期排查报错。
八、小结
Nginx 反向代理加 HTTPS 免费证书,是 VPS 建站最值得优先做好的两件事。前者让架构更清晰、性能更好,后者让网站更安全、更可信。整套方案零成本,配置一次之后基本可以长期不用管。如果你的 VPS 还在裸跑 http,建议今天就动手配起来。