Windows + Apache2.4 + mod_wsgiにて、virtualenv環境のWSGIアプリ(Bottle)を動かす

前回Windows環境でmod_wsgiをビルドしてApache2.4にて動作することを確認しました。

mod_wsgiの公式ドキュメントを参考に、今回はvirtualenv環境のWSGIアプリ(Bottle)を動かしてみます。
mod_wsgi — mod_wsgi 4.5.2 documentation

 

環境

 

Bottleアプリの作成

virtualenv環境構築し、Bottleを入れます。

d:\Sandbox\mod_wsgi_bottle>virtualenv -p c:\python35-32\python.exe env
d:\Sandbox\mod_wsgi_bottle>env\Scripts\activate
(env) d:\Sandbox\mod_wsgi_bottle>pip install bottle
...
Successfully installed bottle-0.12.9

 
Bottleの公式ドキュメントを参考にして、アプリを作成します。
Deployment — Bottle 0.13-dev documentation

D:\Sandbox\mod_wsgi_bottle\app.wsgi

import os
import bottle
from bottle import route

# Change working directory so relative paths (and template lookup) work again
os.chdir(os.path.dirname(__file__))

# Bottle app
@route('/')
def index():
    return 'はろー Bottle!'


# Do NOT use bottle.run() with mod_wsgi
application = bottle.default_app()

 
なお、Bottleアプリの文字コードUTF-8で保存します。SJISで保存した場合、Internal Server Errorエラーが返り、ログ(C:\Apache24\logs\error.log)に以下が記録されます。

SyntaxError: Non-UTF-8 code starting with '\\x82' in file D:/Sandbox/mod_wsgi_bottle/app.wsgi on line 27, but no encoding declared

 

Apacheの設定

今回も試すだけなので、http.confに全て記述するようにします。

virtualenv環境を設定するディレクティブとしては、

  • WSGIPythonHome
  • WSGIPythonPath

の2つがありました。

WSGIPythonHomeを使って、

LoadModule wsgi_module modules/mod_wsgi.so

WSGIPythonHome "D:/Sandbox/mod_wsgi_bottle/env/Script"
WSGIScriptAlias / D:\Sandbox\mod_wsgi_bottle\app.wsgi

<Directory "D:/Sandbox/mod_wsgi_bottle">
    Require all granted
</Directory>

httpd.confに追加して起動したところ、

AH00418: Parent: Created child process 15224 Fatal Python error: Py_Initialize: unable to load the file system codec
ImportError: No module named 'encodings'

というエラーが出ました。

virtualenv環境がうまく設定できていないようです。
c++ - Py_Initialize fails - unable to load the file system codec - Stack Overflow

公式ドキュメントでも

WSGIPythonHome

This directive is not available on Windows systems.

WSGIPythonHome — mod_wsgi 4.5.2 documentation

とありました。

 
そのため、WSGIPythonPathを使って設定します。

公式ドキュメントを読むと、

In mod_wsgi version 2.0, because directories corresponding to Python eggs are automatically added to sys.path, the directive can be used to point at the site-packages directory corresponding to a Python virtual environment created by a tool such as virtualenv.

WSGIPythonPath — mod_wsgi 4.5.2 documentation

とあるので、WSGIPythonPathにはvirtualenvのsite-packagesディレクトリを指定します。

Bottleの公式ドキュメントでは

  • WSGIDaemonProcess
  • WSGIProcessGroup
  • WSGIApplicationGroup

のディレクティブを使っていますが、いずれもWindowsでは使えませんでした。

C:\Apache24\conf\httpd.conf

LoadModule wsgi_module modules/mod_wsgi.so

WSGIPythonPath "D:\Sandbox\mod_wsgi_bottle\env\Lib\site-packages"
WSGIScriptAlias / D:\Sandbox\mod_wsgi_bottle\app.wsgi

<Directory "D:/Sandbox/mod_wsgi_bottle">
    Require all granted
</Directory>

 
自動リロード用のディレクティブWSGIScriptReloadingもありますが、公式ドキュメントを読むと、

By default script reloading is enabled and a change to the WSGI script file will trigger whichever reloading mechanism is appropriate to the mode being used.

WSGIScriptReloading — mod_wsgi 4.5.2 documentation

とあり、試してみても自動リロードされました。

 
あとは、

C:\Apache24\bin>httpd

にて起動し、ブラウザでhttp://localhost/へアクセスすると、こんにちは Bottle!と表示されました。