SIGMA-SE Tech Blog

SIGMA-SE Tech Blog


当サイトは、過去に運営していた別ドメイン(unisia-se.com)から sigma-se.com へ移行した技術ブログです。
旧サイトの記事をもとに、内容の精査・加筆・最新化を行い再構成しています。
正確で実用的な情報提供を目的としています。

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

概要

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

Djangoを本番環境で動かす場合、開発用のrunserverではなく、ApacheなどのWebサーバーからWSGI経由でアプリケーションを呼び出す構成を理解することが重要になる。

前提環境

項目 内容
OS CentOS 7.4
言語 Python
Webサーバー Apache
フレームワーク Django
データベース PostgreSQL
ドメイン example.com

この記事で扱うこと

  • EPEL/IUSリポジトリの導入意図。
  • Pythonとvenvによる仮想環境の作成。
  • Djangoプロジェクトとアプリケーションの作成。
  • mod_wsgiを使ってApacheとDjangoを接続する流れ。
  • VirtualHostとWSGI設定の役割。

作業前に確認すること

項目 確認内容
Python環境 利用するPythonバージョンと仮想環境の場所を決める。
Django構成 プロジェクト名、アプリケーション名、配置ディレクトリを整理する。
Apache設定 conf.modules.d と conf.d の読み込み関係を確認する。
mod_wsgi Pythonバージョンに合ったモジュールパスを確認する。
HTTPS設定 前段のSSL/TLS設定とVirtualHostの関係を確認する。

作業時の注意点

作業時の注意点 整理するポイント
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リポジトリの追加
    Pythonの最新アップストリームバージョンを提供するリポジトリ。
    IUSリポジトリ経由 でPythonの最新バージョンをインストールできるようにする。

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

Pythonインストール

  • Python3.6のインストール
    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をインストールする。

    $ source /var/www/vops/bin/activate    # 仮想環境起動
    $ pip install django    # djangoインストール
    
  • Djangoプロジェクトの雛形作成
    opsは、プロジェクト名なので、各自の環境に合わせること。

    $ django-admin startproject /var/www/vops/ops
    

アプリケーション作成

  • 実際にプログラムの成果物を配置することになるアプリケーションを作成 ※ ここでは、macuosという名称のアプリケーションを作成する。
    $ source /var/www/vops/bin/activate    # 仮想環境起動
    $ python manage.py startapp /var/www/vops/ops/macuos    # アプリケーションを作成
    

mod_wsgiインストール

  • httpd-develmod_wsgiをインストール Python3上では事前にhttpd-develをインストールする必要があるため、mod_wsgiの前に httpd-develをインストールする。
    $ source /var/www/vops/bin/activate    # 仮想環境起動
    $ yum install -y httpd httpd-devel    # httpd-develをインストール
    $ pip3.6 install mod_wsgi    # pipでmod_wsgiをインストール
    

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設定ファイル作成
    /etc/httpd/conf.modules.d配下に下記の内容でdjango-wsgi.confを作成する。

    LoadModule wsgi_module  /var/www/vops/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
    
    • 補足
      ※ wsgi_moduleのファイルパスは、findで確認。
      $ find /var/www -name 'mod_*.so'
      
  • 仮想ホスト設定ファイル作成
    /etc/httpd/conf.d配下に下記の内容でdjango.confを作成する。

    NameVirtualHost *:80
    NameVirtualHost *:443
    WSGISocketPrefix run/wsgi
    
    <VirtualHost *:443>… (※1)
        ServerName example.com … (※2)
        SSLEngine On … (※3)
        SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem … (※4)
        SSLCertificateKeyFile  /etc/letsencrypt/live/example.com/privkey.pem … (※4)
    
        WSGIDaemonProcess example.com processes=2 threads=15 python-home=/var/www/vops python-path=/var/www/vops/lib64/python3.6/site-packages … (※5)
        WSGIProcessGroup example.com … (※6)
        WSGIScriptAlias / /var/www/vops/ops/ops/wsgi.py … (※7)
    
        Alias /static /var/www/vops/ops/macuos/static … (※8)
        <Directory /var/www/vops/ops/macuos/static> 
            Require all granted
        </Directory>
    
        <Directory /var/www/vops/ops/ops> … (※9)
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>
    </VirtualHost>
    <VirtualHost *:80>… (※10)
        ServerName example.com
        RewriteEngine on
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </VirtualHost>
    
    • 上記注釈
      ※1 SSL/TLSポートのVirtualHost。
      ※2 ServerName:自身のドメイン、サブドメイン、IP等を設定。
      ※3 SSLEngine:SSL/TLSエンジンの有効化。
      ※4 SSL/TLSサーバー証明書と秘密鍵の設定。Apache2.4では、上記のSSLCertificateFile、SSLCertificateKeyFileの設定になるが、Apache2.2だとSSLCertificateFile、SSLCertificateKeyFile、SSLCertificateChainFileの3つに設定が必要でさらに内容も若干違うため、バージョンが古い場合は、注意が必要。
      ※5 マルチプロセスかつ、デーモンモードでの起動設定。
      ※6 WSGIDaemonProcessと同じ、example.comを設定する必要あり。
      ※7 wsgi.pyエイリアスと起動直後のトップ画面をhttps://example.comで表示したい場合の設定。 例えば、トップ画面から"XXX"というサブフォルダを掘りたい場合は、WSGIScriptAliasの第一パラメータに"/XXX"を指定する。
      ※8 静的ファイルへの(アイコンや画像など)エイリアスを設定 及び、静的フォルダまでのパスを設定。
      ※9 wsgi.pyまでのパスを設定。(起動直後にwsgi.pyを実行するよに設定)
      ※10 httpデフォルトの80ポートのVirtualHost。httpsにリダイレクトするように設定。

実務とのつながり

  • WSGI構成
    Djangoを本番Webサーバーで動かす基本構成の理解につながる。
  • 仮想環境
    プロジェクトごとに依存関係を分離する実務上の基本になる。
  • Apache設定分割
    設定ファイルを役割ごとに分けると、保守や障害調査がしやすくなる。

まとめ

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


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