Python
Django
Apache

Djangoを使ってみる#2

概要

前回はrunserverを用いてデバッグ用にサーバを起動し、Hello Worldを表示しました。
これから中身をつくっていくわけですが、先んじて本番環境の構築方法を勉強してしまいます。

環境

  • Windows10 home
  • Anaconda 5.0.1 (Just meでインストール)
  • Python 3.6.3 :: Anaconda, Inc.
  • Django2.0
  • Apache HTTP Server2.4.29(以下Apache)

参考

手順

Apacheインストール

https://httpd.apache.org/ からApacheをダウンロードします。
参考のページの通り作業をします。展開された「Apache24」はCドライブ直下に置きました。
コマンドプロンプトでC:Apache24/binに移動し、コマンドを打ちます。

コマンド
> httpd -k install
Installing the 'Apache2.4' service
The 'Apache2.4' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.

これでWindowsサービスとして登録されます。(エラーが表示されましたが、以下のスタートコマンドを打ったら起動できたので良しとします。
起動はhttpd -k startで、停止はhttpd -k stopです。

サービスの登録を解除する場合は以下のコマンドです。

コマンド
> httpd -k uninstall

Apacheを起動したら、ブラウザでhttp://localhost/ にアクセスします。It works!と表示されればサーバが起動しています。

mod_wsgiインストール

PythonをApacheで動かすには、mod_wsgiというPythonモジュールを使用します。インストールはpipで行います。

コマンド
> pip install mod_wsgi

    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

エラーになりました。VCランタイムが入っていませんでした。
Windowsで(C++でできた?)Pythonのモジュールをインストールするときはコンパイルをする必要があるようで、ランタイムが必要になります(多分)。
http://landinghub.visualstudio.com/visual-cpp-build-tools にアクセスして、ランタイムをインストールします。"Download isual C++ Build Tools 2015"をクリックしてexeファイルをダウンロード、管理者権限で実行します。既定を選択してインストールします。

コマンド
> pip install mod_wsgi
Collecting mod_wsgi
  Using cached mod_wsgi-4.5.24.tar.gz
Building wheels for collected packages: mod-wsgi
  Running setup.py bdist_wheel for mod-wsgi ... done
  Stored in directory: C:\Users\xxxxx\AppData\Local\pip\Cache\wheels\9d\97\b6\8c19c1e88235e38fb291430ebdeec57c5dc660ef761503b153
Successfully built mod-wsgi
Installing collected packages: mod-wsgi
Successfully installed mod-wsgi-4.5.24

これでインストールできました。site-packageフォルダを確認しましょう。次のコマンドでフォルダの位置を確認します。

コマンド
> python -c "import sys; print(sys.path)"
['', 'C:\\Users\\xxxx\\Anaconda3\\python36.zip', 'C:\\Users\\xxxxx\\Anaconda3\\DLLs', 'C:\\Users\\xxxxx\\Anaconda3\\lib', 'C:\\Users\\xxxxx\\Anaconda3', 'C:\\Users\\xxxxx\\Anaconda3\\lib\\site-packages', 'C:\\Users\\xxxxx\\Anaconda3\\lib\\site-packages\\Babel-2.5.0-py3.6.egg', 'C:\\Users\\xxxxx\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Users\\xxxxx\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Users\\xxxxx\\Anaconda3\\lib\\site-packages\\Pythonwin']

したがって下記を探します。
'C:\Users\xxxxx\Anaconda3\lib\site-packages\mod_wsgi\mod_wsgi\server'
中に'mod_wsgi.cp36-win_amd64.pyd'が存在することを確認します。このファイルを'C:\Apache24\modules'にコピーし拡張子を'mod_wsgi.cp36-win_amd64.so'に変えます。

ランタイムを使用しない場合

ランタイムは容量が大きいので、入れたくない場合もあります。
その場合はすでにコンパイルされたwhellファイルを用いたインストールを行います。
https://www.lfd.uci.edu/%7Egohlke/pythonlibs/#mod_wsgi にアクセスし、
自分の環境に合うwheelファイルをダウンロードします。選び方は参考のサイトにあります。ダウンロードしたファイルを例えばC:直下に配置し、C:に移動した後、以下のコマンドを打つ。

コマンド
> pip install "c:\mod_wsgi-4.5.24+ap24vc14-cp36-cp36m-win_amd64.whl"
Processing c:\mod_wsgi-4.5.24+ap24vc14-cp36-cp36m-win_amd64.whl
Installing collected packages: mod-wsgi
Successfully installed mod-wsgi-4.5.24+ap24vc14

Apacheのconfを設定する

"C:\Apache24\conf\httpd.conf"を開き、編集します。編集する際は元のファイルをコピーしてバックアップを取っておくと良いと思います。
httpd.confの末尾に以下を追加します。ただし、プロジェクトはc:直下に配備するものとします。

httpd.conf
LoadModule mod_wsgi /Users/xxxxx/Anaconda3/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd


WSGIScriptAlias / c:/mysite/mysite/wsgi.py
WSGIPythonPath c:/mysite

<Directory c:/mysite/mysite>
 <Files wsgi.py>
  Require all granted
 </Files>
</Directory>

1行目はモジュールのパス。
2行目はDjangpプロジェクト内のwsgi.pyファイルパス。
3行目はDjangoプロジェクトのパス。
4行目はsite-packegesのパス。
5行目以降はアクセス制御に関する設定。

ちなみに5行目のの中身はApache2.4以降とそれより前で書き方が違うようです。前では以下のようにします。(ほとんどのブログサイトが前の記述だったのでこれに気付くのに苦労しました。officialのドキュメントには書いてあったんですけどね https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/modwsgi/

httpd.conf
...
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>

c:\Apache24\binにてhttpd.exe -tを実行すると文法チェックができます。ちなみに私はhttpd.confの中に日本語でコメントを書いていたのでエラーが出ました。日本語を含む場合はファイルの文字コードをutf-8にすれば良いです。

wsgy.pyは以下のようになっていることを確認します。

wsgi.py
"""
WSGI config for helloworld project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/
"""

import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "[プロジェクト名].settings")
application = get_wsgi_application()

今回は[プロジェクト名]はmysiteです。

以上を編集してApacheを再起動します。http://localhost にアクセスするとHello Djangoと表示されました。
これでApacheで動作させることができました。

Windowsサービス登録について

コマンドプロンプトからhttpdコマンドで起動すると動くのですが、Windowsサービスとしては起動できない時があります。この原因の一つにPYTHONPATHが環境変数にないことがあります。環境変数に以下を追加します。

環境変数名 PYTHONPATH
変数値 C:\Users\xxxxx\Anaconda3\Lib

するとWindowsサービスとして登録できるようになります。

静的ファイルの配置について

工事中

デバッグモードと本番モードの違い

工事中