温馨提示:
本文所述内容不具普遍性,可能因操作环境差异而与实际有所出入,故请勿照搬照抄,仅供参考。
一、场景
使用 A 服务器的 80 端口作为入口,来访问 B 服务器的 443 端口上的网站;其中,反代代码如下:
server {
listen 80;
server_name _;
location / {
proxy_pass https://api.openai.com;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /var/log/nginx/openai.log;
error_log /var/log/nginx/openai.error.log;
}
二、问题
访问 A 服务器的 80 端口,任何链接都报 404 Not Found 错误;
三、分析
这个问题的原因是,A 服务器上的 Nginx 反代时,入口是 HTTP
,端口为 80
,默认传递到 B 服务器上 Host
以及 Port
,就变成了 server_name
里的 Host
,Port
就变成了 80
,即 B 服务器真正要去访问的应该是 https://api.openai.com
,但是接收到的头部信息却是 Host: _:80
,两边不一致,导致了这个错误。
四、方案
改善后,配置如下:
server {
listen 80;
server_name _;
location / {
proxy_pass https://api.openai.com;
proxy_redirect off;
proxy_set_header Host $proxy_host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_pass https://api.openai.com;
}
access_log /var/log/nginx/openai.log;
error_log /var/log/nginx/openai.error.log;
}
这里的 $proxy_host
就是上面 proxy_pass
里的地址,$proxy_port
就是 proxy_pass
里的端口(https 默认是 443)。
改好后重启 Nginx 服务,问题解决。
温馨提示:使用非官方接口,有被封禁的风险