SIGMA-SE Math & Tech Library

SIGMA-SE Math & Tech Library


数学と情報技術をテーマに、書籍や教材だけではつかみにくい考え方を具体例とともに簡潔にわかりやすく伝える解説サイトです。
技術の歴史や背景、関連知識の整理、学習のための覚書や要約記事も掲載しています。

VPSで作るDjangoサイト構築手順 - Apache編:3/4 Python・Django・mod_wsgi設定

概要

VPS上にPython、Django、mod_wsgiを導入し、ApacheからDjangoアプリケーションを起動するための設定を整理する。

Djangoを本番環境で動かす場合、開発用のrunserverではなく、ApacheなどのWebサーバーから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環境ではpython36upython36u-develをインストールしていた。以下も再現用の履歴であり、現在の構築手順ではない。

    $ yum -y install python36u
    $ yum -y install python36u-pip python36u-devel
    
  • バージョン確認

    $ python3.6 -V
    Python 3.6.4
    

Djangoインストール

  • venvで仮想環境を構築
    Pythonの仮想環境を作成するパッケージは、他にもvirtualenvanacondapyenvpyenv-virtualenvなど多数あるが、ここでは、Python3から標準搭載されているvenvを使用。

    vopsは、仮想環境が入るディレクトリ名なので各自の環境に合わせること。

    $ python3.6 -m venv /var/www/vops
    
  • 仮想環境上にDjangoをインストール
    pipDjangoをインストール。無指定で最新版を入れると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で、現在の環境に対応するLoadModuleWSGIPythonHomeを確認。ハードコードした共有ライブラリ名は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.pemchain.pemを別々に指定している。Apache 2.4.8以降ではSSLCertificateFilefullchain.pemを指定し、SSLCertificateChainFileは省略できる。httpd -vでバージョンを確認し、Certbotが生成した設定を優先する。秘密鍵の読取り権限は必要最小限にする。

      WSGIDaemonProcesspython-homeは仮想環境のルート、python-pathはDjangoプロジェクトをimportできるディレクトリを指定。WSGIProcessGroupには同じプロセスグループ名を設定し、WSGIScriptAliasにはwsgi.pyへのパスを指定。

      Alias /static/collectstaticSTATIC_ROOTへ集約した静的ファイルを配信する設定で、URLとファイルパスの末尾の/を対応させる。

まとめ

  • Django本番構成では、Apacheからmod_wsgiを介してアプリケーションを起動。
  • Pythonの仮想環境、Djangoプロジェクト、WSGI設定のパスをそろえることが重要となる。
  • VirtualHostではHTTPからHTTPSへのリダイレクトとDjango起動設定を分けて考える。

参考文献

この記事を共有
Xで共有 Facebookで共有 LINEで共有



Copyright SIGMA-SE All Rights Reserved.
s-hama@sigma-se.jp