◀ 12.

本番環境へのdjangoのインストールとアプリのデプロイ(apache編)

▶

Apache/mod_wsgiでDjangoを配備する際の確認ガイドです。後半のCentOS7・Python3.6向けコマンドは過去の構成記録として保持しています。新しい本番環境へそのまま実行しないでください。

Apacheが公開する静的領域と、DocumentRootの外でmod_wsgiが実行するDjangoアプリを分離する構成

新規配備で先に決めること

WSGIはPythonアプリとサーバーの接続方式で、VPNや特定のクラウド契約を要求するものではありません。この例はLinux上のApache/mod_wsgi daemon modeを想定します。Windowsのmod_wsgiではdaemon modeを使えないため、この設定をそのまま転用しません。

  1. 保守中のOSと、対象Django・依存パッケージが対応するPythonを選びます。mod_wsgiは、そのPythonと同じインストールに対して用意します。仮想環境の指定だけで組込みPythonの版を変更することはできません。
  2. 配備前に動作と復旧を確認したコード・依存を用意します。本番で最新版へ無条件更新したり、古い環境を調査のために再構築したりしません。
  3. プロジェクトは例として /srv/cwiki-demo/current、仮想環境は /srv/cwiki-demo/venv、公開用の空ディレクトリは /srv/cwiki-demo/public に分けます。実際のパスへ読み替え、Apache実行ユーザーの読取・通過権限を確認します。777やプロジェクト全体の書込許可は使いません。
  4. DB・秘密値・ユーザーuploadの保存先と権限、バックアップ/復旧、TLS終端を先に決めます。ソースや秘密値を静的配信の対象へ混ぜません。

ApacheとDjangoの設定例

次は既存のHTTPS VirtualHost内に挿入するLinux向けの構成例です。TLS証明書やモジュールのロードを含む完成設定ではありません。ドメイン・パス・プロセス名を実環境へ置き換え、同じApache内でプロセス名を重複させません。新規静的Aliasはアプリ全体のWSGIScriptAliasより先に記載します。

# Insert inside an existing HTTPS VirtualHost after loading mod_wsgi once.
# Paths, process-group name and ServerName are deployment-specific examples.
ServerName example.com
DocumentRoot /srv/cwiki-demo/public

<Directory /srv/cwiki-demo/public>
    Require all granted
    Options -Indexes
    AllowOverride None
</Directory>

Alias /static/ /srv/cwiki-demo/static/
<Directory /srv/cwiki-demo/static>
    Require all granted
    Options -Indexes
    AllowOverride None
</Directory>

WSGIDaemonProcess cwiki_demo python-home=/srv/cwiki-demo/venv python-path=/srv/cwiki-demo/current
WSGIProcessGroup cwiki_demo
WSGIScriptAlias / /srv/cwiki-demo/current/project/wsgi.py
<Directory /srv/cwiki-demo/current/project>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

Django側は既存settingsに次の項目を統合します。これだけで完成する設定ではなく、実際のアプリ/DB/middleware等を別途保ちます。秘密値はApache/mod_wsgiの起動元に渡すなどの配備方式で読み込ませます。ApacheのSetEnvだけではPythonのos.environへ渡るとは限らないため、実プロセスで確認してください。

# Merge with the project's real settings; this is not a complete settings module.
import os

SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
DEBUG = False
ALLOWED_HOSTS = ["example.com"]
STATIC_URL = "/static/"
STATIC_ROOT = "/srv/cwiki-demo/static/"
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

公開前の確認と、失敗時の見方

確認対象確認方法・注意
Django設定本番用settingsを指定して python manage.py check --deploy を実行し、警告の意味を個別に確認します。警告ゼロでも本番の全安全性の保証ではありません。
静的ファイルSTATIC_ROOTをソースやupload先と分離し、内容を確認して python manage.py collectstatic --noinput を実行します。これは配備先へ書き出す処理であり、単なる診断コマンドではありません。収集後に実URLでCSS/画像を確認します。
Apache対象環境の apachectl configtest 等で構文を検査してから、承認された反映手順を使います。構文成功とWSGIアプリの起動成功は別です。
動的応答実ホスト名でアプリへ接続し、応答・Host検証・必要な認証を確認します。開発runserverの成功をmod_wsgiの成功と扱いません。
公開範囲自分の検証環境でソース・.git・DB・秘密ファイルを取得できないことを確認します。拒否設定だけでなく、外部からの経路とアプリの配信処理も点検します。
500/ImportErrorApache/WSGIのログ、実Python、仮想環境、import path、実行ユーザー権限、必要な環境変数を照合します。DEBUG=Trueで公開したり、秘密値入りログを共有したりしません。

内容確認:2026年10月26日。説明・Python設定断片・Django 5.2系のWSGI/Host検証を隔離確認しています。Apache/mod_wsgi、TLS、実DB・権限・本番負荷の統合検証は行っていません。開発時のrunserverと本番配備は用途が異なります。静的ファイルも合わせて確認してください。

出典:DjangoのApache/mod_wsgi配備、公開前チェックリスト、mod_wsgiと仮想環境、Python3.6のサポート終了、CentOS Linuxのサポート終了。

旧CentOS/Python3.6の構成記録

以下は元の記事のコードと見出しを保った記録です。直前の注意と合わせて読み、新規導入の推奨手順として実行しないでください。

この記事の要点
  • Django アプリを Apache + mod_wsgi 構成で本番デプロイする手順
  • 旧CentOS/Python3.6の記録を残しつつ、現行化の判断・公開範囲・mod_wsgiとPythonの一致条件を先に説明します。
  • 手順: Python3 / pip / mod_wsgi インストール → Django プロジェクト配置 → Apache 設定 → 静的ファイル収集
  • Apache 設定で WSGIScriptAlias とファイル所有権を正しく設定するのが要点

 

