mod_wsgi + Anaconda で undefined symbol: SSLv2_method

mod_wsgi + Anaconda で undefined symbol: SSLv2_method

(画像は anaconda (蛇)です。爬虫類が嫌いな方は済みません。)

先日行った、Caffe で推論処理を行う API サーバーの移行時に発生したエラーとその対処法シリーズの第二弾です。

関連エントリーは以下の通りです。

(移行後の)環境

第一弾で記載した内容を再掲します。

  • AWS Deep Learning AMI (Ubuntu、移行前は Amazon Linux 版の DL AMI)
  • その他の環境は変わらず
    • caffe_p27 環境
    • Apache 2.4
    • etc.

エラーとその原因

(この項は少し長いので、結論だけ知りたい人は、次の「対処法」に飛んで下さい。)

第一弾で無事に mod_wsgi をインストールすることが出来ました。その後、wsgi ファイルやプログラム(*.py)を所定の位置に配置した後で Apache を起動し、API サーバーを呼んでみたところ、以下のエラーが出ました。

[Sun Jan 27 06:36:34.315529 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586] mod_wsgi (pid=15448): Failed to exec Python script file '/var/www/foo-caffe-api/foo-caffe-api.wsgi'.
[Sun Jan 27 06:36:34.315574 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586] mod_wsgi (pid=15448): Exception occurred processing WSGI script '/var/www/foo-caffe-api/foo-caffe-api.wsgi'.
[Sun Jan 27 06:36:34.315596 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586] Traceback (most recent call last):
[Sun Jan 27 06:36:34.315614 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]   File "/var/www/foo-caffe-api/foo-caffe-api.wsgi", line 11, in <module>
[Sun Jan 27 06:36:34.315648 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]     from api_server import app as application
[Sun Jan 27 06:36:34.315663 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]   File "/var/www/foo-caffe-api/api_server.py", line 3, in
<module>
[Sun Jan 27 06:36:34.315676 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]     from flask import Flask
[Sun Jan 27 06:36:34.315689 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]   File "/home/ubuntu/anaconda3/envs/caffe_p27/lib/python2.7$site-packages/flask/__init__.py", line 21, in <module>
[Sun Jan 27 06:36:34.315701 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]     from .app import Flask, Request, Response
[Sun Jan 27 06:36:34.315735 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]   File "/home/ubuntu/anaconda3/envs/caffe_p27/lib/python2.7$site-packages/flask/app.py", line 25, in <module>
[Sun Jan 27 06:36:34.315791 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]     from . import cli, json
[Sun Jan 27 06:36:34.315819 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]   File "/home/ubuntu/anaconda3/envs/caffe_p27/lib/python2.7/site-packages/flask/cli.py", line 18, in <module>
[Sun Jan 27 06:36:34.315859 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]     import ssl
[Sun Jan 27 06:36:34.315881 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]   File "/home/ubuntu/anaconda3/envs/caffe_p27/lib/python2.7/ssl.py", line 97, in <module>
[Sun Jan 27 06:36:34.315916 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586]     import _ssl             # if we can't import it, let the error propagate
[Sun Jan 27 06:36:34.315947 2019] [wsgi:error] [pid 15448] [remote 127.0.0.1:49586] ImportError: /home/ubuntu/anaconda3/envs/caffe_p27/lib/python2.7/lib-dynload/_ssl.so: undefined symbol: SSLv2_method

Anaconda python と mod_ssl の互換性が無い?

エラーメッセージで検索してみると、原因としては以下に引用した通り Anaconda の Python は独自の SSL ライブラリが同梱されていて、mod_ssl (OpenSSL) と互換性が無い事、という情報がありました。

This is because Anaconda Python ships its own SSL libraries which aren’t compatible, and by having mod_ssl loaded, the system SSL libraries will get loaded first, resulting in any use of SSL in Python to fail.

how to use python 3.6.1 in an anaconda3 env w/ Apache + mod_wsgi + flask on aws ubuntu ec2 instance – Google グループ

