Windows環境にて、mod_wsgiを自分でビルドし、Apache2.4へインストールする

PythonWSGIアプリを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.

Releases · GrahamDumpleton/mod_wsgi

とあり、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

参考にすれば自分でもビルドできるかもしれないと考え、今回試してみました。

 

環境

もし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 個のファイルをコピーしました。

 
また、Apachemod_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!が表示されることを確認します。