问题摘要
自从在我的家庭网络上设置了 Nginx 反向代理后,当我访问我服务器上托管的某个应用程序的 URL 时,它会持续出现错误 502:网关错误,并且 Nginx 错误日志中至少会出现一个相应的错误 111(“连接被拒绝”)。
系统详细信息
- 服务器(“MyDomain”):
- 操作系统:云诺主机v. 3.8.5.7(基于 Debian Stretch 的发行版)
- 硬件:一台旧台式电脑
- 网络连接:通过以太网电缆连接到我的路由器
- 反向代理:
- 操作系统:Raspbian GNU/Linux 10 (buster)
- 硬件:Raspberry Pi 4 Model 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:网关错误。当我检查/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”
此外,自 6 月 11 日以来,该文件没有添加任何内容/var/log/calibreweb/calibreweb-access.log
。
mydomain.com 域上的其他服务均未受到类似影响。我可以成功访问 mydomain.com/gitea、mydomain.com/wallabag 和 mydomain.com/wiki。只有 calibreweb 以这种方式失败。
预期行为
导航到 mydomain.com/calibre 加载 Calibre 网络应用程序。
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
:报告为已加载且处于活动状态 - 从 MyDomain 计算机上的会话执行
curl 127.0.0.1:8083
:产生“curl:(7)无法连接到 127.0.0.1 端口 8083:连接被拒绝” - 检查 MyDomain 计算机上的 8083 端口是否打开:
- 导航至http://192.168.0.117:8083/(MyDomain 计算机的本地 IP 地址)来自同一网络上的台式计算机:“Firefox 无法与 192.168.0.117:8083 的服务器建立连接。”
怀疑与结语
根据此问题发生的时间,我怀疑两个 Nginx 反向代理之间存在不兼容性,但我对网络管理员的知识不够丰富(我完全是新手),无法识别发生了什么。欢迎提供任何帮助;提前致谢。
答案1
好吧,我尝试卸载并重新安装 Calibreweb 包,这似乎解决了这个问题。虽然这并没有让我更深入地了解这个问题,但至少它已经解决了。