Apache/mod_wsgiでDjangoを配備する際の確認ガイドです。後半のCentOS7・Python3.6向けコマンドは過去の構成記録として保持しています。新しい本番環境へそのまま実行しないでください。
新規配備で先に決めること
WSGIはPythonアプリとサーバーの接続方式で、VPNや特定のクラウド契約を要求するものではありません。この例はLinux上のApache/mod_wsgi daemon modeを想定します。Windowsのmod_wsgiではdaemon modeを使えないため、この設定をそのまま転用しません。
- 保守中のOSと、対象Django・依存パッケージが対応するPythonを選びます。mod_wsgiは、そのPythonと同じインストールに対して用意します。仮想環境の指定だけで組込みPythonの版を変更することはできません。
- 配備前に動作と復旧を確認したコード・依存を用意します。本番で最新版へ無条件更新したり、古い環境を調査のために再構築したりしません。
- プロジェクトは例として
/srv/cwiki-demo/current、仮想環境は/srv/cwiki-demo/venv、公開用の空ディレクトリは/srv/cwiki-demo/publicに分けます。実際のパスへ読み替え、Apache実行ユーザーの読取・通過権限を確認します。777やプロジェクト全体の書込許可は使いません。 - 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/ImportError | Apache/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の構成記録
以下は元の記事のコードと見出しを保った記録です。直前の注意と合わせて読み、新規導入の推奨手順として実行しないでください。
| この記事の要点 |
|---|
|
前提
・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を含むこの一式を公開領域へ置かないでください。
|
プロジェクト名/ |
wsgiモデュールの設定
旧手順の注意:旧IfModuleの否定条件にアプリ設定まで入れると、既にモジュールがロードされている場合に設定全体が飛ばされます。モジュールのロードは配布元の手順で一度だけ行い、アプリ設定をその否定条件へ入れないでください。
/etc/httpd/conf.modules.d/10-wsgi-python3.6.confを修正する。
|
<IfModule !wsgi_module> |
旧例の /var/www/html はそのまま使わず、アプリを置く非公開の絶対パスと、実際のDocumentRootを区別します。パスだけ読み替えて旧設定を有効化しないでください。
apacheのリスタート
旧手順の注意:旧サービス管理コマンドの記録です。設定テスト・変更承認・ログと戻し方を確認してから対象環境の手順で反映し、稼働中の共有Apacheを無断で再起動しません。
|
service httpd restart |
再起動の成功だけで本番公開の準備完了とは判断できません。以下の旧記録を再実行するのではなく、上の公開前チェックに戻り、動的応答・静的配信・非公開ファイルの非露出・認証・ログをそれぞれ確認してください。
子ページはありません
- 環境構築とプロジェクト/アプリの作成
- MVC(MVT)のそれぞれの使い方と説明
- データベースへの接続と操作
- Django Administration
- git管理
- エラー一覧
- バージョンの確認方法
- ログ出力方法
- SQLのログ出力方法
- ログのローテート設定
- settings.pyの定数にアクセスする方法
- 本番環境へのインストールとアプリのデプロイ(apache編)
- 本番環境へのインストールとアプリのデプロイ(nginx編)
- djangoアプリの本番の開始URLを変更する
- 静的(static)ファイルの置き場所と読み込み(画像、css、js )
- CSRFトークンをAjaxで使用する方法
- ajaxの使用例(POST編)
- ファイルのアップロードとファイルの名前
- クイックスタート/チュートリアル
- ログイン機能
- テンプレート側のログイン判定
- ビュー側のログイン判定
- 管理者ユーザーの作成/判定と管理画面
- モデルのjson化とレスポンス
- runserverでポートを指定する方法
- cronによるバッチ実行
- テンプレートで利用する共通のcontextを定義する方法
- プログラムが本番サーバーで反映されない場合の対処法
- APIの作成
- cron用コマンド・ファイルの作成
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09