Я запускаю веб-приложение с Debian 9, Apache 2.4, mod_wsgi 4.5, django 1.11 и python 2.7.
Мой apache conf
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) и выполняет быстрый перезапуск (перезагрузка службы).
Однако не все дочерние процессы завершаются. Один из них зависает, и apache продолжает отправлять ему запросы для обработки, но этот дочерний элемент не может работать должным образом, постоянно выводя следующее сообщение об ошибке в старый файл журнала:
(2)No such file or directory: [client [my ip]:50202] mod_wsgi (pid=32714): Unable to connect to WSGI daemon process '[daemon process name]' on '/var/run/apache2/wsgi.2629.0.1.sock' as user with uid=33
Это заставляет веб-сервер возвращать 503.
После правильного перезапуска проблема решается в течение суток до следующей ротации журнала.
Насколько я понимаю, дети должны завершить все, что они делают, и выйти, поэтому я подумал, что, возможно, некоторые keep alive препятствуют этому (на этот сервер выполняются некоторые высокочастотные вызовы 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 такая опция?