我正在使用 Debian 9、Apache 2.4、mod_wsgi 4.5、django 1.11 和 python 2.7 运行 Web 应用程序。
我的 apache 配置是
ServerTokens Prod
ServerSignature Off
FileETag MTime Size
Header set X-Frame-Options SAMEORIGIN
<Location />
<LimitExcept HEAD GET POST PUT DELETE>
order deny,allow
deny from all
</LimitExcept>
</Location>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
WSGIRestrictEmbedded On
<VirtualHost *:443>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.<server name>$
RewriteRule ^(.*)$ https://<server name>/ [R=301,L]
SSLEngine On
SSLProtocol +TLSv1.1 +TLSv1.2
SSLHonorCipherOrder On
SSLCertificateFile /path/to/cert.crt
SSLCertificateKeyFile /path/to/key.key
#Change needed in release..This resolves cert issue.
SSLCertificateChainFile /path/to/ca.ca-bundle
ServerName <server name>
ServerAlias <secondary server name>
DocumentRoot /path/to/root
#Alias /robots.txt /path/to/root/robots.txt
#Alias /favicon.ico /path/to/root/images/favicon.ico
#Alias /fonts/ /path/to/root/fonts/
Alias /images/ /path/to/root/images/
Alias /style/ /path/to/root/style/
Alias /js/ /path/to/root/js/
Alias /admin/css/ /path/to/root/admin/css/
Alias /admin/img/ /path/to/root/admin/img/
Alias /admin/js/ /path/to/root/admin/js/
<Directory /path/to/root/>
Options -Indexes
# backwards compatibility with apache 2.2
Order allow,deny
Allow from all
# forward compatibility with apache 2.4
Require all granted
Satisfy Any
</Directory>
WSGIScriptAlias / /path/to/root/wsgi.py
WSGIPassAuthorization On
WSGIDaemonProcess <server name> processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup <server name>
<Directory /usr/local/www/wsgi-scripts>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
每天 apache 都会轮换其日志(使用 logrotate)并发出 greaceful restart(服务重新加载)。
但是,并非所有子进程都会退出。一个子进程挂了,apache 继续向其发送请求进行处理,但该子进程无法正常运行,不断输出以下错误消息到旧日志文件:
(2)没有这样的文件或目录:[客户端 [我的 ip]:50202] mod_wsgi(pid=32714):无法以 uid=33 的用户身份连接到 '/var/run/apache2/wsgi.2629.0.1.sock' 上的 WSGI 守护进程'[守护进程名称]'
这导致网络服务器返回 503。
正确重启后,问题将得到解决,持续一天,直到下一次日志轮换。
据我所知,孩子们应该完成他们正在做的事情然后退出,所以我想也许一些保持活动阻止了这一点(对该服务器进行了一些高频 api 调用),所以我尝试添加KeepAlive off
但没有成功。
有人知道这是怎么回事吗?谢谢。
编辑:作为一种解决方法,我编辑了 apache logrotate 文件,使其在轮换后重新启动,而不是重新加载。现在我得到了
child process 4591 still did not exit, sending a SIGTERM
和
child process 4591 still did not exit, sending a SIGKILL
我预计即使在进程未退出后重新加载也会发生这种情况。 apache 有这样的选项吗?