開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. Python >
  4. Apache+mod_proxy_uwsgiのProxy設定でハマった話
no-image

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に変更しています。

mod_proxy_uwsgi port parsing

ハマりポイント(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>

TOPに戻る