Djangoを使ってみる#2


#概要
[前回](https://qiita.com/ground0state/items/67be7b7b3985f8e933d1)は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）

##参考
+ https://www.adminweb.jp/apache/install/index1.html #Apacheのインストール
+ https://qiita.com/h_digitalhearts/items/279ec1dfd28cb9693a1f #mod_wsgiのインストール
+ https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/modwsgi/ #Djangoとの連携



#手順

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

```Apache:コマンド
> 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`です。

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

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

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

```Apache:コマンド
> 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ファイルをダウンロード、管理者権限で実行します。既定を選択してインストールします。

```Apache:コマンド
> 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:コマンド
> 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:に移動した後、以下のコマンドを打つ。

```Python:コマンド
> 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:直下に配備するものとします。

```Apache: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>
```
１行目はモジュールのパス。
２行目はDjangpプロジェクト内のwsgi.pyファイルパス。
３行目はDjangoプロジェクトのパス。
４行目はsite-packegesのパス。
５行目以降はアクセス制御に関する設定。

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

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

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

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

```Apache: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サービスとして登録できるようになります。


##静的ファイルの配置について
工事中

##デバッグモードと本番モードの違い
工事中