ただ、 apache2ctl -M で読み込まれているモジュールも確認したのですが、mod_ssl は読み込まれていませんでした。

また、以下のページの情報に従って、anaconda3/envs/caffe_p27/lib/python2.7/site-packages/flask/cli.pyimport ssl をコメントアウトしたところ、このエラーは消えましたが、so ファイルが無いという別のエラーが出ました。

無料でHttps対応した自作Webサイトを公開する方法 | 自調自考の旅

必要な *.so ファイルが読み込まれていない

import sslを消しても、so ファイルが無いという別のエラーが出たことから考えると、SSL 関連の so ファイルが読み込まれていないのが原因と考えた方が良さそうです。

また、SSLv2_method で検索して出てきた以下のページを見ると、同メソッドは OpenSSL 1.0.2g で一度削除されて、その後復活したようです。

python – Why won’t Anaconda Jupyter Ipython notebook launch? – Stack Overflow

インストールされている OpenSSL のバージョンを確認すると、システムのものは 1.0.2g なのに対して、Anaconda のものはより新しいバージョンでした。

ubuntu@ip-nn-nn-nn-nn:~$ /usr/bin/openssl version
OpenSSL 1.0.2g  1 Mar 2016
ubuntu@ip-nn-nn-nn-nn:~$ ./anaconda3/envs/caffe2_p27/bin/openssl version
OpenSSL 1.0.2o  27 Mar 2018
ubuntu@ip-nn-nn-nn-nn:~$ which openssl
/home/ubuntu/anaconda3/bin//openssl
ubuntu@ip-nn-nn-nn-nn:~$ openssl version
OpenSSL 1.0.2n  7 Dec 2017

ということで、Anaconda 環境の各種 *.so が読み込まれるようにすれば、問題は解決しそうです。

対処法

/etc/apache2/envvars で適切な LD_LIBRARY_PATH を設定して、Apache を再起動すれば良いです。

設定すべき LD_LIBRARY_PATH を調べるには、以下のようにします。

ubuntu@ip-nnn-nnn-nnn-nnn:~$ source activate caffe_p27
(caffe_p27) ubuntu@ip-nnn-nnn-nnn-nnn:~$ printenv LD_LIBRARY_PATH
/usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/extras/CUPTI/lib64:/lib/nccl/cuda-8.0/lib:/usr/lib64/openmpi/lib/:/usr/local/lib:/usr/lib:/usr/local/mpi/lib:/lib/:/usr/lib64/openmpi/lib/:/usr/local/lib:/usr/lib:/usr/local/mpi/lib:/lib/::/home/ubuntu/anaconda3/envs/caffe_p27/lib/

envvars ファイルには、以下のような行を追加します。

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/extras/CUPTI/lib64:/lib/nccl/cuda-8.0/lib:/usr/lib64/openmpi/lib/:/usr/local/lib:/usr/lib:/usr/local/mpi/lib:/lib/:/usr/lib64/openmpi/lib/:/usr/local/lib:/usr/lib:/usr/local/mpi/lib:/lib/::/home/ubuntu/anaconda3/envs/caffe_p27/lib/

なお、AWS DL AMI のバージョンによって、 LD_LIBRARY_PATH は若干異なるので、同じエラーが起きた場合には、上の行をコピペするのではなく、必ずご自分で LD_LIBRARY_PATH を調べてから設定して下さい。

まとめ・雑感

(前回と同じ感想ですが)Amazon Linux と Ubuntu では結構違ってたので困りました。Amazon Linux の場合、システムの OpenSSL のバージョンが新しいようなので、このエラーが出なかったのかもしれません。

we are hiring

優秀な技術者と一緒に、好きな場所で働きませんか

株式会社もばらぶでは、優秀で意欲に溢れる方を常に求めています。働く場所は自由、働く時間も柔軟に選択可能です。

現在、以下の職種を募集中です。ご興味のある方は、リンク先をご参照下さい。