DjangoをgunicornでNginxサーバー上に公開する方法

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年10月)

✔当記事は以下のような疑問を抱く方へ向けて作成されました。

「gunicornを使ってみたい。」

「DjangoアプリをgunicornとNginxで動かす方法を知りたい」

「DjangoとgunicornとNginxを利用した実際の例を見たい」

✔当記事を通じて、あなたに伝えたい事

  • DjangoをNginxで公開するための基本
  • Django・gunicorn・Nginxの設定方法とその適用法
  • DjangoとgunicornとNginxの実用例

当記事では、「gunicorn」「Nginx」の基本知識から、その設定方法や適用法、具体的な使用例まで、詳細に説明しています。

最後までぜひお読みください。

✔動画を見ながら一緒に手を動かしましょう。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

gunicornの基礎知識

まずはgunicornについて簡単に見ていきましょう。

基本を抑えたうえで、実際のコード・コマンドへと進みます。

  • gunicornとは?
  • WSGIとは?

gunicornとは?

gunicorn は “Green Unicorn” の略で、Python の WSGI HTTP サーバーのひとつです。

WSGI は、Pythonで書かれたWebアプリケーションとWebサーバー間の標準的なインターフェースを定めたもの。

gunicornは、このWSGIアプリケーションを動かすためのもので、特に本番環境での使用に適しています。

gunicornの主な特徴としては以下のとおりです。

  1. プロセスベースのアーキテクチャ
    gunicornは、pre-forkワーカーモデルを採用しています。これにより、複数のワーカープロセスを管理してリクエストを効率的に処理が可能です。
  2. 簡単な設定
    コマンドラインツールとして動作し、簡単な引数や設定ファイルで動作をカスタマイズできます。
  3. 広い互換性
    gunicornは、多くのWSGIアプリケーションやフレームワーク(Django, Flaskなど)と互換性があります。

gunicornは通常、リバースプロキシ(たとえばNginxやApache)の背後に配置されることが多いです。

静的コンテンツの配信やSSL/TLSの終端処理、リクエストのバランシングなどの機能を高効率でおこなえます。

WSGIとは?

WSGI(Web Server Gateway Interface)は、PythonのWebアプリケーションとWebサーバー間の標準的なインターフェースを定義したものです。

WSGIの主な目的は、WebサーバーとWebアプリケーション(またはフレームワーク)が一貫した方法で連携し、交互に動作させること。

以下は、WSGIの主な特徴とコンセプトです。

  1. アプリケーションオブジェクト: WSGIアプリケーションは、2つの引数を取る呼び出し可能なPythonオブジェクト(通常は関数またはクラスのメソッド)として定義されます。これらの引数は「環境」情報と「start_response」呼び出し可能オブジェクトです。
  2. 環境: 最初の引数として渡される環境は、リクエストに関する情報を含む辞書です(たとえばHTTPメソッド、ヘッダー、URLなど)。
  3. start_response: アプリケーションがヘッダーやステータスコードなどのレスポンスの開始情報をサーバーに伝えるための関数です。
  4. 応答ボディ: アプリケーションオブジェクトは、レスポンスのボディを表すイテレータを返す必要があります。

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による方法も以下の記事で公開しています。

ぜひこちらも学んでみてください。

タイトルとURLをコピーしました