概要
VPS上にPython、Django、mod_wsgiを導入し、ApacheからDjangoアプリケーションを起動するための設定を整理する。
Djangoを本番環境で動かす場合、開発用のrunserverではなく、ApacheなどのWebサーバーからWSGI経由でアプリケーションを呼び出す構成を理解することが重要になる。
この記事の構成
- 対象環境と利用上の注意
本文記載時の環境と現在そのまま利用できない箇所を確認。 - 前提環境
手順で使用するOS、ソフトウェア、構成などの前提条件を確認。 - 作業時の注意点
設定変更やコマンド実行前に確認しておきたい注意点を整理。 - CentOSにパッケージリポジトリを導入
CentOSにパッケージリポジトリを導入の手順と確認ポイントを整理。 - Pythonインストール
Pythonインストールの手順と確認ポイントを整理。 - Djangoインストール
Djangoインストールの手順と確認ポイントを整理。 - アプリケーション作成
アプリケーション作成の手順と確認ポイントを整理。 - mod_wsgiインストール
mod_wsgiインストールの手順と確認ポイントを整理。 - WSGIと仮想ホストの設定ファイル作成
WSGIと仮想ホストの設定ファイル作成の手順と確認ポイントを整理。
対象環境と利用上の注意
- 本文記載時の環境
2018年当時のCentOS 7.4、Python 3.6環境の記録をもとに、互換関係を説明するためDjango 2.2、mod_wsgi 4.9.4へ置き換えて再構成した例。
2018年当時のパッケージ構成を厳密に再現するものではない。 - 確認時期
2026年8月にPython、Django、mod_wsgiの公式資料と照合。
現在の環境でApacheからDjangoを起動する一連の手順は再実行していない。 - 現在そのまま利用できない箇所
CentOS 7、Python 3.6、Django 2.2、mod_wsgi 4.9.4は旧環境であり、記載したIUSリポジトリも新規構築には利用できない。
新規構築ではサポート中の組合せを選び、この記事はApacheとmod_wsgiを接続する考え方の参考として利用する。
前提環境
- OS
CentOS 7.4(サポート終了済み) - 言語
Python - Webサーバー
Apache - フレームワーク
Django - データベース
PostgreSQL - ドメイン
example.com
作業時の注意点
- venvとシステムPython
どちらにDjangoやmod_wsgiを入れたかを混同しない。 - WSGIファイルパス
wsgi.pyとmod_wsgiモジュールのパスを取り違えやすい。 - 静的ファイル
DjangoアプリのstaticとApacheのAlias設定を対応させる。 - VirtualHost
80番はHTTPSリダイレクト、443番はDjango起動という役割を分ける。
実施内容
CentOSにパッケージリポジトリを導入
-
開発パッケージのインストール
EPELリポジトリを有効化。
※ EPELはCentOSやRHELにない便利なパッケージを提供する外部リポジトリ。$ yum -y install epel-release -
IUSリポジトリの追加
当時は、CentOS標準より新しいPythonを導入するためにIUSリポジトリを利用していた。次のURLとパッケージは現在の新規構築には利用せず、履歴として示す。# 旧環境で使用していた例(現在は実行しない) $ yum install https://centos7.iuscommunity.org/ius-release.rpm
Pythonインストール
-
Python3.6のインストール
旧IUS環境ではpython36u、python36u-develをインストールしていた。以下も再現用の履歴であり、現在の構築手順ではない。
$ yum -y install python36u $ yum -y install python36u-pip python36u-devel -
バージョン確認
$ python3.6 -V Python 3.6.4
Djangoインストール
-
venvで仮想環境を構築
Pythonの仮想環境を作成するパッケージは、他にもvirtualenv、anaconda、pyenv、pyenv-virtualenvなど多数あるが、ここでは、Python3から標準搭載されているvenvを使用。
※vopsは、仮想環境が入るディレクトリ名なので各自の環境に合わせること。$ python3.6 -m venv /var/www/vops -
仮想環境上にDjangoをインストール
pipでDjangoをインストール。無指定で最新版を入れるとPython 3.6では動作しないため、この旧環境を再現する場合は対応するバージョンへ固定。Django 2.2自体もサポート終了済みである。$ source /var/www/vops/bin/activate # 仮想環境起動 $ python -m pip install "Django==2.2.*" -
Djangoプロジェクトの雛形作成
※opsは、プロジェクト名なので、各自の環境に合わせること。$ mkdir -p /var/www/vops/ops $ django-admin startproject ops /var/www/vops/ops
アプリケーション作成
- 実際にプログラムを配置するDjangoアプリケーションを作成。
※ ここでは、例としてwebappという名称にする。$ source /var/www/vops/bin/activate # 仮想環境起動 $ cd /var/www/vops/ops $ python manage.py startapp webapp
mod_wsgiインストール
httpd-devel、Cコンパイラ、mod_wsgiをインストールmod_wsgiをソースからビルドするため、Apacheの開発ファイルhttpd-develとCコンパイラgccを先にインストール。Pythonの開発ファイルは前述のpython36u-develで導入済みとなる。
$ source /var/www/vops/bin/activate # 仮想環境起動 $ yum install -y httpd httpd-devel gcc # mod_wsgiのビルドに必要な開発環境をインストール $ python -m pip install "mod_wsgi==4.9.4" # Python 3.6対応版へ固定mod_wsgiはビルド時に使用したPythonへ結び付くため、仮想環境とmod_wsgiのPython実装・バージョンを一致させる。
WSGIと仮想ホストの設定ファイル作成
-
Apache設定ファイルの確認
Apacheの設定ファイルhttpd.confの設定内容を確認。$ cat /etc/httpd/conf/httpd.conf … Include conf.modules.d/*.conf IncludeOptional conf.d/*.conf …- 補足
上記Includeは、conf.modules.d(module系の設定ファイル)配下の*.confをロードする設定、IncludeOptionalは、conf.d(その他設定系のファイル)配下の*.confをロードする設定となる。
そのため、次項でWSGI設定ファイル(django-wsgi.conf)と仮想ホスト設定ファイル(django.conf)を作成し、Apacheからmod_wsgiを介し、Djangoを起動できるよう、wsgi_module設定ファイルを作成。
- 補足
-
WSGI設定ファイル作成
mod_wsgi-express module-configで、現在の環境に対応するLoadModuleとWSGIPythonHomeを確認。ハードコードした共有ライブラリ名はPythonやCPUアーキテクチャによって変わるため、コマンドの出力を/etc/httpd/conf.modules.d/django-wsgi.confへ反映。
$ /var/www/vops/bin/mod_wsgi-express module-config LoadModule wsgi_module "/var/www/vops/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so" WSGIPythonHome "/var/www/vops" -
仮想ホスト設定ファイル作成
前記事でcertbot --apacheを実行した場合は、Certbotが同じServerNameのVirtualHostを生成または編集していることがある。httpd -Sで現在の定義を確認し、同じホスト名・ポートのVirtualHostを重複作成せず、既存のHTTPS用設定へWSGIと静的ファイルの設定を統合。
該当する定義がない場合は、/etc/httpd/conf.d配下にdjango.confを作成。
以下は一つに統合した設定例であり、記号を含まないApache設定として記述している。
<VirtualHost *:443> ServerName example.com SSLEngine On SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem WSGIDaemonProcess example.com processes=2 threads=15 python-home=/var/www/vops python-path=/var/www/vops/ops WSGIProcessGroup example.com WSGIScriptAlias / /var/www/vops/ops/ops/wsgi.py Alias /static/ /var/www/vops/ops/static/ <Directory /var/www/vops/ops/static> Require all granted </Directory> <Directory /var/www/vops/ops/ops> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost> <VirtualHost *:80> ServerName example.com Redirect permanent / https://example.com/ </VirtualHost>- 設定項目の補足
<VirtualHost *:443>はSSL/TLS用、<VirtualHost *:80>はHTTPからHTTPSへのリダイレクト用となる。ServerNameには自身のドメインを設定。
証明書設定はCentOS 7.4標準のApache 2.4.6を前提に、cert.pemとchain.pemを別々に指定している。Apache 2.4.8以降ではSSLCertificateFileにfullchain.pemを指定し、SSLCertificateChainFileは省略できる。httpd -vでバージョンを確認し、Certbotが生成した設定を優先する。秘密鍵の読取り権限は必要最小限にする。
WSGIDaemonProcessのpython-homeは仮想環境のルート、python-pathはDjangoプロジェクトをimportできるディレクトリを指定。WSGIProcessGroupには同じプロセスグループ名を設定し、WSGIScriptAliasにはwsgi.pyへのパスを指定。
Alias /static/はcollectstaticでSTATIC_ROOTへ集約した静的ファイルを配信する設定で、URLとファイルパスの末尾の/を対応させる。
- 設定項目の補足
まとめ
- Django本番構成では、Apacheからmod_wsgiを介してアプリケーションを起動。
- Pythonの仮想環境、Djangoプロジェクト、WSGI設定のパスをそろえることが重要となる。
- VirtualHostではHTTPからHTTPSへのリダイレクトとDjango起動設定を分けて考える。
参考文献
- Python 3 ドキュメント「venv — 仮想環境の作成」(日本語・公式仕様)
- Django 5.2 ドキュメント「DjangoをApacheとmod_wsgiとともに使うには?」(日本語・現行構成の公式解説)
- Django 2.2 Documentation, How to use Django with Apache and mod_wsgi(英語・記事内旧環境の公式解説)
- The CentOS Project, CentOS Linux(英語・CentOS Linux 7のEOL案内)
- mod_wsgi Documentation, Virtual Environments(英語・仮想環境連携の公式解説)