Apache+mod_proxy_uwsgiのProxy設定でハマった話
こんにちは、ナカエです。DjangoをApache + uWSGIで動作させるVagrant仮想環境を構築中に、設定で若干ハマったので覚書です。
環境
- Ubuntu 16.04
- Apache HTTP Server 2.4.18
- mod_proxy_uwsgi 2.0.12
- uWSGI 2.0.12 ※ Emperorモードで動作
- Python 3.6
- Django 1.11
Apacheモジュール
普段はnginxをよく使うのですが今回はApacheを選択したので、uWSGIを動作させるためのモジュールを調べていました。
Apache support — uWSGI 2.0 documentation
uWSGIの公式ドキュメントにある3種類の選択肢から、mod_proxy_uwsgiが比較的メンテされている様子だったのでそちらを選択しました
ハマりポイント(1): ProxyPassのポートをuWSGIデフォルトの3031で指定すると動かなかった
uWSGIのデフォルトのポート3031でProxyPassを指定すると、
(111)Connection refused: AH00957: uwsgi: attempt to connect to 127.0.0.1:0 (*) failed
のようなエラーが出ました。mod_proxy_uwsgiのissueにてポートの設定にバグがあるという情報を発見。portを変えれば動作するようだったので3032に変更しています。
ハマりポイント(2): ProxyPassとAliasの優先度
ProxyPassの方が優先的に解釈されるため、Aliasで指定したDjangoのstaticディレクトリの静的ファイルがうまく表示されていませんでした。こちらはProxyPassMatchで解決です。
動作した設定ファイル
最終的なVirtualHostの設定は下記のようになりました(一部省略
<Virtualhost:80>
ServerName myapp.local
Alias /static/ /var/www/myapp/static/
<Directory /var/www/myapp/static>
Require all granted
</Directory>
# (2) 静的ファイルの配信用ディレクトリを除いてProxyする
ProxyPassMatch ^/static !
# (1) uWSGIを動作させるポートを3031ではなく3032に変更した
ProxyPass "/" "uwsgi://127.0.0.1:3032/"
CustomLog /var/log/apache2/myapp.local-access.log common
ErrorLog /var/log/apache2/myapp.local-error.log
</Virtualhost>