前提

・Webサーバーはapacheを使用します。

・以下はPython3.6を使った旧手順です。3.6はサポート終了済みで、新規導入には使いません。単純なバージョン番号の置換ではなく、OS・Django・依存パッケージ・mod_wsgiの対応を一緒に確認します。

・元の「VPN」は仮想サーバーを表すVPSとの混同です。WSGIがVPNを必須にするわけではありません。mod_wsgiやApacheの設定変更が許可された環境が必要で、共用レンタルサーバーは提供機能を事業者へ確認します。CGIだけが選択肢だと決めつけません。

・旧例の配布先はCentOS7向けです。CentOS Linux 7は2024年6月30日にサポート終了しています。CentOS Stream等の別製品と同一扱いせず、新規配備には保守中のOSを選びます。

 

Python3のインストール

旧手順の注意:旧CentOS7/IUSの導入コマンドです。新規環境で実行しません。保守中のOSが提供するPythonと、その配布元の導入方法を確認します。

yum install -y https://centos7.iuscommunity.org/ius-release.rpm

yum install -y python36u python36u-libs python36u-devel python36u-pip

 

pipのアップグレード

旧手順の注意:旧Python3.6向けの記録です。システム全体のpipを無条件更新せず、対象アプリの仮想環境・Python対応範囲・依存の固定方法を確認します。

pip3.6 install --upgrade pip

 

djangoのインストール

旧手順の注意:版を指定しない旧導入例です。現在のDjangoがPython3.6で動くという意味ではありません。移行先で互換性を検証した依存を固定します。

pip3.6 install django

 

wsgiモデュールのインストール

旧手順の注意:旧配布パッケージの記録です。mod_wsgiをビルドしたPythonと同じインストール由来の仮想環境を用意し、名前だけの一致で判断しません。

yum install -y python36u-mod_wsgi

 

アプリのデプロイ

訂正:Djangoプロジェクト全体をDocumentRootへ配置することは勧めません。ソース・.git・DB・秘密値は公開領域の外へ置き、WSGIエントリーポイントと収集済み静的ファイルの公開を分けます。

以下の構成図は旧記事の記録です。ファイルの役割の確認用に保持していますが、.gitやdb.sqlite3を含むこの一式を公開領域へ置かないでください。

プロジェクト名/
    .git
    .gitignore
    db.sqlite3
    manage.py
   
プロジェクト名/
        __init__.py
        settings.py
        urls.py
       
wsgi.py
    アプリケーション名/
        __init__.py
        __pycache__/
        admin.py
        apps.py
        migrations/
        models.py
        views.py

 

wsgiモデュールの設定

旧手順の注意:旧IfModuleの否定条件にアプリ設定まで入れると、既にモジュールがロードされている場合に設定全体が飛ばされます。モジュールのロードは配布元の手順で一度だけ行い、アプリ設定をその否定条件へ入れないでください。

/etc/httpd/conf.modules.d/10-wsgi-python3.6.confを修正する。

<IfModule !wsgi_module>
    LoadModule wsgi_module modules/mod_wsgi_python3.6.so
    WSGIScriptAlias /
/var/www/html/プロジェクト名/プロジェクト名/wsgi.py
    WSGIPythonPath
/var/www/html/プロジェクト名/
    <Directory /var/www/html/プロジェクト名/プロジェクト名>
    <Files wsgi.py>
        Require all granted
    </Files>
    </Directory>
</IfModule>

旧例の /var/www/html はそのまま使わず、アプリを置く非公開の絶対パスと、実際のDocumentRootを区別します。パスだけ読み替えて旧設定を有効化しないでください。

 

apacheのリスタート

旧手順の注意:旧サービス管理コマンドの記録です。設定テスト・変更承認・ログと戻し方を確認してから対象環境の手順で反映し、稼働中の共有Apacheを無断で再起動しません。

service httpd restart

 

再起動の成功だけで本番公開の準備完了とは判断できません。以下の旧記録を再実行するのではなく、上の公開前チェックに戻り、動的応答・静的配信・非公開ファイルの非露出・認証・ログをそれぞれ確認してください。

子ページ

子ページはありません

同階層のページ
  1. 環境構築とプロジェクト/アプリの作成
  2. MVC(MVT)のそれぞれの使い方と説明
  3. データベースへの接続と操作
  4. Django Administration
  5. git管理
  6. エラー一覧
  7. バージョンの確認方法
  8. ログ出力方法
  9. SQLのログ出力方法
  10. ログのローテート設定
  11. settings.pyの定数にアクセスする方法
  12. 本番環境へのインストールとアプリのデプロイ(apache編)
  13. 本番環境へのインストールとアプリのデプロイ(nginx編)
  14. djangoアプリの本番の開始URLを変更する
  15. 静的(static)ファイルの置き場所と読み込み(画像、css、js )
  16. CSRFトークンをAjaxで使用する方法
  17. ajaxの使用例(POST編)
  18. ファイルのアップロードとファイルの名前
  19. クイックスタート/チュートリアル
  20. ログイン機能
  21. テンプレート側のログイン判定
  22. ビュー側のログイン判定
  23. 管理者ユーザーの作成/判定と管理画面
  24. モデルのjson化とレスポンス
  25. runserverでポートを指定する方法
  26. cronによるバッチ実行
  27. テンプレートで利用する共通のcontextを定義する方法
  28. プログラムが本番サーバーで反映されない場合の対処法
  29. APIの作成
  30. cron用コマンド・ファイルの作成

最近更新/作成されたページ