AWS EC2、Amazon Linux2でDjango+Nginx+uWSGIをたち上げる

AWS EC2、Amazon Linux2でDjango+Nginx+uWSGIで

開発できるような環境を作ってみました

行う事
1,EC2インスタンス作成
2,SSH接続
3,OS最新にupdate
4,Pythonインストール
5,仮想環境(venv)インストール
6,PIPアップバージン
7,Djangoインストール
8,プロジェクト作成
9,マイグレーション
10,サーバ起動
11,外部アクセス確認
12、ポート解放
13、外部アクセス確認
14.Nginxインストール
15,Nginx外部接続確認
16,ポート解放
17,uWSGIインストール
18,終わりに

1,EC2インスタンス作成
まず、EC2のインスタンスを作成します。

https://console.aws.amazon.com/console/
「コンソールへ」からログイン
AWS のサービスのサービスのEC2を選択
インスタンスの作成
1年間無料版でまずは、ためしので、Amazon Linux2を選択します。
Amazon Linux 2 AMI (HVM), SSD Volume Type 64 ビット (x86)
を選択 タイプt2.microを選択

2,SSH接続
端末からSSH接続にて作業を行います。
キーをダウンロードして、キーファイルの設定として
属性を読み込み専用にして、
chmod 0600
SSHで接続します

ssh -i "ダウンロードキー.pem" ec2-user@(パブリックDNS名)

(パブリックDNS名)は、ec2-x-x-x-x.us-east-2.compute.amazonaws.com
のようなものです。

3,OS最新にupdate

sudo yum update

4,Pythonインストール

Gitをインストール

sudo yum install git -y

Gitでpyenv読み込み、Pathを設定する

git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

関連をインストール

sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -y

pythonをインストール

pyenv install 3.6.2

3分ぐらいかかる場合もあります

pyenv global 3.6.2

pyenv rehash

python -V

Python 3.6.2  ←表示

仮想環境構築と有効化

python -m venv env
source env/bin/activate

pyenvを入れてから、venvで仮想は、なにか変な感じもしますが
venvで、バージョン毎の環境が作りやすいので。。。

6,PIPアップバージン

pip install -U pip

7,Djangoインストール

pip install django==1.11.17

インストールされたか確認

python
>>> import django
>>> django.get_version()
'1.11.17'  ←表示
>>> exit()

一応djangoのバージョンは1.11.17にしました

8,プロジェクト作成

django-admin startproject proj
cd proj
ls

manage.py proj   ←表示

cd proj
vim settings.py

i 挿入モード(iを入力)

ALLOWED_HOSTS = []
  変更(25行あたり、全てOKで。。)
ALLOWED_HOSTS = ['*']
ESC
:wq (書き込み終了)
cd
cd proj

python manage.py makemigrations
python manage.py migrate
python manage.py runserver (パブリックDNS名):8000
http://(パブリックDNS名):8000

で、ブラウザでアクセスしてみる
時計が周り続けて、なにも表示されない「このサイトにアクセスできません」

ポートを開けないといけない

awsダッシュボードのセキュルティ-グループから
インバウンド編集、ルール追加、
プロトコール:TCP,ポート範囲:8000、保存

http://(パブリックDNS名):8000

で、ブラウザでアクセスしてみる

It worked!
Congratulations on your first Django-powered page.

無事、Djangoの画面が表示された

14.Nginxインストール
python manage.py runserverで、キー入力できない時は
CTR-Cで、終了

sudo yum install -y nginx
エラー
To use, run
# sudo amazon-linux-extras install nginx1.12

指示に従いこちらで

sudo amazon-linux-extras install nginx1.12

nginxを起動する

sudo systemctl start nginx
http://(パブリックDNS名)

で、ブラウザでアクセスしてみる
「このサイトにアクセスできません」

ポートを開けないといけない

awsダッシュボードのセキュルティ-グループから
インバウンド編集、ルール追加、80、保存

8000はそのままにしておく
(後で閉じるように)

http://(パブリックDNS名)

で、ブラウザでアクセスしてみる

Welcome to nginx on Amazon Linux!

nginxの画面
それでは、Djangoとnginxを繋げるためにuWSGIを使ってみる

17,uWSGIインストール

pip install uwsgi

https://qiita.com/xKxAxKx/items/da9dcc8caa36e1c303c7
を参考にして、
nginx.conf
を変更

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
バックアップしてから
編集
sudo vi /etc/nginx/nginx.conf

追加、削除を行う

http {
.
.
.
.
include /etc/nginx/conf.d/*.conf;

#以下3行追加
upstream app_server {
server 127.0.0.1:8000 fail_timeout=0;
}
server {
#以下4行はコメントアウト
#listen 80 default_server;
#listen [::]:80 default_server;
#server_name localhost;
#root /usr/share/nginx/html;
# 以下3行を追加
listen 80;
server_name (パブリックDNS名);
client_max_body_size 4G;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
# 以下4行を追加
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}

ESC+:wq
で書き込み終了

sudo nginx -t

文法チェック

sudo systemctl stop nginx
sudo systemctl start nginx

設定ファイルを修正したのでnginxを起動(一度停止してから起動)

cd
cd proj
uwsgi --http :8000 --module proj.wsgi
http://(パブリックDNS名)

で、ブラウザでアクセスしてみる

It worked!
Congratulations on your first Django-powered page.

と表示された

18,おわりに

不要なポート閉じる
awsダッシュボードのセキュルティ-グループから
インバウンド編集、8000を削除、保存