5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-01

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

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
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

消せば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

確認出来たら、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

以上。

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?