问题摘要
由于在我的家庭网络上设置了 Nginx 反向代理,我在服务器上托管的应用程序之一在我访问其 URL 时始终产生错误 502:Bad Gateway,其中至少有一个相应的错误 111(“连接被拒绝”) Nginx 错误日志。
系统详情
- 服务器(“我的域”):
- 操作系统:YunoHost v. 3.8.5.7(基于 Debian Stretch 的发行版)
- 硬件:一台旧台式电脑
- 网络连接:通过以太网电缆连接到我的路由器
- 反向代理:
- 操作系统:Raspbian GNU/Linux 10(破坏者)
- 硬件:树莓派 4 B 型
- 网络连接:通过 WiFi
网络流量的流向如下所示:
Internet -> Router -> Raspberry Pi reverse proxy -> [ MyDomain server -> internal reverse proxy ]
最后一步,“内部反向代理”,指的是由 YunoHost 系统自动配置和管理的 Nginx 反向代理,它允许托管和获取多个不同的服务。
问题详情
我使用 YunoHost 在我的家庭网络上的服务器上托管多项服务,包括calibreweb。我使用了多个域,但只有一个受到此问题的影响——我们称之为 MyDomain.com。
6 月 11 日,我在我的家庭网络上设置了 Raspberry Pi 反向代理,以便我可以将流量引导到两个独立的 YunoHost 服务器。在设置该代理之前,我可以导航到 MyDomain.com/calibre 并加载 calibreweb 服务。从那天起,导航到 MyDomain.com/calibre 会在我的浏览器中产生错误 502: Bad Gateway。当我检查/var/log/nginx/mydomain.com-error.log
MyDomain 服务器上的文件时,我看到了相应的错误消息:
2020/08/14 17:32:46 [错误] 23605#23605: *149804 connect() 在连接到上游时失败(111:连接被拒绝),客户端:192.168.0.179,服务器:mydomain.com,请求:“GET /calibre/ HTTP/1.0”,上游:“http://127.0.0.1:8083/calibre/”,主机:“mydomain.com”
/var/log/calibreweb/calibreweb-access.log
此外,自 6 月 11 日以来,该文件没有添加任何内容。
mydomain.com 域上的其他服务没有受到类似影响。我可以成功访问 mydomain.com/gitea、mydomain.com/wallabag 和 mydomain.com/wiki。只有 calibreweb 以这种方式失败。
预期行为
导航到 mydomain.com/calibre 会加载 Calibre Web 应用程序。
Nginx 配置文件
如上所述,这里有两个 Nginx 反向代理,我预计它们两者之间存在一些分歧会导致这个问题。第一个反向代理是 Raspberry Pi 代理,它根据请求将流量定向到我家庭网络上的不同机器。第二个反向代理是 MyDomain 机器上的 YunoHost 内置代理。
在Raspberry Pi 反向代理(遇到的第一个反向代理)上,/etc/nginx/sites-available/xanderwhart.us.conf
文件如下所示:
server {
server_name mydomain.com;
location / {
proxy_pass https://192.168.0.117;
proxy_redirect off;
proxy_read_timeout 60s;
proxy_set_header Host mydomain.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50M;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = mydomain.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name mydomain.com;
return 404; # managed by Certbot
}
在YunoHost 内置代理(遇到的第二个)上,这里是/etc/nginx/conf.d/mydomain.com.d/calibreweb.conf
:
location /calibre {
client_max_body_size 200M;
# Force usage of https
if ($scheme = http) {
rewrite ^ https://$server_name$request_uri? permanent;
}
proxy_pass http://localhost:8083;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Script-Name /calibre;
# proxy_set_header X-Remote-User $remote_user;
# Include SSOWAT user panel.
include conf.d/yunohost_panel.conf.inc;
}
我试过的
- 重启 Nginx 服务:没有任何变化
- 重新启动 Calibreweb 服务:没有任何变化
- 检查 calibreweb 的状态
systemctl status calibreweb
:报告已加载并处于活动状态 curl 127.0.0.1:8083
从 MyDomain 计算机上的会话执行:产生“卷曲:(7) 无法连接到 127.0.0.1 端口 8083:连接被拒绝”- 检查 MyDomain 计算机上的端口 8083 是否打开:它是
- 从同一网络上的台式计算机导航到http://192.168.0.117:8083/(MyDomain计算机的本地 IP 地址):“Firefox 无法与位于 192.168.0.117:8083 的服务器建立连接。”
怀疑和最后说明
根据这个问题的发生时间,我怀疑两个 Nginx 反向代理之间不兼容,但我不是一个知识渊博的网络管理员(我是一个完全的新手)来确定发生了什么。欢迎所有帮助;提前致谢。