DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

Djangoの使い方⑨Apacheで複数のDjangoプロジェクトを綺麗に振り分ける方法

前回記事 

dreamerdream.hateblo.jp

 

 

Apacheで静的なページを振り分ける方法はコチラ↓今回はこの応用です。

dreamerdream.hateblo.jp

 

Apacheは2.4です)

静的ページと同じようにDjangoで作ったページも振り分けることが出来ますが、WSGIモジュールを挟むので少しだけ面倒です。

まずはDjangoで作ったページをApacheで表示できるようにしましょう。

※注意

以前に「Djangoの使い方④」の方法とほぼ同じですが、今回はVSPを契約したのでRaspbianではなくCentOS向けの記事になります。Raspbianの場合も同じように出来ると思いますが未確認です。

wsgiモジュールをインストールしていれば

/etc/httpd/conf.modules.d/10-wsgi-python3.6.conf

という.confファイルが出来ていると思います(バージョンによって違うかもですがwsgiとあればおそらくそれでしょう)

中身は

<IfModule !wsgi_module>
  LoadModule wsgi_module modules/mod_wsgi_python3.6.so

</IfModule>

とだけなので.soファイル(モジュール)を読んでいるだけです。

 

ここに、

<IfModule !wsgi_module>
LoadModule wsgi_module modules/mod_wsgi_python3.6.so

  WSGIScriptAlias / /home/django/draemon/draemon/wsgi.py
  WSGIPythonPath /home/django/draemon/

  <VirtualHost *:80>
    ServerName draemon.domain.com

    <Directory /home/django/draemon/draemon>
      <Files wsgi.py>
        Require all granted
      </Files>
    </Directory>
  </VirtualHost>

</IfModule>

このように記述することでDjangoページを表示できます。

 

 

2つのページを振り分けるにはまず2つのDjangoプロジェクトを作り、それぞれ単体で表示できるようにしておきましょう。

例としてdraemonnobitaの2つのプロジェクトを取り扱います。

 

できたらそれぞれのプロジェクトのディレクトリを

WSGIPythonPath /home/django/draemon:/home/django/nobita

という風にWSGIPythonPathに2つのページを:を付けて(Windowsの場合は;だそうです)記述し、その後<VirtualHost>の設定をすることで複数のページが表示出来ます。

 」

 

という情報をWebページで見てそのように設定したのですが、この情報で設定した場合pythonのパスがダブってしまってうまくいきませんでした。

どううまくいかなかったかといいますと、draemonとnobitaに含まれる両方のwsgiファイルが読まれ、両プロジェクトのsettingファイルが読まれたことで

  • debug=Trueにしているはずのプロジェクトエラー内容が表示されない、またその逆が起こる。
  • プロジェクトに存在しているはずのページが開けない。
  • プロジェクト内に存在していないはずのアプリのURLで別のプロジェクトアプリが動く

という事象が起こり、最初どういうことだか理解が出来なかったのですが、

プロジェクトのデバッグエラー内容が表示された際に

