我正在继承这个托管在 EC2 实例上的旧 Django 项目。它曾经在 Heroku 上运行,并在 gunicorn 前面使用 Proximo 代理。现在它只运行一个包含以下内容的 systemd 脚本:
ExecStart=/bin/sh -c "bin/proximo gunicorn myApp.wsgi --config config/gunicorn.cfg"
现在,在大多数情况下,该系统似乎是稳定的,但时不时地,我们会在网站上收到 503 错误,即使实例是重复的并且位于负载均衡器后面。
显示的唯一相关错误是在网站关闭时 Apache 错误日志中:
[Wed Dec 27 18:01:20.487596 2023] [proxy:error] [pid 5912:tid 139805448980224] (2)No such file or directory: AH02454: HTTP: attempt to connect to Unix domain socket /var/run/rpc/xmlrpc.sock (localhost) failed
[Wed Dec 27 18:01:20.487636 2023] [proxy_http:error] [pid 5912:tid 139805448980224] [client 172.31.25.252:41564] AH01114: HTTP: failed to make connection to backend: httpd-UDS
因此,我自然而然地认为这是代理的问题,因此在脚本bin/proximo
之前将其删除gunicorn
。但是,自那时以来,该网站已多次关闭,我们可以看到负载均衡器中存在这个持续的不健康目标。我猜它正在一遍又一遍地尝试重新启动?它最终会自行解决,网站会重新上线,但就如何诊断而言,这确实令人费解。我尝试将所有请求记录到 Cloudwatch 以查看是否有任何突出之处,但事实并非如此。看起来一切如常,应用程序的 Django 层中没有 500 错误。这一切似乎都围绕着负载均衡器级别。
我有一个想法,就是在服务器上安装 XMLRPC。这似乎是一个 PHP 库,我不确定安装它会带来什么后果,但这是我的一个想法,尽管它并没有真正解释为什么会发生错误。
有一点我不太确定是否重要,那就是 Heroku 实例使用了旧的 Procfile,它仍然有proximo
运行服务器的命令。我最近删除了它,只是为了排除这种可能性,但我不明白 Procfile 怎么会在我们的 EC2 实例上导致这样的事情,因为我认为没有任何东西指向它。
无论如何,如果有人有任何想法并且可以让我参与进来,请分享!除了监控请求和服务器之外,我没有针对客户端的具体答案。这是一个旧的 Django 实例(我相信是 1.8),所以事情只是在坚持,我无法真正将事情迁移到较新的 Django + AWS 环境,除非基本上重写应用程序的大部分内容(目前正在进行中)。
谢谢阅读。
答案1
我发现安全扫描程序(我发现的 Zanshin.TenchiSecurity.com 扫描程序)可能会触发此错误,该扫描程序可能正在测试 CVE-2021-40438,并且实际上也会由此引发问题。我发现 zanshin 测试了类似“POST /service/?unix:/../../../../var/run/rpc/xmlrpc.sock|http://EQKk/wsrpc HTTP/1.1”的请求。从跟踪日志中,您可以看到这样的请求会导致代理工作程序重写以使用 unix 域套接字:
[Tue Apr 09 10:05:45.818935 2024] [proxy:trace2] [pid 13231] proxy_util.c(2098): [client 127.0.0.1:44300] *: rewrite of url due to UDS(/var/run/rpc/xmlrpc.sock): http://EQKk/wsrpc (proxy:http://EQKk/wsrpc)
[Tue Apr 09 10:05:45.818937 2024] [proxy:debug] [pid 13231] mod_proxy.c(1264): [client 127.0.0.1:44300] AH01143: Running scheme http handler (attempt 0)
[Tue Apr 09 10:05:45.818941 2024] [proxy_fcgi:debug] [pid 13231] mod_proxy_fcgi.c(1021): [client 127.0.0.1:44300] AH01076: url: http://EQKk/wsrpc proxyname: (null) proxyport: 0
[Tue Apr 09 10:05:45.818944 2024] [proxy_fcgi:debug] [pid 13231] mod_proxy_fcgi.c(1024): [client 127.0.0.1:44300] AH01077: declining URL http://EQKk/wsrpc
[Tue Apr 09 10:05:45.818947 2024] [proxy_wstunnel:debug] [pid 13231] mod_proxy_wstunnel.c(322): [client 127.0.0.1:44300] AH02450: declining URL http://EQKk/wsrpc
[Tue Apr 09 10:05:45.818952 2024] [proxy_http:trace1] [pid 13231] mod_proxy_http.c(1971): [client 127.0.0.1:44300] HTTP: serving URL http://EQKk/wsrpc
[Tue Apr 09 10:05:45.818963 2024] [proxy:debug] [pid 13231] proxy_util.c(2313): AH00942: HTTP: has acquired connection for (127.0.0.1)
[Tue Apr 09 10:05:45.818968 2024] [proxy:debug] [pid 13231] proxy_util.c(2366): [client 127.0.0.1:44300] AH00944: connecting http://EQKk/wsrpc to EQKk:80
[Tue Apr 09 10:05:45.818973 2024] [proxy:debug] [pid 13231] proxy_util.c(2403): [client 127.0.0.1:44300] AH02545: http: has determined UDS as /var/run/rpc/xmlrpc.sock
[Tue Apr 09 10:05:45.819029 2024] [proxy:debug] [pid 13231] proxy_util.c(2575): [client 127.0.0.1:44300] AH00947: connected /wsrpc to httpd-UDS:0
[Tue Apr 09 10:05:45.819088 2024] [proxy:error] [pid 13231] (2)No such file or directory: AH02454: HTTP: attempt to connect to Unix domain socket /var/run/rpc/xmlrpc.sock (127.0.0.1) failed
此子进程上的代理工作程序处于问题状态,因此使用此子进程的其他请求将无法继续尝试该 unix 域套接字:
[Tue Apr 09 10:07:22.634729 2024] [proxy_wstunnel:debug] [pid 13231] mod_proxy_wstunnel.c(322): [client 127.0.0.1:50022] AH02450: declining URL http://127.0.0.1:8080/favicon.ico, referer: http://localhost/test/
[Tue Apr 09 10:07:22.634733 2024] [proxy_http:trace1] [pid 13231] mod_proxy_http.c(1971): [client 127.0.0.1:50022] HTTP: serving URL http://127.0.0.1:8080/favicon.ico, referer: http://localhost/test/
[Tue Apr 09 10:07:22.634736 2024] [proxy:debug] [pid 13231] proxy_util.c(2313): AH00942: HTTP: has acquired connection for (127.0.0.1)
[Tue Apr 09 10:07:22.634740 2024] [proxy:debug] [pid 13231] proxy_util.c(2366): [client 127.0.0.1:50022] AH00944: connecting http://127.0.0.1:8080/favicon.ico to 127.0.0.1:8080, referer: http://localhost/test/
[Tue Apr 09 10:07:22.745178 2024] [proxy:error] [pid 13231] [client 127.0.0.1:50022] AH00898: DNS lookup failure for: httpd-UDS returned by /favicon.ico, referer: http://localhost/test/
因此,我推测您可能拥有一些较旧的 httpd 版本 2.4.48 及更早版本,其中的 mod_proxy 配置易受 CVE-2021-40438 攻击。更新 httpd 很重要,但在易受攻击的版本上,您可能会使用如下所示的重写规则来拒绝可能尝试通过其 uri 或查询字符串注入 unix 域套接字使用的请求:
RewriteEngine On
RewriteRule ^.*unix:.* - [F,L]
RewriteCond %{QUERY_STRING} ^.*unix:.*
RewriteRule .* - [F,L]