CakePHP使いがDjangoでサイトを作ってみた 〜いざ本番環境へ〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
オンエアは本番中よりも放送中って意味になるのかな?

この記事を三行にまとめると

Apacheと連動していつでもアクセスできる状態にしたい
「mod_wsgi」というモジュールが必要です
これでアクセスできるようになるはずです
前回はDjangoをインストールしてテスト環境でデフォルトページにアクセスできるところまでやりました。

まずはテスト環境で

ブラウザからアクセスできることは前回も確認できたのですが、あれだとコマンド叩いてサーバーを起動している間しかアクセスできません。開発時はともかく本番運用する時にそれではアカン。

ということで今回はApacheと連動していつでもアクセスできる状態にしたいと思います。



mod_wsgiをインストール

Djangoで作ったサイトをApacheで動かすには「mod_wsgi」というモジュールが必要です。正確に言うとPythonをApacheで動かすためのモジュールですかね。

mod_wsgiをインストールするにはpipコマンドを使います。一応前回の続きってことで、ここではpipではなくpip3コマンドでインストールします。なぜ3がつくかは前回を見てくれぃ。

$ pip3 install mod_wsgi

インストール自体は簡単です。一行でいける。

ただ、こんなような(↓)エラーが出てインストールに失敗するかもしれません。

RuntimeError: The ‘apxs’ command appears not to be installed or is not executable. Please check the list of prerequisites in the documentation for this package and install any missing Apache httpd server packages.

unable to execute ‘gcc’: No such file or directory


簡単に言うとapxsとかgccというパッケージがないぞってエラーです。

apxsってのはApacheのエクステンションツールとかいうやつで、詳しいことは俺もよく分からん。それからgccはコンパイラですね。mod_wsgiをコンパイルする際に必要になる。

そんなわけでこの二つをインストースします。

$ yum install httpd-devel gcc

gccはそのままgccってやつをやむれば良いのですが、apxsはhttpd-develというパッケージの中に入ってるようなので、Apacheをインストールする際にhttpdではなくhttpd-develをやむれば上記のエラーは出なくなります。

これでpipコマンドを使えばmod_wsgiのインストールが上手くいくはずです。



httpd.confファイルの編集

Apacheをインストールすると、どこかにhttpd.confというファイルができているはずなので(AWSのEC2の場合は「/etc/httpd/conf」の下)、そのhttpd.confに以下の内容を追加します。

$ vi /etc/httpd/conf/httpd.conf

LoadModule wsgi_module /usr/local/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so

WSGIScriptAlias / /var/django/normnois/normnois/wsgi.py
WSGIPythonPath /var/django/normnois/

<Directory /var/django/normnois/normnois>
  <Files wsgi.py>
    Require all granted
  </Files>
</Directory>

各々がどういう役割と意味するものなのかってのは僕もちゃんとは説明できないんでここでは置いといて、何を書けば良いかってのだけ順番に見ていきましょう。

LoadModuleにはmod_wsgiモジュールの絶対パスを書きます。上のコードを見ると「/usr/local・・・」とやたら長ったらしいパスが書いてありますが、僕の環境でmod_wsgiをインストールしたらここに入ったので、それ書いてます。

どこにインストールされたか確認する場合は「find」コマンドを使うと良いと思います。

$ find / -name 'mod_wsgi*.so'

これでどこにあるかが分かるので、コピってはっつければOK。

WSGIScriptAliasはDjangoの中にあるwsgi.pyまでのパスです。何で「/var/django/normnois・・・」ってなってるのかは前回そういう風に設定したからで、ここは任意に書き換えてください。

WSGIPythonPathはプロジェクトフォルダまでのパスですね。前回「normnois」というプロジェクトを作成したので、そこまでのパスを書いてます。

Directoryタグで囲ってる部分は、wsgi.pyへのアクセスを許可する設定ですね。デフォルトだとwsgi.pyにアクセスが制限されているので、それを解除するためのコードです。

「Require all granted」ってのはあれですね……昔の書き方でいうところの「Allow from all」的なやつです。Apache2.4で書き方が変わったみたいです。



他にもいくつか設定項目はあるのですが、最低限これだけ書いとけばとりあえずサイトは動く状態になるので、ここまでできたらひとまずApacheを起動してみましょう。すでに起動している場合は再起動で。

$ /bin/systemctl start httpd.service

これでサーバーに設定されているIPアドレスなりドメインなりでデフォルトページにアクセスできるようになるはずです。



おまけ

先ほどはhttpd.confに必要な設定を書き込みましたが、wsgi.confみたいなファイルを作って分けておきたいって場合もあると思います。

httpd.confの中にこんな記述がある場合。

Include conf.modules.d/*.conf

この記述があれば「conf.modules.d」というフォルダの中にある拡張子が.confのファイルが全部読み込まれる設定になっているので、conf.modules.dフォルダの下にwsgi.confを作ればApacheを起動した時に自動で読み込んでくれます。

逆に言えば、自分でこのInclude何ちゃらを書けば、任意の場所にあるconfファイルを読み込めるってことですね。






前回と合わせてここまでやれば、中身はともかくとしてサイトを公開するところまではできます。単にApacheを起動するだけではダメなので一見するとめんどうそうにも思えますが、エラーとか出なければわりとすぐに作業が終わるので、初めてPythonを触ることになったって人も、焦らずやってみてください。

次回はもう少し突っ込んでDjangoの構造(ファイル構成的な)について見てみましょー。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください