0

これは、私が最初から行ったことすべてを詳述する長い質問です。それが役に立てば幸い。私はdjangoアプリケーションに取り組んでおり、それを本番サーバーにデプロイする必要があります. 運用サーバーは IT 部門が管理する仮想サーバーであり、ルート アクセス権がありません。/swadm と /home/swadm にある私のモジュールのインストールを管理する権限を私に与えてくれました。そのため、次の配置を作成することを計画しました。

  • /swadm/etc/httpd/confhttpd.conf を維持する場所
  • /swadm/etc/httpd/user-modulesApache モジュール (mod_wsgi) を維持する場所
  • /swadm/var/www/django/appdjango コードを維持する場所
  • /swadm/usr/local/python/2.6ここで、django、south などのモジュールを使用して、python 2.6.7 のインストールを維持します。
  • /home/swadm/setupここで、必要なソース tarball を保存し、すべてのビルドとインストールを行います。
  • /home/swadm/workspaceここで、開発中のアプリケーション コードを保守します。

システムには python2.4.3 と python2.6.5 がインストールされていますが、多くのカスタム モジュールをインストールする必要がある場合は、独自の python インストールを維持することを IT が推奨しました (私はそうなります)。

そこで、python2.6.7 のソースをダウンロードしました。共有ライブラリが利用できるようにPythonがインストールされていることを確認する必要がありました。--enable-sharedオプションとのみを指定して構成スクリプトを実行すると--prefix=/swadm/usr/local/python/2.6、インストールされますが、驚くべきことにシステムの python2.6.5 のインストールを指します。

$ /swadm/usr/local/python/2.6/bin/python
Python 2.6.5 (r265:79063, Feb 28 2011, 21:55:45)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

そのため、 Building Python with --enable-shared in non-standard location as asの指示に従って、configure スクリプトを実行しました。

./configure --enable-shared --prefix=/swadm/usr/local/python/2.6  LDFLAGS="-Wl,-rpath /swadm/usr/local/python/2.6/lib"

また、予期されるエラーを回避するために、(リンクが示すように) 事前にディレクトリを作成したことを確認してください。入力/swadm/usr/local/python/2.6/bin/pythonすると、正しい python バージョン 2.6.7 が起動します。そこで、mod_wsgi の構成とインストールに進みました。として構成しました

./configure --with-python=/swadm/usr/local/python/2.6/bin/python

作成された Makefile はモジュールを にインストールしようとしました/usr/lib64/httpd/modulesが、そこに書き込み権限がないため、makefile を にインストールするように変更しました/swadm/etc/httpd/user-modules。(コマンドの引数があるかもしれませんが、私はそれを理解できませんでした)。モジュールは正常に作成されました。私が使用したテストwsgiスクリプトは

import sys

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'
    output = output + str(sys.version_info)
    output = output + '\nsys.prefix = %s' % repr(sys.prefix)
    output = output + '\nsys.path = %s' % repr(sys.path)
    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

そして、表示された出力は、驚くべきことに

Hello World!(2, 6, 5, 'final', 0)
sys.prefix = '/swadm/usr/local/python/2.6'
sys.path = ['/swadm/usr/local/python/2.6/lib64/python26.zip',    '/swadm/usr/local/python/2.6/lib64/python2.6/', '/swadm/usr/local/python/2.6/lib64/python2.6/plat-linux2', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-tk', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-old', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-dynload']`

したがって、mod_wsgi モジュールは、私のカスタムではなく、システムの python 2.6.5 インストールで構成されていることがわかります。mod_wsgiのドキュメントで詳しく説明されているさまざまなことを試しました

  • WSGIPythonHomehttpd.conf で to/swadm/usr/local/python/2.6および WSGIPythonPathto に設定します。/swadm/usr/local/python/2.6/lib/python2.6
  • libpython2.6.so ファイルを指すように、python config ディレクトリにシンボリックリンクを作成しました

    $ ln -s ../../libpython2.6.so

これを行うldd libpython2.6.soと、次のようになります。

$ ldd libpython2.6.so
 linux-vdso.so.1 =>  (0x00007fffc47fc000)
 libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b666ed62000)
 libdl.so.2 => /lib64/libdl.so.2 (0x00002b666ef7e000)
 libutil.so.1 => /lib64/libutil.so.1 (0x00002b666f182000)
 libm.so.6 => /lib64/libm.so.6 (0x00002b666f385000)
 libc.so.6 => /lib64/libc.so.6 (0x00002b666f609000)
 /lib64/ld-linux-x86-64.so.2 (0x00000031aba00000)

そしてldd mod_wsgi.so与える

$ ldd /swadm/etc/httpd/user-modules/mod_wsgi.so
 linux-vdso.so.1 =>  (0x00007fff1ad6e000)
 libpython2.6.so.1.0 => /usr/lib64/libpython2.6.so.1.0 (0x00002af03aec7000)
 libpthread.so.0 => /lib64/libpthread.so.0 (0x00002af03b270000)
 libdl.so.2 => /lib64/libdl.so.2 (0x00002af03b48c000)
 libutil.so.1 => /lib64/libutil.so.1 (0x00002af03b690000)
 libm.so.6 => /lib64/libm.so.6 (0x00002af03b893000)
 libc.so.6 => /lib64/libc.so.6 (0x00002af03bb17000)
 /lib64/ld-linux-x86-64.so.2 (0x00000031aba00000)

私はpythonとmod_wsgiを再インストールして再構成しようとしましたが、役に立ちませんでした。どこが間違っているのか教えてください。(とても長い文章で申し訳ありません)

TLDR ; root 以外のアクセス権を持つシステムには、デフォルトの python インストールがあります。私は自分の python と python モジュールを維持しています。mod_wsgi は、カスタム python で構成およびビルドされていますが、sys version_info とパスを出力するテスト スクリプトを実行すると、システムの python を指します。

更新:stackoverflowをブラウジングする際(以前に行うべきでした)、mod_wsgi python2.5 ubuntu 11.04の問題に関するGraham Dumpletonによるこの回答を見つけて、エラーを解決しました。今私がそうするときldd mod_wsgi.so、それがpythonの正しい共有ライブラリにリンクされていることがわかります。カスタムpythonインストールを使用して、DjangoとMySQLdbをインストールしました。そして今、私はこのエラーに直面しています:

The following error occurred while trying to extract file(s) to the Python egg
cache:
[Errno 13] Permission denied: '/var/www/.python-eggs'
The Python egg cache directory is currently set to:
/var/www/.python-eggs
Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

ということで、 の値を変更しましPYTHON_EGG_CACHEexport PYTHON_EGG_CACHE=/swadm/var/www/.python-eggs。しかし、私はまだ同じエラーが発生しています。さらに調べています。これを解決したら更新します。

4

1 に答える 1

2

WSGIスクリプトで環境変数を設定することで解決されたエッグキャッシュの問題:

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Access_Rights_Of_Apache_User

またはApache構成の場合:

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIPythonEggs http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess

後者の2つのうちどちらを使用するかは、emebeddedモードとdaemonモードのどちらを使用するかによって異なります。

于 2011-09-29T00:40:57.683 に答える