ApacheでPythonを動かしてみた(mod_wsgiをソースからインストール)
概要
Pythonを使って何かしたかったので、まずはサーバアプリとして公開する方法を調べてみました。 色々実現方法はあると思いますが、自分がイメージしやすいWebサーバのモジュールとして起動することにしました。
注意
ApacheでPythonを動かすためのmod_wsgiモジュールをこの記事ではソースからインストールしています。 しかし、そのすぐ後でyumでインストールしてみたらそっちの方が断然楽だったので、次の記事にまとめました。 本記事よりも、以下の記事を見る方が良いです。 ApacheでPythonを動かしてみた(bottle利用) - 薮蛇なエンジニアの開発備忘録
前提
Pythonはpyenvでインストール済みで、ApacheなどのWEBサーバは未インストール状態を想定しています。また、OSとPythonは以下の前提です。
Pythonのインストール方法:CentOSにPython環境を作ってみたまとめ - 薮蛇なエンジニアの開発備忘録
- CentOS6.7
- Apache2系
- Python 2.7.11
各種パッケージのインストール
必要なパッケージをインストール。
(参考サイト:さくらVPS(CentOS6) Python3.5とmod_wsgiの導入)
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel yum install -y httpd-devel python-devel pip install --upgrade pip
mod_wsgiインストール
ApacheでPythonを動かすためにはmod_wsgiというモジュールを入れる必要があるようです。wikipediaによるとWSGIはウィズギーと読むらしいです。
wgetで取ってきてmake installしたところ「オプションつけてPythonをコンパイルしなおせ」という旨のエラーが出てしまいました。指定されたオプションをつけてPythonをインストールしなおしました。
(参考サイト1:PL/Pythonの実行環境にpyenvでインストールしたPythonを使う - Qiita)
(参考サイト2:mod_wsgiのインストールと設定 - Qiita)
Pythonをコンパイルしなおしてmod_wsgiをインストール手順
CONFIGURE_OPTS="CFLAGS=-fPIC --enable-shared" pyenv install 2.7.11 cd /usr/local/src wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz tar zxvf mod_wsgi-3.3.tar.gz cd mod_wsgi-3.3 ./configure CFLAGS=-fPIC make make install
LoadModuleの設定
httpd.confを編集してモジュールを追加。
vim /etc/httpd/conf/httpd.conf
LoadModule wsgi_module modules/mod_wsgi.so
これでapacheを再起動しようとすると、libpython2.7.so.1.0が無いというエラーが出てしまいました。
エラー内容: /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_wsgi.so into server: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
ld.so.confにライブラリのパスを書くといいようです。
(参考サイト:CentOS 6.5にPython 2.7をインストールしApacheで使用 | Akashic Records)
find / -name libpython2.7.so.1.0 vim /etc/ld.so.conf #findした結果の /usr/local/src/pyenv/versions/2.7.11/lib/をファイル末尾に追記 ldconfig service httpd restart
これでhttpdを再起動できました。
Pythonファイルの作成
vim /var/www/html/sample.py
def application(environ,start_response): status = '200 OK' output = 'Hello World!' response_header = [('Content-type','text/plain'), ('Content-Length',str(len(output)))] start_response(status,response_header) return [output]
vim /etc/httpd/conf/httpd.conf
WSGIScriptAlias / /var/www/html/sample.py
これでapacheを再起動してブラウザからドキュメントルートにアクセスしたところ、Hello Worldが表示されました!
まとめ
色々と苦戦しましたが、Pythonが動かせるWEBサーバを立ち上げることができました。
Pythonサーバサイドプログラムの基本になっているらしいWSGIについて軽く調べましたが、Pythonサーバプログラムの共通ルールらしいという概要しか分からず、すぐには具体的なイメージを掴めませんでした。
次回はサーバサイドプログラムとして基本的なことをできるように調べようと思います。