SSL 経由で API サービスを提供している 9 つの非標準ポート (8xxx) をリッスンするために Apache を使用する専用サーバーがあります。ポート 80 と 443 は、静的コンテンツと、他のサービスのステータスを示す「監視」サービスを提供するために使用されます。
数日後、Apache がサービス要求を目的のサービスではなくオーバーウォッチ サービスに送信しているように見えるため、サービスが失敗し始めます。Apache を再起動すると、この問題が再発するまで修正されます。
サービスは wsgi を使用して実装されます。
次のように構成された従来のピラミッド API サービスがあります。
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
WSGIDaemonProcess pyramid user=ubuntu group=ubuntu threads=4 \
python-path=/home/ubuntu/ev_mis/lib/python2.7/site-packages
WSGIScriptAlias /mis /home/ubuntu/ev_mis/mis.wsgi
<Directory /home/ubuntu/ev_mis>
WSGIProcessGroup pyramid
Order allow,deny
Allow from all
</Directory>
他の 8 つの API サービスは Django を使用し、次のように構成されています。
# Built automatically on Wed Sep 25 13:59:51 2013
Listen 8325
<VirtualHost _default_:8325>
DocumentRoot /usr/local/services/h/rb/mis/mis_site/mis_site
Alias /media /usr/local/services/h/rb/mis/mis_site/mis_site/media
Alias /static /usr/local/services/h/rb/mis/mis_site/mis_site/assets
<Directory /usr/local/services/h/rb/mis/mis_site/mis_site>
Order allow,deny
Allow from all
</Directory>
SetEnv DJANGO_SETTINGS_MODULE mis_site.settings.h
WSGIScriptAlias / /usr/local/orb_services/h/rb/mis/mis_site/mis_site/mis_site/wsgi.py
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/domain.crt
SSLCertificateKeyFile /etc/apache2/ssl/domain.key
SSLCertificateChainFile /etc/apache2/ssl/chain.crt
SSLOptions +StrictRequire
</VirtualHost>
最後に、オーバーウォッチ サービスの構成があります。
<VirtualHost *:80>
DocumentRoot /var/www
Alias /static /var/www/static
<Directory /var/www/>
Order allow,deny
Allow from all
</Directory>
Alias /thumbnails /var/www/thumbnails
<Directory /var/www/thumbnails>
Order allow,deny
Allow from all
</Directory>
WSGIScriptAlias / /var/www/overwatch/overwatch/wsgi.py
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
これは wsgi.py ファイルの例です。
import os
from os.path import abspath, dirname
from sys import path
from os import environ
SITE_ROOT = dirname(dirname(abspath(__file__)))
path.append(SITE_ROOT)
from django.core.wsgi import get_wsgi_application
def application(req_environ, start_response):
environ["DJANGO_SETTINGS_MODULE"] = req_environ.get("DJANGO_SETTINGS_MODULE",
environ.get("DJANGO_SETTINGS_MODULE",
None))
return get_wsgi_application()(req_environ, start_response)
例: https://example.com/はオーバーウォッチ ステータス テーブルを生成し、https ://example.com:8123/ data/ はいずれかのサービスのサービス データを生成します。
分析の結果、apache がオーバーウォッチ サービスへの呼び出しを誤って送信したことが明らかになりました。たとえば、https ://example.com:8123/data/ では、ページが見つかりませんでした。デバッグ トレースは、それが overwatch wsgi サービスによって提供されていることを示しています。
これが発生すると、Apache サービスを再起動するまで一貫して発生します。その後、再発するまで数日間は問題ありません。Apache は構成の問題を報告せず、正常に起動/再起動します。
現在、サーバーは非常に軽いテストトラフィックしか経験していませんが、すぐに稼働する予定であり、この問題に対処する方法がわかりません... nginx/警官のように感じるApacheの代わりにgunicorn。