503 使用 apache/wsgi 在日志中没有任何痕迹
Posted
技术标签:
【中文标题】503 使用 apache/wsgi 在日志中没有任何痕迹【英文标题】:503 with no trace in the logs using apache/wsgi 【发布时间】:2019-05-19 20:54:30 【问题描述】:我的 Flask 应用定期返回 503 错误。我说不出原因。可能与负载有关。它不是系统的,因此不是文件权限问题。这更像是 10 个后续请求的 5 次。在浏览器中使用 F5 可以轻松重现。
我想调试它,但在日志中找不到任何内容。
我检查了 apache 主日志文件(访问/错误)和 VirtualHost 访问/错误日志文件。我已经尝试将LogLevel
设置为调试,但无济于事。
当应用程序返回一个503
(例如,将abort(503)
与 Flask 一起使用)时,错误会记录在虚拟主机访问日志中(这不是 apache 错误,所以它会记录在访问日志中)。它也记录在我的应用程序日志中,因为我的框架记录了所有 http 错误。
我过去一直遇到负载问题,没有可用的线程。这导致 apache 本身返回 503 错误,我很确定这些错误已记录在访问或错误日志中(很可能是错误)。
客户端怎么可能得到一个 503 并且日志中没有它的踪迹?
虚拟主机配置摘录:
ErrorLog $APACHE_LOG_DIR/my-app-error.log
CustomLog $APACHE_LOG_DIR/my-app-access.log combined
WSGIDaemonProcess my-app threads=5
WSGIScriptAlias /api /srv/my-app/application.wsgi process-group=my-app application-group=%GLOBAL
WSGIPassAuthorization On
<Location /api>
WSGIProcessGroup my-app
</Location>
<Directory /srv/my-app/>
Options FollowSymLinks
AllowOverride All
</Directory>
Debian Stretch、apache 2.4.25、mod_wsgi 4.5.11。
编辑 1:所有 WSGi 应用程序都受到影响
我们注意到同一 apache 实例上另一个虚拟主机中的另一个 wsgi 应用程序出现 503 错误。此应用程序处于轻负载(接近于零),因此它不应该是 503。但是,在加载默认 VHost 页面(“Apache2 Debian 默认页面”“它有效!”页面)时,我没有得到 503 .就像所有 WSGI 应用程序都存在某种 mod_wsgi 限制一样,但不是全局 apache 限制,因为只有 WSGI 应用程序受到影响。
编辑 2:重启 apache
systemctl reload apache2
不会改变任何东西。但是,systemctl restart apache2
暂时解决了它。直到下一次。
重启前
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2018-12-04 11:13:23 CET; 2 weeks 0 days ago
Process: 10023 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
Process: 536 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 977 (apache2)
Tasks: 133 (limit: 4915)
Memory: 1.7G
CPU: 6d 6h 3min 51.105s
CGroup: /system.slice/apache2.service
├─ 977 /usr/sbin/apache2 -k start
├─10066 /usr/sbin/apache2 -k start
├─10067 /usr/sbin/apache2 -k start
├─10068 /usr/sbin/apache2 -k start
├─10069 /usr/sbin/apache2 -k start
├─16834 /usr/sbin/apache2 -k start
└─16836 /usr/sbin/apache2 -k start
重启后
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-12-19 12:32:02 CET; 3s ago
Process: 11840 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
Process: 11735 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
Process: 11850 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 11854 (apache2)
Tasks: 79 (limit: 4915)
Memory: 125.3M
CPU: 4.080s
CGroup: /system.slice/apache2.service
├─11854 /usr/sbin/apache2 -k start
├─11855 /usr/sbin/apache2 -k start
├─11856 /usr/sbin/apache2 -k start
├─11857 /usr/sbin/apache2 -k start
└─11858 /usr/sbin/apache2 -k start
我在这里看到的差异是进程数(不知道如何得出结论)和内存使用量。好吧,应用程序似乎对内存有点贪婪,但我认为服务器可以处理。
【问题讨论】:
我在带有 libapache2-mod-wsgi 4.5.17 的 Ubuntu 18.04.2 中遇到了同样的问题。 【参考方案1】:以防万一:我们遇到了类似的问题,烧瓶 wsgi 应用程序间歇性地返回 503
(例如,每 5-10 个请求)。
手动测试显示相应的请求没有显示在 apache 访问日志中(而成功的请求没有)。
正如workaround 的回答所暗示的那样,apache 配置确实还包含其他应用程序的代理配置,我们将keepalive=On
关键字用于我们的ProxyPass
指令之一(不适用于flask 应用程序,但对于以相同前缀提供的另一个应用程序)。摘录:
<Location /curated-cofs>
WSGIProcessGroup curated-cofs # this is the flask app
</Location>
<Location /curated-cofs/optimade>
ProxyPass http://localhost:3759 keepalive=On timeout=1200
ProxyPassReverse http://localhost:3759
</Location>
我们实际上没有充分的理由在这里使用keepalive
关键字(没有内部防火墙)。
从 ProxyPass 指令中删除关键字似乎已经解决了烧瓶应用程序的 503
问题作为副作用。
【讨论】:
这个问题太老了,我不能再复制它了,但这可能会对未来的读者有所帮助。【参考方案2】:首先,您查看访问日志了吗?因为如果没有错误日志,这意味着服务器被访问过,所以访问日志中肯定有一些东西。 如果有,请检查 Flask 是否确实在服务。
其次,您是否在代理请求?如果这样做,请确保您的代理配置正常。
当然,请确保您的 mod_wsgi 配置为 correct
【讨论】:
> "我检查了 apache 主日志文件(访问/错误)和 VirtualHost 访问/错误日志文件。我尝试将 LogLevel 设置为调试,但无济于事。"以上是关于503 使用 apache/wsgi 在日志中没有任何痕迹的主要内容,如果未能解决你的问题,请参考以下文章
Django/mod_wsgi/Apache - mod_wsgi 没有使用为其编译的 Python 版本 - “ModuleNotFoundError: No module named 'math'
Apache / WSGI 和 PHP 突然无法连接到 MSSQL 服务器——站点宕机
Apache + mod_wsgi 与 nginx + gunicorn
Django:有没有办法从 mail_admins 日志处理程序中过滤掉 503“服务不可用”响应?
Apache mod_wsgi 使用的 python 版本与 python-path 和 WSGIPythonHome 中提到的不同