uwsgi python sslコンパイル問題レコード


昨日、geventを実行するときにsslが見つからなかったと言ったのは、python 2.7.6をデフォルトでコンパイルするときにsslのコンパイルがなかったからです.では、どうして持っていないのですか.主な原因はpythonが見つからなかったことです.関連するソフトウェアをユーザーディレクトリにインストールしているので、デフォルトの場所は見つかりません.そこでネットでどのようにコンパイルするかを探して、sslをコンパイルして、半日探した結果、基本的にModules/Setupを修正します.distの下のsslに関する内容は、環境変数を設定することで解決できる方法がないようで、このファイルを修正するしかない.
SSL=/home/ap/xxxx
_ssl _ssl.c \
        -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
        -L$(SSL)/lib64 -lssl -lcrypto

一つは上のSSLのパスを私のユーザーディレクトリに変更し、もう一つは-Lのパスをlib 64に変更しました.私の環境はx 86ですから.64なのでopensslは$HOME/lib 64の下に置かれています.
makeの時にはModules/Setupと言いました.distはModules/Setupより新しいので、カバーしました.makeの後はやはり_sslが見つかりませんでした:
Python build finished, but the necessary bits to build these modules were not found:
_bsddb _curses _curses_panel 
_sqlite3 _ssl _tkinter 
bsddb185 bz2 dbm 
dl gdbm imageop 
readline sunaudiodev
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

最後の行を見ると、setupを見てくださいというアドバイスがあります.pyはモジュールをどのようにチェックしますか.
それで私はsetupをコンパイルしました.pyは、まず501の左または行を追加します.
    inc_dirs = self.compiler.include_dirs[:]
    lib_dirs = self.compiler.library_dirs[:]
    lib_dirs.append('/home/ap/xxxx/lib64')

最後の行は私が追加したので、libのディレクトリを追加しました.それからまた844行ぐらいで、1行追加しました.
if have_any_openssl:
    if have_usable_openssl:
        ssl_libs.append('/home/ap/xxxx/lib64')
        # The _hashlib module wraps optimized implementations
        # of hash functions from the OpenSSL library.
ssl_libs.append('/home/ap/xxxx/lib64')行です.
そしてまたコンパイルに成功しました.さらにmake installを実行してユーザーディレクトリにインストールします.python環境に入るとimport sslが正しいです.
しかし、uwsgiを再コンパイルしたときに問題を発見しました.コンパイルの最後にエラーが発生しました.
/home/ap/xxxx/src/packages/build/Python-2.7.6/./Modules/_ssl.c:1280: undefined reference to `SSL_get_error'
/home/ap/xxxx/lib/python2.7/config/libpython2.7.a(_ssl.o): In function `_ssl_threadid_callback':
/home/ap/xxxx/src/packages/build/Python-2.7.6/./Modules/_ssl.c:1661: undefined reference to `CRYPTO_THREADID_set_numeric'
collect2: ld returned 1 exit status

ネットで調べたところ、-lsslが自動的に入っていなかった.でもどうして自動的に入れなかったの?やはりopensslをユーザーディレクトリにインストールしたからです.そこで実験を経て、コンパイル時にいくつかの環境変数を追加してこの問題を解決することができ、コンパイルコマンドは以下の通りである.
LDFLAGS="-L$HOME/lib64" UWSGI_INCLUDES=$HOME/include python uwsgiconfig.py --build

これが正しかった.そして、コンパイルしたuwsgiを$HOME/binの下のような場所にコピーします.
いくつかのパッケージが一般的なディレクトリの下にない場合、コンパイルは確かに面倒なことです.