PythonのWSGIアプリをWindows + Apacheでホストすることを考えたところ、 mod_wsgi
を使うのが良さそうでした。
mod_wsgi/README.rst at master · GrahamDumpleton/mod_wsgi
ただ、mod_wsgiのREADMEを読むとPython3.4系までしか記載がなく、手元のPython3.5系には対応していなさそうでした。
また、GitHubのReleasesを見ると、
mod_wsgi 4.5.2
Note: The last release for which Windows binaries was provided was 4.4.12.
とあり、Windows版は古いバージョンのバイナリだけが配布されていました。
Unofficial Windows Binaries for Python Extension Packagesを見に行ったところ、Python3.5対応のバイナリは配布されていましたが、現時点で配布されているバージョンは4.4.23
と、最新の4.5系ではありませんでした。
Python Extension Packages for Windows - Christoph Gohlke
どうするか悩んでいたところ、以下の記事がありました。
mod_wsgiをWindowsでコンパイルする方法 - satooshi@blog
参考にすれば自分でもビルドできるかもしれないと考え、今回試してみました。
環境
- Windows7 x64
- Apache 2.4.20 32bit版
- C:\Apache24
- Python 3.5.1 32bit版
- C:\Python35-32
- Microsoft Visual C++ 2015 再頒布可能パッケージ 32bit版
なお、mod_wsgiを使う場合、PythonとApacheのbitを合わせておく必要があります。
mod wsgi - Installing mod_wsgi module for apache - Stack Overflow
もし64bitのApacheと32bitのPythonを使った場合、
c:\Apache24\lib\libhttpd.lib : warning LNK4272: ライブラリのコンピューターの種類 'x64' がターゲットのコンピューターの種類' X86' と競合しています c:\Apache24\lib\libapr-1.lib : warning LNK4272: ライブラリのコンピューターの種類 'x64' がターゲットのコンピューターの種類' X86' と競合しています c:\Apache24\lib\libaprutil-1.lib : warning LNK4272: ライブラリのコンピューターの種類 'x64' がターゲットのコンピューターの種類' X86' と競合しています mod_wsgi.so : fatal error LNK1120: 100 件の未解決の外部参照 NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.EXE"' : リターン コード '0x2' Stop.
のようなエラーが出て、ビルドに失敗します。
また、場合によってはMicrosoft Visual C++ の再頒布可能パッケージが必要になるかもしれませんが、手元の環境にはすでにインストールされていたため、この点については省略します。
他に、今回はコマンドプロンプトでビルドを行います。
流れ
上記の記事やREADMEのTriggering the buildに従い、ビルドを行います。
ソースコードの入手とmkファイルの編集
Releasesページより、zipファイル(mod_wsgi-4.5.2.zip
)をダウンロード・解凍します。
Releases · GrahamDumpleton/mod_wsgi
C:\temp\4.5.2\mod_wsgi-4.5.2\win32
ディレクトリにあるビルド用mkファイルの存在を確認したところ、
C:\temp\4.5.2\mod_wsgi-4.5.2\win32>dir ... 2016/04/13 19:14 123 ap22py26-win32-VC9.mk 2016/04/13 19:14 123 ap22py27-win32-VC9.mk 2016/04/13 19:14 123 ap22py32-win32-VC9.mk 2016/04/13 19:14 123 ap24py26-win32-VC9.mk 2016/04/13 19:14 124 ap24py26-win64-VC9.mk 2016/04/13 19:14 123 ap24py27-win32-VC9.mk 2016/04/13 19:14 124 ap24py27-win64-VC9.mk 2016/04/13 19:14 123 ap24py32-win32-VC9.mk 2016/04/13 19:14 124 ap24py32-win64-VC9.mk 2016/04/13 19:14 126 ap24py33-win32-VC10.mk 2016/04/13 19:14 126 ap24py33-win64-VC10.mk 2016/04/13 19:14 126 ap24py34-win32-VC10.mk 2016/04/13 19:14 126 ap24py34-win64-VC10.mk ...
Python3.5向けのmkファイルはありませんでした。
mkファイル(ap24py34-win32-VC10.mk
)を開くと、
APACHE_ROOTDIR = c:\Apache24-win32-VC10 PYTHON_ROOTDIR = c:\Python34-win32-VC10 PYTHON_VERSION = 34 include common-VC10.mk
でした。
他のmkファイルも似たような内容だったため、これをベースに編集し、ap24py35-win32-VC15.mk
として保存します。
ap24py35-win32-VC14.mk
APACHE_ROOTDIR = c:\Apache24 PYTHON_ROOTDIR = c:\Python35-32 PYTHON_VERSION = 35 include common-VC10.mk
ビルド
# 環境変数設定 C:\temp\4.5.2\mod_wsgi-4.5.2\win32>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32.bat" # ビルド C:\temp\4.5.2\mod_wsgi-4.5.2\win32>nmake -f ap24py35-win32-VC14.mk Microsoft(R) Program Maintenance Utility Version 14.00.23506.0 Copyright (C) Microsoft Corporation. All rights reserved. cl /DWIN32 /DNDEBUG /I"c:\Apache24\include" /I"c:\Python35-32\include" /MD /GF /Gy /O2 /Wall /Zc:wchar_t /Zc:forScope ..\src\server\* .c /LD /link /LIBPATH:c:\Apache24\lib /LIBPATH:c:\Python35-32\libs /OPT:REF /OPT:ICF=2 /RELEASE /SUBSYSTEM:WINDOWS python35.lib libhttpd.lib l ibapr-1.lib libaprutil-1.lib /OUT:mod_wsgi.so ... /OUT:mod_wsgi.so mod_wsgi.obj wsgi_apache.obj wsgi_buckets.obj wsgi_convert.obj wsgi_daemon.obj wsgi_interp.obj wsgi_logger.obj wsgi_memory.obj wsgi_metrics.obj wsgi_restrict.obj wsgi_server.obj wsgi_stream.obj wsgi_thread.obj wsgi_validate.obj ライブラリ mod_wsgi.lib とオブジェクト mod_wsgi.exp を作成中
無事に終了したようです。
Apacheへのインストール
Apacheのモジュールは、C:\Apache24\modules
に入れれば良いため、できあがったmod_wsgi.so
をその場所へコピーします。
C:\temp\4.5.2\mod_wsgi-4.5.2\win32>copy mod_wsgi.so C:\Apache24\modules 1 個のファイルをコピーしました。
また、Apacheがmod_wsgi
をロードできるよう、設定ファイルの一番下に追加します。
C:\Apache24\conf\httpd.conf
LoadModule wsgi_module modules/mod_wsgi.so
ロードされるかを確認します。
C:\Apache24\bin>httpd -M Loaded Modules: ... wsgi_module (shared)
無事にロードされたようです。
動作確認
ビルドしたmod_wsgiが使えるかどうか、簡単なWSGIスクリプトを作成して確認します。
まずは、httpd.confの末尾に追記します。
なお、Windowsではいくつか使用できないディレクティブがありますが、今回の場合はWSGIScriptAlias
だけ指定すれば動作します。
WSGIScriptAlias — mod_wsgi 4.5.2 documentation
C:\Apache24\conf\httpd.conf
LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias / "D:/Sandbox/mod_wsgi_script/app.py" <Directory "D:/Sandbox/mod_wsgi_script/"> Require all granted </Directory>
続いて、以下を参考にWSGI準拠のPythonスクリプトを作成します。
python - TypeError: sequence of byte string values expected, value of type str found - Stack Overflow
D:\Sandbox\mod_wsgi_script\app.py
def application(environ, start_response): status = '200 OK' output = b'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
準備ができたため、Apacheを起動します。
C:\Apache24\bin>httpd
あとはブラウザでhttp://localhost/
へアクセスし、Hello World!
が表示されることを確認します。