【Django】Apacheとmod_wsgi環境でDjango2を使う方法を解説 – CentOS7

2017年12月にPythonのWebアプリケーションフレームワークDjango2.0(ジャンゴ)がリリースされました。Django2.0の運用を念頭にApache2.4 + mod_wsgi + Python3.6 + Django2.0で構成される実践的な環境をCentOS7.3上に構築してみましょう。

※OSを汚さないようVagrant + VirtualBox仮想環境にて実施しています。

手軽に試すなら開発用ビルトインサーバ

Djangoの本運用を念頭にCentOS7 + Apache2.4という「よくある環境」にしましたが、Djangoには開発用ビルトインサーバがあります。本格的な環境は構築に時間が掛かるので、Django2.0を試すだけなら開発用ビルトインサーバを使用しましょう。

PHPの人気フレームワークLaravelだとPHP7、Nginx、MySQL、PostgreSQL、Memcached…といった本格的な環境を少しのコマンドで構築できるHomesteadという公式Vagrant Boxがありますが、残念ながらDjangoにはないため、ゴリゴリ環境構築する必要があります。

このコラムは中〜上級者向けとなります。Vagrant、Linux(CentOS)、Apache等ソフトウェアの基本知識は省略します。また、環境構築にはエラーがつきものなので、ログ等で自己解決することに慣れていないと厳しいかもしれません。

ハードウェアと仮想環境

ハードウェア

macOS High Sierra(10.13.2)

※Macを使いましたが(PC直インストールではなく)Vagrant仮想環境につきWindowsでも基本同じです。CentOS7に直導入の場合はよりスムーズかと。

仮想環境

Vagrant (2.0.1)+ VirtualBox(5.2)

Vagrantプラグイン
・vagrant-hostsupdater
・vagrant-vbguest

※上記2つのプラグインを入れておきましょう。(vagrant-hostsupdater は必須ではなく、hosts直設定でもOKです。)

仮想環境の構築(ホストOS)

下記リポジトリをチェックし、2017年12月時点で最新のvagrant-centos-7.3を使用してCentOS7.3のBoxを作成。
https://github.com/CommanderK5/packer-centos-template/releases/

具体的にはMacのターミナルで下記のコマンドを実行。

 

※1 ここでは /usr/local/var/www/MyVagrant/study_django  に設置しましたが、どこでもOKです。各自のフォルダに適宜置き換えてください。

 

※2 初回起動時にはvagrantがエラーを吐くかもしれません。エラーが出たらvagrant reload してみましょう。それでもエラーが消えない場合はGoogle検索等で解決する必要があります。

テスト起動できたらVagrantfileに下記を追加しましょう。

Vagrantfileとはvagrant initの時にディレクトリ直下に作成される設定ファイルです。本ケースでは /usr/local/var/www/MyVagrant/study_django/Vagrantfile に作成されます。

 

本ケースではVMのIPアドレスを192.168.33.10 、ホスト名(ドメイン名)を django.local という設定にします。

対応する共有フォルダを作成後に再起動し、ゲストOS(CentOS7)にsshログインします。

 

ゲストOSのセットアップ

以下はゲストOS(CentOS7)での作業となります。ホストOS(Mac)ではないので、ご注意ください。

0. 参考ページ

https://ks6088ts.github.io/centos-django-apache.html

https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-centos-7

1. システムの基本セットアップ

$ cat /etc/redhat-release でバージョン確認すると CentOS Linux release 7.4.1708 (Core) と表示されました。Centos 7.3 のBoxとして配布されていますが CentOS7.4にアップデートされているようです。

2. Apache2.4のインストール

httpd -v で確認した結果は Apache/2.4.6 (CentOS)

 

3. Python3.6 のインストール

CentOS7 にはPython2.7.xがプリインストールされていますが、Django2.0はPython3.4以上、Django2.1はPython3.5以上が必須となっています。ここでは2017年12月時点で最新安定版の3.6を導入します。
https://docs.djangoproject.com/ja/2.0/faq/install/#faq-python-version-support

 

念のためバージョン確認

 

4. venvによる仮想環境

Python3.6 で動かす必要があるため venv による仮想環境をセットアップします。venv の詳細は公式ドキュメントを参照ください。
https://docs.python.jp/3/library/venv.html

ここでは /var/www/environments 以下に仮想環境 ‘myenv’ を作りました。(各自の環境にあわせて適宜置き換えてください。)

上のsourceコマンドを実行すると行の先頭に (myenv)[〜] と表示され、仮想環境下にいることがわかります。
 (myenv) [vagrant@django environments]$

OSにインストールされているPythonのバージョン(本ケースでは2.7)によらず、venv仮想環境下ではpythonコマンド、pipコマンドは指定したバージョン(本ケースでは3.6)になります。※python3.6〜、pip3.6〜とする必要もありません。

