【最短、最小構成】DjangoのWebアプリ公開方法。AWS Lightsail + Nginx + Gunicorn 

#概要
Djangoアプリを、最短かつ最小構成で公開する準備をしてみる。
値段が最小とは限らないため注意。

サーバー：AWS Lightsail（一番安い3.5ドル/月プラン）
OS：Ubuntu
Webサーバーアプリ：Nginx
Webアプリ：Django
NginxとDjangoの橋渡し：Gunicorn
ローカルPC：Win10 1909
SSH通信アプリ：Win10のコマンドプロンプト

#1.【AWS Lightsail】サーバーを契約、起動
・AWS Lightsailは月々定額でサーバーが使える。
・最初からDjango付きのパッケージを選ぶと1か月無料プランが使えない。OSだけにする。
　インスタンスロケーションを変えると、選べるアプリは変わるようだ。
　下はアメリカのバージニアの場合。
・下図の構成でインスタンスを作成。他の設定はデフォルトのまま。

|<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733028/77f9a671-2acc-b2d3-e382-050e14dbc57f.png width=500>|
|:-:|

|<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733028/b3e2a912-f2df-3c67-d42b-9dd1eec778c2.png width=500>|
|:-:|


#2.【AWS Lightsail】通信設定
・静的IPアドレスを設定

|<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733028/445e026f-4b3a-6207-2b47-2fd102de05e3.png width=500>|
|:-:|

|<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733028/5e95b6e5-7062-6a4e-72af-4d2b18dfdc36.png width=500>|
|:-:|

・秘密鍵をダウンロード
　DjangoコードをローカルPCからSSH通信でアップロードするために必要。
　下図一番下の「アカウントページ」からダウンロード

|<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733028/832bc6bf-e32e-2c71-e23e-271c43d497ab.png width=500>|
|:-:|




#3.【AWS Lightsail】Ubuntuに必要アプリ導入
・「SSHを使用して接続」からコンソールを起動

|<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733028/ec9c161c-2727-2ea6-321f-8052303d7db6.png width=500>|
|:-:|

・Django, Nginx, Gunicornをインストールする

~~~
# Ubuntuのパッケージ一覧更新
sudo apt-get update

# Djangoインストール（python3はUbuntuに最初から入っているとする）
sudo apt install python3-pip
sudo pip3 install django

# Nginxインストール
sudo apt-get install nginx

# Gunicornインストール
sudo pip3 install gunicorn
~~~


#4.【ローカルPC】Djangoの設定
・ローカルPC側に移動

・「mysite」という名前でDjangoのプロジェクトを作っているとする。
　またUbuntu側では/home/ubuntu/にDjangoのソースを置くとする。
　違うファイル名前やパスの場合は、以降の設定を全て読み替え。

・mysite/setting.pyの以下3つを編集。
　STATIC_ROOTは最初から無いため追加する。

~~~
DEBUG = False
ALLOWED_HOSTS = ['※AWS Lightsailで取得した静的IPアドレス、またはドメイン名']
STATIC_ROOT = '/home/ubuntu/mysite/static'
~~~


#5.【ローカルPC】ディレクトリやファイル事前作成

・manage.pyと同じフォルダに、「static」フォルダを作成。Ubuntuで後から作っても良い。
・manage.pyと同じフォルダに、Nginx用のmysite.confファイルを作成。
　内容は以下を書き込む。
　server_nameは人により異なるため注意。

~~~
server {
    listen  80;
    server_name     ※AWS Lightsailで取得した静的IPアドレス、またはドメイン名;

    location /static {
        alias /home/ubuntu/mysite/static;	#setting.pyのSTATIC_ROOTと同じ場所
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
~~~

#6.【ローカルPC】AWSにアップロード
・コマンドプロンプトのscpを使用する。scpはssh通信でデータを交換する仕組み。
・コマンドプロンプトで以下を起動。※長いので適当に改行を入れている
　scp -i ※秘密鍵ファイルへの絶対パス -P 22 -r 
　　　※Djangoプロジェクトのフォルダ絶対パス 
　　　　　※Ubuntuのユーザー名@静的IPアドレスorドメイン名:ディレクトリ絶対パス


~~~
# 以下は例
scp -i C:\Work\LightsailDefaultKey-us-east-1.pem -P 22 -r C:\Work\mysite ubuntu@???.???.???.???:/home/ubuntu
~~~

#7.【AWS Lightsail】Djangoの設定
・Ubuntuで以下を実行

~~~
# Djangoソース場所に移動
cd /home/ubuntu/mysite

# 必要であればマイグレーション
python3 manage.py makemigrations
python3 manage.py migrate

# Web公開前に静的データは抽出。/home/ubuntu/mysite/staticに置かれる。項目5のlocationも関連
python3 manage.py collectstatic
~~~

#8.【AWS Lightsail】Nginxの設定
・Nginx用のconfファイルを移動し、リロード

~~~
# ファイル移動
sudo mv /home/ubuntu/mysite/mysite.conf /etc/nginx/conf.d/mysite.conf

# 正しいかチェック。successfulが出ればよい。
sudo nginx -t

# リロード
sudo systemctl reload nginx
~~~

#9.【AWS Lightsail】Djangoアプリ起動 ＆ 公開
・DjangoアプリをGunicorn経由で起動する。runserverではないので注意。
　デフォルトでは127.0.0.1:8000で起動される。
　項目5のlocationと一致していることに注目。
　参考[https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/gunicorn/]

~~~
#サーバー起動。-Dはバックグラウンド起動
gunicorn mysite.wsgi -D

#止めるとき
pkill gunicorn
~~~

#10.【ローカルPC】ブラウザで開く
・ブラウザで静的IPアドレスを入力してWebアプリが動くか確認。

#終わり
可能な限り操作を少なくすることを目指しました。
後はセキュリティを設定したいところです。
とりあえずの足掛かりとして、宜しければお使いください。