Nginx作为带SSL的Web代理的SSL配置与反向转发相关技术咨询
Nginx作为带SSL的Web代理的SSL配置与反向转发相关技术咨询
嘿,刚好我之前折腾过类似的配置,来给你唠唠清楚!核心结论先给你:完全可以只在Nginx代理这一层配置Let's Encrypt SSL,后端的Web服务器根本不用装SSL——你直接把Nginx对外的HTTPS请求转发到后端的80端口就行,既安全又省事儿,还能统一管理所有域名的证书。
下面给你一步步拆解操作:
1. 先把反向代理的基础配置搞定
在折腾SSL之前,先确保Nginx能正常把HTTP请求转发到后端服务器。
- 先在
/etc/nginx/sites-available/目录下新建一个域名的配置文件,比如my-domain.conf,内容大概是这样:server { listen 80; server_name my-domain.com; # 替换成你的实际域名 location / { # 这里填后端服务器的IP或内网域名+端口80 proxy_pass http://192.168.1.100:80; # 下面这些header很重要,能让后端知道真实的请求信息 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; } } - 把配置文件软链到启用目录:
sudo ln -s /etc/nginx/sites-available/my-domain.conf /etc/nginx/sites-enabled/ - 测试配置有没有语法错误:
sudo nginx -t,没问题就重启Nginx:sudo systemctl restart nginx
这时候你用浏览器访问http://my-domain.com,应该能正常看到后端服务器的内容了。
2. 用Certbot快速配置Let's Encrypt SSL
Certbot是Let's Encrypt官方推荐的工具,能自动帮你申请证书、配置Nginx,还能自动续期证书(毕竟Let's Encrypt证书只有90天有效期)。
- 先安装Certbot和Nginx插件:
sudo apt update && sudo apt install certbot python3-certbot-nginx - 运行Certbot自动配置SSL,把你的域名加进去(多个域名就用
-d逐个列出来):sudo certbot --nginx -d my-domain.com -d www.my-domain.com - 跟着提示走就行:输入邮箱、同意条款、选择是否把HTTP请求重定向到HTTPS(选2就行,强制HTTPS更安全)。
完事之后,Certbot会自动修改你的Nginx配置,把80端口的请求重定向到443,并且配置好SSL证书路径。你再访问https://my-domain.com,就能看到带锁的安全连接了。
3. 多域名的处理方式
如果你有很多域名要通过这个Nginx代理转发,有两种思路:
- 每个域名单独建配置文件:和上面步骤1一样,每个域名对应一个
.conf文件,然后分别用Certbot处理,这样每个域名都有独立的证书,管理起来更清晰。 - 用通配符证书:如果你的域名都是同一个主域名下的二级域名(比如
app1.my-domain.com、app2.my-domain.com),可以申请一个*.my-domain.com的通配符证书,这样所有二级域名都能用。申请通配符证书需要用DNS验证,命令大概是:
跟着提示在你的域名DNS服务商那里添加一条TXT记录,验证通过后就能拿到证书,然后手动把证书配置到Nginx的server块里就行。sudo certbot certonly --manual --preferred-challenges=dns -d *.my-domain.com
4. 为啥不用在后端装SSL?
这是因为:
- 如果你后端服务器和Nginx在同一个内网(比如都是Proxmox集群里的虚拟机),内网通信的安全性足够,没必要多此一举配置SSL;
- 所有的SSL解密工作都在Nginx层完成,后端服务器不用处理SSL相关的计算,能减轻不少负担;
- 统一在Nginx管理证书,不用给每个后端服务器单独申请、续期证书,维护成本低很多。
当然,如果你的后端服务器是公网的,那可以考虑用HTTPS转发,但大部分内网场景下HTTP完全够用。
最后提几个注意事项
- 确保你的防火墙打开了80和443端口:
sudo ufw allow 80/tcp、sudo ufw allow 443/tcp,不然外部访问不了; - 测试一下证书自动续期:
sudo certbot renew --dry-run,确保续期流程正常; - 如果后端服务器需要记录用户的真实IP,一定要保留配置里的
X-Real-IP和X-Forwarded-For这两个header,不然后端看到的都是Nginx的IP地址。
备注:内容来源于stack exchange,提问作者Asken




