djangoで作ったWEBアプリケーションをnginxで動かすまで

# 1. はじめに
djangoで作ったお遊びWEBアプリケーションを、AWSで稼働させていましたが、2019年8月23日のAWSがダウンにより死んでしまいました。AWSが復旧したら直るものかと期待していたのですが、AWSが復旧した後も、EC2インスタンスが動き出すことはありませんでした。バックアップも何も取っていなかったので、どうやら環境を再構築しなくてはならないようです。
djangoはnginxで稼働させていたのですが、このnginxの設定、初心者にはハードルが高く、また、構築し直しというのは、結構心が折れそうでした。ググるとガセ設定もあるみたいで・・・。
というわけで、nginxの設定備忘録として本記事を投稿することにしました。

# 2. 対象読者
nginxが苦手な人。
httpsじゃなくて、まずはhttp環境を立てれるようにしたい人。
socketじゃなくてよい人。

# 3. 環境
- AWS ubuntu18.04
- python3

# 4. やりたいこと
作り直す環境は以下の図のとおりです。
EC2インスタンスで稼働するnginxはポート80番でブラウザからの要求を受け付け、8001番で待ち受けるuwsgiに転送します。
8001番で要求を受け付けたuwsgiは、djangoアプリで処理を行います。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228050/a900c78e-da88-95c9-f169-f7683444cdec.png)

# 5. 環境構築の流れ
作業の流れは以下です。
1. nginxのインストール
2. djangoアプリのインストール
3. uwsgiのインストール
4. nginxとuwsgiの設定
5. uwsgiの自動起動の設定

# 6. nginxのインストール
以下のコマンドを叩くだけです。

    sudo apt-get update
    sudo apt-get install nginx -y
    sudo systemctl enable nginx.service

# 7. djangoアプリのインストール
djangoのアプリは、自分が作った簡易BLOG用のアプリ(pyarticle)を使用します。gitからダウンロードできるのでよかったら使ってください。といっても、まだまだ直す箇所が多いので、品質などの突っ込みはご勘弁を…。ゆくゆくは記事を電子書籍として出力できるようにする予定です。特に興味のない方はこの章は飛ばしてください。python3で動作します。
### 7.1. コマンドのインストール
sqlite3で動作しますので、sqlite3コマンドをインストールしておきます。

    sudo apt install sqlite3

pyarticleで必要なライブラリをインストールするためのpip3コマンドをインストールします。

    sudo apt-get install python3-pip

### 7.2. 必要なライブラリのインストール
pyarticleで必要なライブラリをインストールします。

    pip3 install django
    pip3 install pillow
    pip3 install markdown
    pip3 install ebooklib
    pip3 install pymdown-extensions

### 7.3. ソースコードのクローン
クローンは、/home/ubuntuで行う前提です。

    cd 
    git clone https://github.com/koni0626/pyarticle.git

### 7.4. 起動の確認
ひとまず、デバッグでpyarticleが起動するか確認します。以下のコマンドを実行してください。

    cd pyarticle/mysite
    python3 manage.py migrate
    python3 manage.py createsuperuser
    sqlite3 db.sqlite3 < pyarticle/sql/siteparams.sql
    python3 manage.py runserver 0.0.0.0:8000

ブラウザから以下のURLにアクセスします。

    http://URL:8000/pyarticle

以下の画面画面が起動したらうまく動作しています。
![pyarticle起動画面.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228050/a8fb13bf-2231-d526-6d78-92eedd50c109.jpeg)
CTRL＋Cでpython3 manage.py runserver 0.0.0.0:8000で実行したコマンドを停止してください。


# 8. uwsgiのインストール
ここからが本題です。まずは、uwsgiと連携してpyarticleが動作するようにします。
uwsgiはpip3でインストールします。

    sudo pip3 install uswgi

