1

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。

4

1 に答える 1