You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.comapp2.my-domain.com),可以申请一个*.my-domain.com的通配符证书,这样所有二级域名都能用。申请通配符证书需要用DNS验证,命令大概是:
    sudo certbot certonly --manual --preferred-challenges=dns -d *.my-domain.com
    
    跟着提示在你的域名DNS服务商那里添加一条TXT记录,验证通过后就能拿到证书,然后手动把证书配置到Nginx的server块里就行。

4. 为啥不用在后端装SSL?

这是因为:

  • 如果你后端服务器和Nginx在同一个内网(比如都是Proxmox集群里的虚拟机),内网通信的安全性足够,没必要多此一举配置SSL;
  • 所有的SSL解密工作都在Nginx层完成,后端服务器不用处理SSL相关的计算,能减轻不少负担;
  • 统一在Nginx管理证书,不用给每个后端服务器单独申请、续期证书,维护成本低很多。

当然,如果你的后端服务器是公网的,那可以考虑用HTTPS转发,但大部分内网场景下HTTP完全够用。

最后提几个注意事项

  • 确保你的防火墙打开了80和443端口:sudo ufw allow 80/tcpsudo ufw allow 443/tcp,不然外部访问不了;
  • 测试一下证书自动续期:sudo certbot renew --dry-run,确保续期流程正常;
  • 如果后端服务器需要记录用户的真实IP,一定要保留配置里的X-Real-IPX-Forwarded-For这两个header,不然后端看到的都是Nginx的IP地址。

备注:内容来源于stack exchange,提问作者Asken

火山引擎 最新活动