Djangoアプリケーションの本番環境デプロイとパフォーマンス最適化(PM2によるプロセス管理・オフラインインストール対応)

本番環境向けDjangoプロジェクトの準備

まず、Djangoプロジェクトが本番環境で正常に動作することを確認する。

# デプロイ前のチェック
python manage.py check --deploy

出力された警告やエラーに対応する。主な設定変更は以下の通り:

  • settings.pyDEBUG = False を設定
  • ALLOWED_HOSTS を適切に指定(例: ['your-domain.com', '172.16.101.72']
  • 開発用ツール(debug_toolbar)をすべて無効化

セキュリティとCORS設定

クロスオリジンリソース共有(CORS)を許可し、セキュリティヘッダーを強化する。

# 必要ならインストール
# pip install django-cors-headers

# settings.py
INSTALLED_APPS += ['corsheaders']
MIDDLEWARE.insert(0, 'corsheaders.middleware.CorsMiddleware')

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_HEADERS = (
    'accept', 'accept-encoding', 'authorization', 'content-type',
    'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', 'token'
)
CORS_ALLOW_METHODS = ('DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT')

SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = 'DENY'

Linuxサーバーへのデプロイ手順

プロジェクトディレクトリ構造を作成し、コードをクローン:

mkdir -p project/{conf,code,static,logs}
cd project/code
git clone --depth=1 https://gitee.com/アカウント/izufang.git

仮想環境の構築と依存関係のインストール

pip3 install virtualenv
virtualenv --python=$(which python3) ../venv
source ../venv/bin/activate
pip install -r izufang/requirements.txt
pip install uwsgi

uWSGI設定

project/conf/uwsgi.ini を作成:

[uwsgi]
base = /root/project
name = izufang
master = true
processes = 4
pythonhome = %(base)/venv
chdir = %(base)/code/%(name)
module = %(name).wsgi
socket = 0.0.0.0:8000

起動コマンド:

uwsgi --ini conf/uwsgi.ini &

Nginx連携設定

/etc/nginx/nginx.confserver ブロックを修正:

server {
    listen 80;
    server_name _;

    location / {
        include uwsgi_params;
        uwsgi_pass 172.16.101.72:8000;
    }

    location /static/ {
        alias /root/project/static/;
        expires 30d;
    }
}

静的ファイル収集:

# settings.py
STATIC_ROOT = '/root/project/static'

# コマンド実行
python manage.py collectstatic --noinput
chown -R nginx:nginx /root/project/static

Gunicorn代替設定(オプション)

uWSGIの代わりにGunicornを使用する場合:

# gun_conf.py
import multiprocessing

bind = "127.0.0.1:8001"
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = "gevent"
timeout = 30
reload = True

起動方法:

gunicorn -c gun_conf.py izufang.wsgi:application

PM2によるプロセス管理

Node.js環境を構築し、PM2をグローバルインストール:

wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linux-x64.tar.xz
tar xvf node-v14.15.1-linux-x64.tar.xz
ln -s /root/node-v14.15.1-linux-x64/bin/node /usr/local/bin/node
ln -s /root/node-v14.15.1-linux-x64/bin/npm /usr/local/bin/npm
npm install -g pm2
ln -s /root/node-v14.15.1-linux-x64/bin/pm2 /usr/local/bin/pm2

PM2基本操作

  • pm2 start app.sh --name django-app
  • pm2 list:プロセス一覧
  • pm2 logs django-app:ログ表示
  • pm2 save + pm2 startup:自動起動設定

ログローテート設定

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true

オフライン環境へのPM2導入

インターネット接続がない環境でもNode.jsとPM2を導入可能:

# オンライン環境でパッケージ作成
tar -zcvf node-v14.15.1-linux-x64.tar.gz node-v14.15.1-linux-x64/

# オフラインサーバーへ転送・展開
scp node-v14.15.1-linux-x64.tar.gz user@offline:/opt/
tar -zxvpf node-v14.15.1-linux-x64.tar.gz

# 環境変数設定
echo 'export PATH="/opt/node-v14.15.1-linux-x64/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

# 動作確認
node -v && npm -v && pm2 -v

タグ: Django uWSGI Gunicorn nginx pm2

7月2日 21:21 投稿