次にuwsgiコマンドに渡す引数などをuwsgi.iniファイルに記述します。
ファイルは/home/ubuntu/pyarticle/mysite/uwsgi.iniにviエディタなどで作成します。

    [uwsgi]
    module = index
    master = true
    wsgi-file = /home/ubuntu/pyarticle/mysite/mysite/wsgi.py
    pidfile = /home/ubuntu/pyarticle/mysite/mysite/uwsgi.pid
    logto = /home/ubuntu/pyarticle/mysite/mysite/uwsgi.log

次のコマンドを実行してuwsgi経由でpyarticleが起動するか確認します。

    cd /home/ubuntu/pyarticle/mysite
    uwsgi --http :8000 --ini uwsgi.ini

ブラウザから以下のURLにアクセスします。

    http://URL:8000/pyarticle

先ほどと同じ画面が確認できたらOKです。

# 9. nginxとuwsgiの設定

nginxが持っているuwsgi_paramsファイルをpyarticleにコピーします。

    cp /etc/nginx/uwsgi_params /home/ubuntu/pyarticle/mysite

/etc/nginx/conf.dにpyarticle.confをviエディタなどで作成します。

    cd /etc/nginx/conf.d

pyarticle.confに以下を記述します。

```/etc/nginx/conf.d/pyarticle.conf
server {
    listen  80;
    server_name     127.0.0.1;

    location /static {
        alias /home/ubuntu/pyarticle/mysite/pyarticle/static;
    }

    location / {
        proxy_pass http://127.0.0.1:8001;
    }
}
```

location / はnginxの80番ポートに通知がきたら、ローカルホストの8001に転送するという意味です。
ここで、勇気が必要な操作があります。
/etc/nginx/conf.dの下にあるdefaultと/etc/nginx/sites-enabledの下にあるdefaultを削除してください。（お仕事でやる場合は、先輩などに確認してからやりましょう）

    sudo rm /etc/nginx/conf.d/default
    sudo rm /etc/nginx/sites-enabled/default

defaultも、80番ポートの受付を行う設定が行われているので、defaultが残ったままだとnginxのデフォルト画面が表示されて8001番ポートに転送されません。
![default.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228050/92f04cf1-b14f-807f-9dda-76dae2cfd2ad.jpeg)

消せばpyarticle.confが反映されるようになりますが、他にうまいやり方がわからなかったので、ご存知でしたら教えてくださいm(_ _)m

ここまで設定したら、nginx↔uwsgiで通信できるようになっているはずです。
次のコマンドを実行してブラウザからhttp://URLを指定して動作しているか確認してみましょう。
まず、uwsgiを起動します。

    cd /home/ubuntu/pyarticle/mysite
    uwsgi --http :8001 --ini uwsgi.ini

次にnginxを再起動します。

    sudo service nginx restart

ブラウザからポート番号を指定せずにアクセスしてみましょう(デフォルトで80番ポート)。
pyarticleの画面が表示されたら成功です。
![pyarticle起動画面.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228050/9e3d01e1-fbb9-8f54-2e23-988e79231ed1.jpeg)

確認出来たら、uwsgiをCTRL+Cなどで停止します。

# 10. uwsgiの自動起動の設定
このままだと、uwsgiコマンドを毎回ターミナルから起動しなくてはならないので、サーバとして使えません。
systemctlに登録して、自動起動の設定を行います。
/etc/systemd/system/uwsgi.serviceファイルをviエディタなどで作成し、以下の内容を記述します。

```/etc/systemd/system/uwsgi.service
[Unit]
Description = uWSGI
After = syslog.target

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/pyarticle/mysite
ExecStart = /usr/local/bin/uwsgi --http :8001 --ini /home/ubuntu/pyarticle/mysite/uwsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

```

登録したサービスを起動します。

    sudo systemctl daemon-reload
    sudo systemctl enable uwsgi

起動時にエラーになる場合、uwsgiコマンドのパスを確認してください。
ExecStart = /usr/local/bin/uwsgiが人によっては /home/ubuntu/.local/bin/uwsgiに変更する必要があります。uwsgiコマンドのパスは以下で確認できます。

    which uwsgi

以上。