前回、Windows環境でmod_wsgiをビルドしてApache2.4にて動作することを確認しました。
mod_wsgiの公式ドキュメントを参考に、今回はvirtualenv環境のWSGIアプリ(Bottle)を動かしてみます。
mod_wsgi — mod_wsgi 4.5.2 documentation
環境
- Windows7 x64
- Apache 2.4.20 32bit版
- C:\Apache24
- mod_wsgi 4.5.2
- 前回、ソースコードからビルドしたものを使用
- Python 3.5.1 32bit版
- C:\Python35-32
- Microsoft Visual C++ 2015 再頒布可能パッケージ 32bit版
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.
とありました。
そのため、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 thesite-packages
directory corresponding to a Python virtual environment created by a tool such asvirtualenv
.
とあるので、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.
とあり、試してみても自動リロードされました。
あとは、
C:\Apache24\bin>httpd
にて起動し、ブラウザでhttp://localhost/
へアクセスすると、こんにちは Bottle!
と表示されました。