Note: Within the virtual environment, you can use the command python instead of python3.6, and pipinstead of pip3.6 if you would prefer. If you use Python 3 on your machine outside of an environment, you will need to use the python3.6 and pip3.6 commands exclusively.

出典: digitalocean.com

 

5. Django 2.0 のインストール

必ずvenv環境下にいることを確認し、下記のコマンドを実行します。

おそらく下のようなエラーが出るかと思いますが、ひとまず無視でOKです。(単にマイグレーション実行してね、という警告です。)

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run ‘python manage.py migrate’ to apply them.

ホストマシン(Mac)のSafariで http://192.168.33.10:8000 にアクセスしてみましょう。すると下記のエラー画面が表示されるかと思います。

Django2.0 Hostエラー画面

DisallowedHost at /
Invalid HTTP_HOST header: ‘192.168.33.10:8000’. You may need to add ‘192.168.33.10’ to ALLOWED_HOSTS.

このエラーへの対処はとても簡単です。

control + c でビルトインサーバーを一旦停止して、Djangoの設定ファイルsettings.pyを編集します。エラーメッセージにある通りALLOWED_HOSTSに’192.168.33.10’を追加しましょう。

settings.py の中に ALLOWED_HOSTS = [] という行があるので

ALLOWED_HOSTS = [‘192.168.33.10’]

とすれば完了です。保存したら再びビルトインサーバを立ち上げましょう。

Mac のSafariで http://192.168.33.10:8000 にアクセスして下記画面が表示されれば、ビルトインサーバでの動作確認は完了です。

Django2.0インストール成功画面

6. mod_wsgiのインストール

続いて最大の難所 mod_wsgi のインストールとhttpd.confの設定を行います。mod_wsgiとはPythonのプログラムをApache HTTP Serverで動作させるためのモジュールです。

pipを使うのがポイント(yum はダメ)

$ sudo yum install mod_wsgi でmod_wsgiをインストールできますが、yumだとPython2系対応の mod_wsgi がインストールされてしまいます。Python3系対応の mod_wsgi をインストールするにはvenvによる仮想環境下のpipコマンドを使うのがポイントです。

最後の deactivate コマンドはvenvの仮想環境を終了するコマンドです。

モジュールがどこにインストールされたかを調べましょう。次のApache(httpd.conf)の設定で使うので地味に重要です。

とても深い位置にインストールされていますね…。

 

7. Apache(httpd.conf)の設定

mod_wsgi、DjangoをApacheと連携するため、2つの設定ファイルを追加します。

1)モジュール読み込み設定

↓下記を記入して保存。
※LoadModule に指定しているパスは6. mod_wsgiのインストールで調べたものです。

2 )Django、mod_wsgi 関連設定

↓下記を記入して保存。
 

この設定について詳しく知りたい方は modwsgiのドキュメント および Django を Apache と mod_wsgi とともに使うには? を参照してください。

以上で設定は完了です。

 

8. Apacheの起動

Apacheを起動しましょう。

MacのSafariで http://192.168.33.10/  にアクセスして、下の画面になればOKです!

※Apacheが起動しない場合、Internal Server Error になる場合はエラーログ( /var/log/httpd/error_log )を見ると解決のヒントが得られるでしょう。

Django2.0インストール成功画面

 

次に Vagrantfile で設定したホスト名(ドメイン名)ではどうでしょう。Safari で http://django.local/  にアクセスすると…

Invalid HTTP_HOST header: ‘django.local’. You may need to add ‘django.local’ to ALLOWED_HOSTS.

というエラー画面が表示されるでしょう。先程と同じですね。settings.py に追記するだけです。

$ vi /var/www/environments/mysite/settings.py

ALLOWED_HOSTS = [‘192.168.33.10’, ‘django.local’]

追記後にhttp://django.local/にアクセスすると正常画面になります。

 

環境構築は針の糸を通すような繊細さが必要になります。コンピュータが処理するので、インストールのちょっとした不備、コマンドやパス設定に1文字でもミスがあると、Apacheやmod_wsgiは正常起動しなくなります。

 

また、各ソフトのバージョンアップにより設定方法が変わるかもしれません。

 

エラー画面になったら慌てずにログ( /var/log/httpd/error_log )を確認しましょう。

 

9. Apacheの自動起動(おまけ)

VMを再起動・シャットダウンをすると Apache は終了します。起動のたびに vagrant ssh でログインして sudo systemctl enable httpd.service とするのは手間なので、自動起動設定をしておきましょう。

(Vagrantでない)素のCentOS7だと下記で自動起動するようになりますが、vagrant環境下のCentOS7では自動起動しません(しないかと思います)。

 

vagrant 環境下の場合、Apacheを自動起動させるにはVagrantfileに下記を追記すればOKです。

 

以上となります。お疲れさまでした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です