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アプリで処理を行います。
5. 環境構築の流れ
作業の流れは以下です。
- nginxのインストール
- djangoアプリのインストール
- uwsgiのインストール
- nginxとuwsgiの設定
- 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
以下の画面画面が起動したらうまく動作しています。
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に以下を記述します。
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番ポートに転送されません。
消せば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の画面が表示されたら成功です。
確認出来たら、uwsgiをCTRL+Cなどで停止します。
10. uwsgiの自動起動の設定
このままだと、uwsgiコマンドを毎回ターミナルから起動しなくてはならないので、サーバとして使えません。
systemctlに登録して、自動起動の設定を行います。
/etc/systemd/system/uwsgi.serviceファイルをviエディタなどで作成し、以下の内容を記述します。
[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
以上。