はじめに
勉強していて、DjangoをリモートホストにデプロイしたあとのNGINXとgunicronの設定回りがよくわからなくなったので、自分用にメモ
- やりたいこと
- 必要な作業の流れ
- 1. NGINXがDjangoサイトを呼び出す用の設定ファイル作成
- 2. Djangoを呼び出す設定ファイルへのシンボリック・リンク作成
- 3. NGINXとgunicornを再起動
やりたいこと
Djangoで作ったアプリケーションをクラウド上にデプロイし、静的ファイルを表示するだけなどの軽い処理はウェブサーバー(NGINX)で処理し、Djangoでの動的な処理など重い処理はAPサーバー(gunicron)で行いたい。
- nginx
- 主に静的ファイルを表示するウェブサーバー
- 自分自身は重たい仕事はしない(ngninxにさせるのはHTMLの表示くらい)
- ロードバランサー的に振る舞い、重い処理だけgunicornに振る
- gunicorn
- Djangoを動かすAPサーバー
- 静的ファイル(HTMLとか)のみ表示する場合には不要なので、Pythonが必要な場合だけ呼び出したい。
必要な作業の流れ
上記を実現するためには、以下の作業が必要(Djangoアプリケーションはすでにサーバーにデプロイされてる前提)
- NGINXがDjangoサイトを呼び出すにあたっての設定ファイルを用意する
- 設定ファイルは「/etc/nginx/sites-available」フォルダにてきとうな名前でつくる
- 設定ファイルに書く内容は、「このポートを使うやで」とか
- 「/etc/nginx/sites-enabled」フォルダに、上記1で作ったファイルへのシンボリック・リンクを張る
- こうすることで、上記No.1のファイルが無効になったらシンボリック・リンクを切ればよいだけになる
- シンボリックリンクそもそも何という人は「ショートカットリンクみたいなもんん」と思っとけばおk
- NGINXとgunicronを再起動してアクセスする
1. NGINXがDjangoサイトを呼び出す用の設定ファイル作成
「/etc/nginx/sites-available」に、NGINXが呼び出すウェブサイト(ここではDjangoアプリ)の設定ファイルを追加する。こうすることで、NGINXがそのサイトを呼び出せるようになる。
cd /etc/nginx/sites-available
sudo vi djangapp
この「djangapp」に記載された設定にしたがい、NGINXはDjangoを呼び出す。
次に、作成した設定ファイルに情報を記載する。なお今回NGINXは以下の二つをしたい。
- 静的ファイルを表示
- リクエストの情報をdjangapp.sock(gunicornとのソケット用ファイル)に流す
設定ファイルの中身はこんな感じ
server {
# 設定しているウェブサイトへのリクエストを通すポート
listen 80;
# ウェブサイトのIPもしくはドメイン名
server_name xx.xx.xx.xxx;
# ファビコンが見つからないというエラーを回避するおまじない
location = /favicon.ico {access_log off; log_not_found off;}
### 以下、リクエストURLとNGINX上のパスとの対応を定義
# Django静的ファイルへのパスを設定
location /static/ {
root /home/ubuntu/djangapp;
}
# 管理者用ページのCSSを表示するためのパスを設定
location /static/admin {
root /home/ubuntu/venv/lib/python3.6/site-packages/django/contrib/admin/static/admin;
}
# リクエストをウェブページに流すためにunixソケットへのパスを設定
location / {
# 「/etc/nginx/proxy_params」にプロキシの設定が記載してある
include proxy_params;
# djangapp.sockにリクエスト結果を流している
proxy_pass http://unix:/home/ubuntu/djangapp/djangapp.sock;
}
}
2. Djangoを呼び出す設定ファイルへのシンボリック・リンク作成
さっき作成した「 sites-available/djangapp」は「有効やで」ということを示すために「site-enabled」にシンボリック・リンクを作成する。
接続を一時的に切りたい場合は、このシンボリック・リンクだけ消せばよい
sudo ln -s /etc/nginx/sites-available/djangapp /etc/nginx/sites-enaled
これで、sites-enabled/djangapp -> sites-available/djangappというシンボリック・リンクを作成した。一応確認。
(venv) ubuntu@ip-172-31-45-165:/etc/nginx/sites-available$ ls -la /etc/nginx/sites-enabled/
total 8
drwxr-xr-x 2 root root 4096 Apr 29 13:26 .
drwxr-xr-x 8 root root 4096 Apr 29 13:27 ..
lrwxrwxrwx 1 root root 34 Apr 29 06:54 default -> /etc/nginx/sites-available/default
# シンボリック・リンクになってる
lrwxrwxrwx 1 root root 36 Apr 29 13:26 djangapp -> /etc/nginx/sites-available/djangapp
3. NGINXとgunicornを再起動
まずはNGINXがちゃんと動くかテストしてみる
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
問題なく動いていることを確認。
つづいて、いろいろ再起動
sudo systemctl restart nginx
sudo systemctl restart gunicorn
あとはURLに接続しておしまい