PythonPath=[

/home/django/draemon

/home/django/nobita

/usr////////

 (内容はこんな感じだっと思う)

という風に2つのプロジェクトファイル名が出て来て、1つのブロジェクトのはずなのに複数のプロジェクトパスが読まれているという事に気が付きました。

 

こうなると、場合によってはdraemonのページが表示され、場合によってはnobitaのページが表示されるという何ともトンチンカンなページになってしまいます。

 

で、結論ですがDjangoの「デーモンモード」を使う事で解決します。

Djangoでは(に限らず?)WSGIを動かす時に「組み込みモード」と「デーモンモード」という2つのモードがあり、WSGIPythonPathを設定する上記の方法は組み込みモードという設定だそうです。

 

デーモンモードで動かすには<VirtualHost>内に

WSGIDaemonProcessとWSGIScriptAliasに適切なパスとプロセス名を記述する必用があるようです。

 

僕もあれこれ試した結果なのでうまく説明できませんが、結果的に下のように設定することでうまくプロセスを分担して動かす事ができました。

<IfModule !wsgi_module>
LoadModule wsgi_module modules/mod_wsgi_python3.6.so

 

  <VirtualHost *:80>

    ServerName draemon.domain.com
    WSGIDaemonProcess draemon user=apache group=apache maximum-requests=10000 python-path=/home/django/draemon

    WSGIScriptAlias / /home/django/draemon/draemon/wsgi.py process-group=draemon
    CustomLog   logs/draemon.access.log combined    ErrorLog   logs/draemon.error.log
    <Directory /home/django/draemon/draemon> 

       <Files wsgi.py>

         Require all granted

       </Files>
  </VirtualHost>

  <VirtualHost *:80>

    ServerName nobita.domain.com
    WSGIDaemonProcess nobita user=apache group=apache maximum-requests=10000 python-path=/home/django/nobita

    WSGIScriptAlias / /home/django/nobita/nobita/wsgi.py process-group=nobita
    CustomLog   logs/nobita.access.log combined    ErrorLog   logs/nobita.error.log
    <Directory /home/django/nobita/nobita> 

       <Files wsgi.py>

         Require all granted

       </Files>

    </Directory>

 

 

</IfModule>

 

しかし、この方法ではコードが非常に見辛くなり、このままではメンテナンスもし辛いですね。 

 

そこで、上リンク先「静的ページの振り分け」と同様にInclude文を使って見やすくしましょう。

/etc/httpd/conf.modules.d/extra

ディレクトリを作り

/etc/httpd/conf.modules.d/10-wsgi-python3.6.conf

の内容を下記のようにします。

<IfModule !wsgi_module>
  LoadModule wsgi_module modules/mod_wsgi_python3.6.so
  Include conf.modules.d/extra/main.conf

</IfModule>

 

こうすると/etc/httpd/conf.modules.d/extra/main.confファイルがインポートされます。

そして、

/etc/httpd/conf.modules.d/extra/main.conf

を作ります。

main.confでさらにImport文を使って振り分けることでページの管理をします。


Include conf.modules.d/extra/vhost-draemon.conf
Include conf.modules.d/extra/vhost-nobita.conf

と、いう風にIncludeで別々の設定ファイルを読ませます。

/etc/httpd/conf.modules.d/extra/vhost-draemon.conf

 に

  <VirtualHost *:80>

    ServerName draemon.domain.com
    WSGIDaemonProcess draemon user=apache group=apache maximum-requests=10000 python-path=/home/django/draemon

    WSGIScriptAlias / /home/django/draemon/draemon/wsgi.py process-group=draemon
    CustomLog   logs/draemon.access.log combined    ErrorLog   logs/draemon.error.log
    <Directory /home/django/draemon/draemon> 

       <Files wsgi.py>

         Require all granted

       </Files>
  </VirtualHost>

 

 

/etc/httpd/conf.modules.d/extra/vhost-nobita.conf

 に

<VirtualHost *:80>

    ServerName nobita.domain.com
    WSGIDaemonProcess nobita user=apache group=apache maximum-requests=10000 python-path=/home/django/nobita

    WSGIScriptAlias / /home/django/nobita/nobita/wsgi.py process-group=nobita
    CustomLog   logs/nobita.access.log combined    ErrorLog   logs/nobita.error.log
    <Directory /home/django/nobita/nobita> 

       <Files wsgi.py>

         Require all granted

       </Files>

    </Directory>

とを記述します。

 

結果的に.confの内容自体は一番上と全く同じですが、設定ファイルを分けることでページ追加や除外等の管理操作が簡単になり、イージーミスで他のページの設定を弄ってしまうなんてことも防げます。

はい。これで複数のDjangoページが好きなだけ作れますね。

f:id:DreamerDream:20181015110858p:plain

 

 

 <参考ページ>

複数のDjangoのアプリケーションをApacheに連携させたい。 - Tihiroの頭を休めるIT教室

Como usar Django con Apache y mod_wsgi | Django documentation | Django