(最終更新月:2023年10月)
✔当記事は以下のような疑問を抱く方へ向けて作成されました。
「gunicornを使ってみたい。」
「DjangoアプリをgunicornとNginxで動かす方法を知りたい」
「DjangoとgunicornとNginxを利用した実際の例を見たい」
✔当記事を通じて、あなたに伝えたい事
- DjangoをNginxで公開するための基本
- Django・gunicorn・Nginxの設定方法とその適用法
- DjangoとgunicornとNginxの実用例
当記事では、「gunicorn」「Nginx」の基本知識から、その設定方法や適用法、具体的な使用例まで、詳細に説明しています。
最後までぜひお読みください。
✔動画を見ながら一緒に手を動かしましょう。
gunicornの基礎知識
まずはgunicornについて簡単に見ていきましょう。
基本を抑えたうえで、実際のコード・コマンドへと進みます。
- gunicornとは?
- WSGIとは?
gunicornとは?
gunicorn
は “Green Unicorn” の略で、Python の WSGI HTTP サーバーのひとつです。
WSGI は、Pythonで書かれたWebアプリケーションとWebサーバー間の標準的なインターフェースを定めたもの。
gunicornは、このWSGIアプリケーションを動かすためのもので、特に本番環境での使用に適しています。
gunicornの主な特徴としては以下のとおりです。
- プロセスベースのアーキテクチャ
gunicornは、pre-forkワーカーモデルを採用しています。これにより、複数のワーカープロセスを管理してリクエストを効率的に処理が可能です。 - 簡単な設定
コマンドラインツールとして動作し、簡単な引数や設定ファイルで動作をカスタマイズできます。 - 広い互換性
gunicornは、多くのWSGIアプリケーションやフレームワーク(Django, Flaskなど)と互換性があります。
gunicornは通常、リバースプロキシ(たとえばNginxやApache)の背後に配置されることが多いです。
静的コンテンツの配信やSSL/TLSの終端処理、リクエストのバランシングなどの機能を高効率でおこなえます。
WSGIとは?
WSGI(Web Server Gateway Interface)は、PythonのWebアプリケーションとWebサーバー間の標準的なインターフェースを定義したものです。
WSGIの主な目的は、WebサーバーとWebアプリケーション(またはフレームワーク)が一貫した方法で連携し、交互に動作させること。
以下は、WSGIの主な特徴とコンセプトです。
- アプリケーションオブジェクト: WSGIアプリケーションは、2つの引数を取る呼び出し可能なPythonオブジェクト(通常は関数またはクラスのメソッド)として定義されます。これらの引数は「環境」情報と「start_response」呼び出し可能オブジェクトです。
- 環境: 最初の引数として渡される環境は、リクエストに関する情報を含む辞書です(たとえばHTTPメソッド、ヘッダー、URLなど)。
- start_response: アプリケーションがヘッダーやステータスコードなどのレスポンスの開始情報をサーバーに伝えるための関数です。
- 応答ボディ: アプリケーションオブジェクトは、レスポンスのボディを表すイテレータを返す必要があります。
WSGIの導入により、PythonのWebフレームワーク(Django、Flask、Pyramidなど)は、さまざまなWebサーバー(gunicorn、uWSGI、mod_wsgiなど)と互換性を持つようになりました。
詳しくはこちらもご覧ください。
Nginxについて知っておくべき前提知識
Nginxについても最低限以下のことを知らなければなりません。
- Nginxとは?
- Nginxの設定ファイルの書き方
- UbuntuにNginxを設定する方法
Nginxとは?
NginxはApacheに並ぶ人気のWebサーバーソフトウェアのひとつ。
とくにその性能から、大規模なサイトなどに向いていると言われています。
以下の記事で詳しく解説しています。
Nginxの設定ファイルの書き方
Nginxを使いこなすには、設定ファイルが使いこなせなければなりません。
設定ファイルにより、サーバー上でさまざまな設定がおこなえるからです。
UbuntuにNginxを設定する方法
Linuxのディストリビューション「Ubuntu」上で、NginxをWebサーバーとして動かす方法を知っておきましょう。
自身でサーバーが作れれば、その仕組みが簡単に理解できるはず。
Djangoアプリをgunicorn×Nginxで公開する方法
いよいよ、Djangoアプリをgunicorn×Nginxで公開する方法をご覧いただきます。
順を追って、見ていきましょう。
- 公開時のファイル構成
- 必要なライブラリ・パッケージ
- Djangoのsettings.py
- gunicornの起動
- Nginxの起動と設定
公開時のファイル構成
公開ファイルの構成は以下のとおりです。
/apps
├── logs
├── share
│ ├── static
│ └── media
├── venv
└── src
venvは仮想環境のフォルダで、次章で作成方法をご覧いただきます。
srcはDjangoプロジェクトのフォルダで、その中のフォルダ構造は以下のようになっています。
/apps/src
├── db.sqlite3
├── main #wsgiの指定で使用するので覚えておきましょう。
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── templates
必要なライブラリ・パッケージ
aptとpipで必要なものをインストールしていきます。
以下を順番に実行しましょう。
aptでインストールするもの。
sudo apt install python3-pip nginx
まずはpipで仮想環境(virtualenv)をインストールし、起動しましょう。
pip3 install virtualenv
virtualenv venv
source venv/bin/activate
お好きなフォルダ内で実施します。
今回は/appとして、進めましょう。
仮想環境内でインストール。
pip install Django gunicorn
Djangoのsettings.py
Djangoのsettings.pyに以下を追記します。
ALLOWED_HOST = ["ご自身のIPアドレス、もしくはドメイン名"]
STATIC_ROOT = '/app/share/static'
MEDIA_URL = '/media/'
MEDIA_ROOT = '/app/share/media'
gunicornの起動
以下のコマンドでgunicornを起動しましょう。
gunicorn main.wsgi:application --bind 127.0.0.1:7001
実行は「src」フォルダ(Djangoのプロジェクトフォルダ)上でおこなってください。
「main」が、wsgi.pyを持つディレクトリの名前です。
Nginxの起動と設定
Nginxを起動します。
sudo service nginx start
#もしくはこちらのコマンド
/usr/sbin/nginx -g "daemon off;"
Nginxの設定を追加します。
例えばファイルを、以下に作ります。
/app/nginx-available/main.conf
server {
listen 80;
server_name xxx.com; #サーバーのIPアドレスもしくはドメインを入れてください。
access_log /app/logs/access.log;
error_log /app/logs/nginx.error.log debug;
location /static {
alias /app/share/static;
}
location /media {
alias /app/share/media;
}
location / {
proxy_pass http://127.0.0.1:7001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
シンボリックリンクを通します。
sudo ln -s /app/nginx-available/main.conf /etc/nginx/sites-enabled/main
シンボリックリンクを貼ることで、Ngixnが設定を読み込めるようになります。
Nginxを再起動してアクセスしてみましょう。
sudo service ngixn restart
まとめ
Nginxとgunicornで、Djangoアプリを公開する手順は以下のとおり。
- Djangoアプリを作る
- 必要なパッケージをインストールする
- gunicornの設定をする
- Nginxの起動・設定をする
公開することで、ポート8000などのアクセスではなく、ポート80(通常のHTTP)でのアクセスが可能になります。
ぜひうまく活用してください。
またApacheによる方法も以下の記事で公開しています。
ぜひこちらも学んでみてください。