web-dev-qa-db-ja.com

WSGIがUbuntuサーバーで「許可が拒否されました」と表示します。WSGISocketPrefix設定が機能しません

Ubuntu 10.04.3 LTS(lucid)でデーモンプロセスをサポートするmod_wsgiを使用してApache2を実行しようとしています。

問題は、WSGISocketPrefixディレクティブの動作構成を見つけることができないことです。私の設定は次のとおりです。

<VirtualHost *:80>
    ...

    WSGIDaemonProcess myapp threads=5
    WSGIScriptAlias / /var/www/myapp/myapp.wsgi
    <Directory /var/www/myapp>
        WSGIProcessGroup myapp
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

Apacheはrootとして実行されます。 Flask Pythonフレームワークを使用しているので、このチュートリアルに従いました: http://flask.pocoo.org/docs/deploying/mod_wsgi /#configuring-Apache 。他の設定がないと、503 Service Temporarily UnavailableHTTPエラーが発生しました。Apacheエラーログに次のメッセージが表示されました。

[Mon Oct 17 15:24:24 2011] [error] [client 90.181.85.69] (13)Permission denied: mod_wsgi (pid=21805): Unable to connect to WSGI daemon process 'kvinono' on '/var/run/Apache2/wsgi.16282.4.1.sock' after multiple attempts.

それから私はこれを見つけました: https://code.google.com/p/modwsgi/wiki/ConfigurationIssues#Location_Of_UNIX_Sockets 、それで私はWSGISocketPrefix私の頭に浮かんだ値に、常にApacheを再起動/リロードしようとし、それが機能するかどうかを確認しました。動作したことはなく、常に許可エラーが発生しました。別の場所でのみ発生します。ユーザー/グループをWSGIプロセスに設定しようとしました:

WSGIDaemonProcess myapp user=www-data group=www-data threads=5

...同時に、/ var/run/wsgiなどのフォルダーに適切なアクセス許可を設定しましたが、役に立ちませんでした。ルート/ルートとしてWSGIデーモンプロセスを実行することはできませんでした。Apacheはそれを許可しません。実際、WSGIは書き込みが可能で、すべてのアクセス許可が適切に設定されている場合、実際にソケットファイルをフォルダーに書き込みましたが、エラーは解決しませんでした。既存のソケットファイルを使用しても、まったく同じpermission deniedエラーが発生しました。さらに数回試行して組み合わせた後、WSGISocketPrefixを/ tmpに設定しようとしました。この場合も、WSGIはソケットファイルを作成できましたが、上記のエラーで「クラッシュ」しました。

私は今完全に必死です:-(あなたが私に火の周りで踊ってシャーマンの呪いを歌うように提案するなら、それが問題を解決するのに役立つ場合にのみそれをする準備ができています。

2
Honza Javorek

ApacheにITKMPMを使用しています。 mod_wsgi 3.3以降を使用する必要があります。これには、次の修正が含まれています。

Apache用のITKMPMに対してコンパイルすると、デーモンモードを使用している場合、デーモンプロセスのリスナーソケットは、デーモンプロセスが実行されているのと同じユーザーによって所有されているものとしてマークされます。これにより、少なくともITK MPMで処理される要求を、スクリプトと同じユーザーが所有するデーモンプロセスに送信できるようになります。問題を参照してください:

http://code.google.com/p/modwsgi/issues/detail?id=187

ただし、オペレーティングシステムが提供するバイナリだけを使用することはできません。利用可能なバイナリは、ワーカーおよびプリフォークMPM専用である可能性が高いためです。 ITK MPMの場合、ソースコードからmod_wsgiをコンパイルする必要があり、ワーカーまたはプリフォークMPM用ではなく、ITKMPM用の適切なヘッダーファイルをインストールする必要があります。これは、mod_wsgiソースコードに次のものがあるためです。

    if (!geteuid()) {
#if defined(MPM_ITK)
        if (chown(process->socket, process->uid, -1) < 0) {
#else
        if (chown(process->socket, ap_unixd_config.user_id, -1) < 0) {
#endif
            ap_log_error(APLOG_MARK, APLOG_ALERT, errno, wsgi_server,
                         "mod_wsgi (pid=%d): Couldn't change owner of unix "
                         "domain socket '%s'.", getpid(),
                         process->socket);
            return -1;
        }
    }

IOW、ITK MPMヘッダーが正しくインストールされていて、MPM_ITK #defineが見つかった場合にのみ、ITK MPMに正しく設定されたアクセス許可を設定する方法については、コンパイル時の選択です。

要約すると、次のことを行う必要があります。

(1)ITKMPMヘッダーファイルがインストールされていることを確認します。 Apacheのバイナリパッケージを使用している場合は、ApachedevパッケージのITKバリアントがあるかどうかを確認してください。

(2)公的にダウンロード可能なmod_wsgi3.3ソースパッケージで利用可能なソースコードからmod_wsgiをコンパイルしてインストールします

Mod_wsgiソースコードパッケージとインストール手順は、次の場所から入手できます。

http://www.modwsgi.org

1

グラハム・ダンプルトンの答えはうまくいくかもしれません、私はそれを試していません。 mod_wsgi 3.2を使用していますが、同じ問題が発生します。

問題は、WSGISocketPrefixが/ etc/httpd(または/ etc/Apache2)で始まり、単純な連結を使用していることのようです。したがって、構成に追加するとき

WSGISocketPrefix /var/run/wsgi

最終的にファイルを/ etc/httpd // var/run/wsgiに配置しようとします。何らかの理由で、このエラーはログに記録されません。

回避策?私はそれをそのように機能させました

WSGISocketPrefix ../../var/run/wsgi

プレフィックスとして「var/run/wsgi」(先頭に/を付けない)を使用してこれを発見し、ログで確認しました。

[Thu Feb 14 14:50:28 2013] [alert] (2)No such file or directory: mod_wsgi (pid=18702): Couldn't bind unix domain socket '/etc/httpd/var/run/wsgi.18702.0.1.sock'.

うまくいけば、これは最新バージョンで修正されますが、少なくともOS分散パッケージを使い続けることができます。

1
Jonathan Lynch