1

httpd で django Web アプリを実行しています。

httpd.conf では、これが私が持っているものです。

Listen 8090
User ctaftest
Group ctaftest

そして、私が行うときにhttpdサーバーを起動した後 netstat -anp |grep httpd

私は得る

root     31621     1  1 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31625 31621  5 17:23 ?        00:00:02 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31626 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31627 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31628 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31629 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31646 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start

1 つのプロセスを除いて、他のすべての httpd プロセスは ctaftest ユーザーで実行されていることに注意してください。

これが私の問題です。

もしそうなら、私の見解の範囲内で、

dir_path = os.path.expanduser("~/dir_path")

/root/dirpath期待どおりの場所に到達しています/home/ctaftest/dirpath

注: Django 開発サーバー (runserver) を使用すると、期待どおりの出力が得られます。 /home/ctaftest/dirpath

httpd から実行すると問題が発生しctaftest、Django webapp を実行するときにユーザー自体を現在のユーザーとして取得するにはどうすればよいですか?httpd

4

3 に答える 3

1

まず、次のように呼び出します。

os.path.expanduser("dir_path")

次のように返されます。

dir_path

代わりに次のことを意味しましたか:

os.path.expanduser("~/dir_path")

とにかく、mod_wsgi の組み込みモードを使用すると、コードは Apache 子ワーカー プロセスで実行されます。これらのプロセスは、PHP や Perl モジュールなどの他の Apache モジュールと共有できます。これは共有環境であるため、mod_wsgi も Web アプリケーション コードも、プロセスの現在の作業ディレクトリを変更できると考えて、おこがましくなることはありません。その結果、現在の作業ディレクトリは、ファイル システムのルートとなる Apache の起動元から継承されます。

同様の理由で、どの環境変数が設定されているかをオーバーライドすることはできません。その結果、Apache が HOME を通過した場合、Apache が起動する root ユーザーとして、os.path.expanduser('~ ')、チルダは HOME が設定されたものに置き換えられます。

したがって、表示されているのは非常に正常であり、1 つのプロセスがまだルートとして実行されています。これは親 Apache プロセスであり、子ワーカー プロセスを管理するためのプロセス モニターとして機能するため、要求は実行されていません。再起動などを処理します。

一般に、Web アプリケーションでは、現在の作業ディレクトリ、HOME、USERNAME、PATH などの環境変数の値などに依存することは悪い習慣と見なされます。ホスティング環境。

つまり、mod_wsgi を使用するときに優先デーモン モードを使用すると、その時点では Python Web アプリケーションのみを実行しているため、mod_wsgi は HOME をオーバーライドして、デーモン プロセスを実行するユーザーのディレクトリにします。USER、USERNAME、LOGNAME などの環境変数が設定されている場合、同様に、デーモン プロセスを実行するユーザーに対応する値で上書きされます。現在の作業ディレクトリをそのユーザーのホーム ディレクトリに変更することもできます。

要約すれば。このような依存関係を Web アプリケーションに組み込むべきではありませんが、構成を介してそのようなものを指定してください。そうしないと、移植性が制限されます。何らかの理由でそれをしたくない場合は、代わりに mod_wsgi のデーモン モードを使用してください。

于 2013-09-17T01:27:52.983 に答える
0

それを解決するために、受け入れられた答えが役に立ちましたが、追加する必要がありました

`WSGIProcessGroup` directive also

ということで、こんな感じで構成しました。

WSGIDaemonProcess ctaf.com user=ctaftest group=ctaftest threads=10 python-path=/home/ctaftest/virtualpython/CTAFWEB_PRODUCTION/ctafweb

WSGIProcessGroup ctaf.com
于 2013-09-17T12:36:15.653 に答える