Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その3(最終回)

## はじめに
本記事は
[Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その1](https://qiita.com/ochomaki/items/447c25cecbb5aee35ca1)
[Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その2](https://qiita.com/ochomaki/items/51ea5f72fe477e3890ca)
の続きとなっています。まだご覧になってない方はそちらを先に読むことをおすすめしております。
今回が最終回です。前回はNginxをインストールからメディアファイルの表示までを行いました。今回はNginxとuWSGIを使ってDjangoプロジェクトを表示させるところまで行います。完了時の構成は以下の通りです

```python:全体の構成
ブラウザ <-> Webサーバ(Nginx) <-> Unixソケット/http(通信プロトコル) <-> アプリケーションサーバ(uWSGI) <-> Webアプリケーション(Django)
```

## NginxとuWSGIでHello World
[その1](https://qiita.com/ochomaki/items/447c25cecbb5aee35ca1) で作成した"Hello World"を表示する `test.py` を実行します。まずは仮想環境を実行した後プロジェクトがあるディレクトリに移動し、Nginxを起動させましょう（[その2](https://qiita.com/ochomaki/items/51ea5f72fe477e3890ca) から直接来た方は特に何もしなくて大丈夫です。

```python:terminal
$ cd /home/pi/Test    # Testへ移動
$ pipenv shell    # 仮想環境の実行
$ cd mysite    # mysiteへ移動
$ sudo /etc/init.d/nginx start    # Nginxの起動
```
準備が整ったら以下のコマンドを打ってください

```python:terminal
$ uwsgi --socket :8001 --wsgi-file test.py
```
[http://127.0.0.1:8000/](http://127.0.0.1:8000/) にアクセスして"Hello World"が表示されれば成功です。このコマンドの意味するところとして、Nginxは8000番ポートでブラウザに対しHTTPプロトコルで通信を行い、8001番ポートでuWSGIとuwsgiプロトコルで通信を行います。そしてtest.pyを実行するようブラウザからNginxにリクエストが送られ、静的コンテンツのリクエストではないためNginxはuWSGIにそれを流す。といった流れです

確認が終わったら`Ctrl + C`で一旦終了してください。

## NginxとuWSGIでHello World その2
先程まではTCPポートソケットを使って通信を行ってきましたが、今度はUnixソケットを使用して通信を行います。[uWSGI公式ドキュメント](https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html) 曰くTCPポートソケットは通信が簡単な反面、Unixソケットと比較しオーバーヘットが多いらしいです。
オーバーヘッドについては [こちら](https://wa3.i-3-i.info/word12471.html) をご参照ください。簡単に言えば処理で発生する負荷です。

Unixソケットで通信を行う準備をしましょう。`mysite_nginx.conf` を編集します。多分今はmysiteディレクトリにいると思うので下記のコマンドで編集が可能です

```python:terminal
$ vi mysite_nginx.conf
```
`mysite_nginx.conf` の`upstream django`に2行コードが書いてあり、片方がコメントアウトされていると思います。片方のコメントアウトを外して、今まで生きていた方をコメントアウトしましょう
つまり

```python:mysite_nginx.conf
upstream django {
    # server unix:///home/pi/Test/mysite/mysite.sock; # for a file socket
    server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
```
これを

```python:mysite_nginx.conf
upstream django {
    server unix:///home/pi/Test/mysite/mysite.sock; # for a file socket
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
```
こうします。編集が完了したらNginxを再起動しtest.pyを呼び出してみましょう。

```python:terminal
$ sudo /etc/init.d/nginx restart    # Nginxの再起動
$ uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666
```
TCPポートソケットを使った際のコマンドと比較すると一目瞭然で、ポート番号の指定から`mysite.sock`とUnixソケットの指定に変わっています。
また、先程には付いていなかった`--chmod-socket=666` という謎のコマンドですが、これはNginxがUnixソケットを使用できるように権限を管理するコマンドです。
この権限の事を知らず、`--chmod-socket=666` を付けなかったために何度アクセスしても`502 Bad Gateway` が表示されてしまい、心が折れかけました（3敗）

説明はここまでにして [http://127.0.0.1:8000/](http://127.0.0.1:8000/) にアクセスしましょう"Hello World"が表示されているはずです。

ここまでくれば後はDjangoアプリケーションを表示させるだけです。次へ進みましょう

## NginxとuWSGIでDjangoアプリケーションのデプロイ
いよいよ本丸です。[その1](https://qiita.com/ochomaki/items/447c25cecbb5aee35ca1) でDjangoアプリをを呼び出した人ならどんなコマンドになるのかなんとなく予想ができるかもしれません、以下のコマンドを実行してください

```python:terminal
$ uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666
```
[http://127.0.0.1:8000/](http://127.0.0.1:8000/) にアクセスしてみましょう。下の画像のようなサイトが表示できればOKです。
![djangoSite_SS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424307/57c0fba9-4d81-f69c-1079-1a237b708079.png)
これでNginxとuWSGIを使ってDjangoアプリケーションのデプロイが完了しました。この環境を使って[Djangoチュートリアル](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/) を進めてみるのも良いと思います。

ある程度Djangoアプリが形になったらドメインを取得して実際に公開するのも面白いと思います。自宅サーバとして使えるラズパイならではの使い方ですね。

## おまけ
### iniファイルでuWSGIを実行させる
Djangoアプリの表示はできましたが、uWSGIの実行時に`--chmod-socket=666`などオプションを付けたりするのでどうしてもコマンドが冗長になりがちです。
ですのでオプション含めた設定をすべてiniファイルにまとめ、実行時に読み込む様にします。こうすることで設定の管理が容易になります。
`/home/pi/Test/mysite`ディレクトリに`mysite_uwsgi.ini`を作成します。作成したら以下の内容を保存してください。ディレクトリは適切なものに変えることを忘れないでください。

```python:mysite_uwsgi.ini
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /home/pi/Test/mysite
# Django's wsgi file
module          = mysite.wsgi
# the virtualenv (full path)
# home            = /home/pi/Test

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = /home/pi/Test/mysite/mysite.sock
# ... with appropriate permissions - may be needed
chmod-socket    = 666
# clear environment on exit
vacuum          = true
```

iniファイルの編集が完了したら早速起動してみましょう。以下のコマンドを`/home/pi/Test/mysite`で実行してください。

```python:terminal
$ uwsgi --ini mysite_uwsgi.ini
```
前と同じDjangoの画面が表示されれば成功です。コマンドがだいぶスッキリしました。iniファイルは今後Djangoアプリを実際に作成した後などで適宜編集する必要があります。
それらを含む項目に関しては[ちゃんと運用するときのuWSGI設定メモ](https://qiita.com/yasunori/items/64606e63b36b396cf695) を参照すると良いと思います。

## おわりに

以上で**Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる**は終了です。最後までお付き合い頂きまして大変ありがとうございました。
恐らく誤字脱字や内容の不備などが多々あると思いますので、コメントや編集リクエストで教えて頂ければ幸いです。