41
31

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をNGINXとgunicornを使って動かすときの流れ整理(自分用メモ)

Posted at

はじめに

勉強していて、DjangoをリモートホストにデプロイしたあとのNGINXとgunicronの設定回りがよくわからなくなったので、自分用にメモ

やりたいこと

Djangoで作ったアプリケーションをクラウド上にデプロイし、静的ファイルを表示するだけなどの軽い処理はウェブサーバー(NGINX)で処理し、Djangoでの動的な処理など重い処理はAPサーバー(gunicron)で行いたい。

まとめると、以下のようなイメージ
image.png

  • nginx
    • 主に静的ファイルを表示するウェブサーバー
    • 自分自身は重たい仕事はしない(ngninxにさせるのはHTMLの表示くらい)
    • ロードバランサー的に振る舞い、重い処理だけgunicornに振る
  • gunicorn
    • Djangoを動かすAPサーバー
    • 静的ファイル(HTMLとか)のみ表示する場合には不要なので、Pythonが必要な場合だけ呼び出したい。

必要な作業の流れ

上記を実現するためには、以下の作業が必要(Djangoアプリケーションはすでにサーバーにデプロイされてる前提)

  1. NGINXがDjangoサイトを呼び出すにあたっての設定ファイルを用意する
    • 設定ファイルは「/etc/nginx/sites-available」フォルダにてきとうな名前でつくる
    • 設定ファイルに書く内容は、「このポートを使うやで」とか
  2. 「/etc/nginx/sites-enabled」フォルダに、上記1で作ったファイルへのシンボリック・リンクを張る
    • こうすることで、上記No.1のファイルが無効になったらシンボリック・リンクを切ればよいだけになる
    • シンボリックリンクそもそも何という人は「ショートカットリンクみたいなもんん」と思っとけばおk
  3. NGINXとgunicronを再起動してアクセスする

1. NGINXがDjangoサイトを呼び出す用の設定ファイル作成

 「/etc/nginx/sites-available」に、NGINXが呼び出すウェブサイト(ここではDjangoアプリ)の設定ファイルを追加する。こうすることで、NGINXがそのサイトを呼び出せるようになる。

/etc/nginx/sites-availableにファイルを追加
cd /etc/nginx/sites-available
sudo vi djangapp

この「djangapp」に記載された設定にしたがい、NGINXはDjangoを呼び出す。
次に、作成した設定ファイルに情報を記載する。なお今回NGINXは以下の二つをしたい。

  1. 静的ファイルを表示
  2. リクエストの情報をdjangapp.sock(gunicornとのソケット用ファイル)に流す

設定ファイルの中身はこんな感じ

etc/nginx/sites-available/djangapp
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がちゃんと動くかテストしてみる

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

問題なく動いていることを確認。
つづいて、いろいろ再起動

NGINXを再起動
sudo systemctl restart nginx
gunicornを再起動
 sudo systemctl restart gunicorn

あとはURLに接続しておしまい

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?