UNISIA-SE Tech Blog

気まぐれお勉強日記

[6] Apache + Django + PostgreSQLで本番環境を構築 (設定編)

1. 前提条件


▼ 以下の環境下であることが前提。
・OS:CentOS7.4
・ドメイン:example.com
・Webサーバー:Apache2.4.6 + mod_wsgi
・開発言語:Python3.6(venv)、Python2.7(標準搭載)
・FW:Django2.0
・DB:PostgreSQL9.2
・仮想環境フォルダ:/var/www/vops
・プロジェクトフォルダ:/var/www/vops/ops
・アプリケーションフォルダ:/var/www/vops/ops/macuos

※「次ページ」以降の下記ページは、この環境を作ることを目的とした関連記事。
[1] VPS契約とCentOSインストール + 初期設定
[2] CentOS7にApacheインストール + アクセス周りの設定
[3] Let's EncryptのSSL/TLS導入と定期更新
[4] Python、Djangoインストール + Django起動確認
[5] Apache + Django + PostgreSQLで本番環境を構築 (インストール編)

2. 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 をロードする設定となる。

そのため、次項で django-wsgi.confdjango.conf を新規作成し、Apache からmod_wsgi を介し、Djangoを起動できるように設定する。

3. wsgi_module設定ファイルの作成


/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'

4. Django設定ファイルの作成


/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にリダイレクトするように設定。

5. settings.pyの設定


アプリケーションメインの設定ファイルとなる settings.py を設定する。
以下、設定の修正をした箇所のみ抜粋して記載する。

▼ デバッグモードの無効化

DEBUG = False # 開発モードのTrueからFalseに修正。

▼ ALLOWED_HOSTSを自身のドメインに設定する。

ALLOWED_HOSTS = ['example.com'] # 自身のドメインに修正。

▼ INSTALLED_APPSにアプリケーション名を追加する。

INSTALLED_APPS = [
    'macuos', # アプリケーション名を追加。
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

▼ SSL/TLS周りの設定を追加。

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

▼ ROOT_URLCONFの修正

ROOT_URLCONF = 'ops.urls' # インタセプターの指令ファイルを指定。

プロジェクト名 "ops" の/var/www/vops/ops/ops/urls.pyを真っ先に読込むように設定している。

▼ DATABASESの設定
sqliteからPostgreSQLに変更する。
「[5] Apache + Django + PostgreSQLで本番環境を構築 (インストール編)」で設定したデータベース名、及びユーザー名を指定すること。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'macuosdb', 
        'USER': 'padmin',
        'PASSWORD': '*****',
        'HOST': 'example.com',
        'PORT': '5432'
    }
}

▼ 日本語化、タイムゾーンの設定
デフォルトの LANGUAGE_CODETIME_ZONE を下記のように変更し、USE_I18NUSE_L10NUSE_TZ をすべてTrueで追加する。

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
USE_I18N = True
USE_L10N = True
USE_TZ = True

▼ 静的ファイル、メディアファイルのパス設定
STATIC_ROOTMEDIA_ROOTを定義し、ファイルパスを設定する。

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

▼ ログの設定(任意)
LOGGING にフォーマットの雛形や出力パスを指定する。
下記は、formatters で設定したログを /var/log/httpd/django.log へ出力する設定となる。
参考程度にどうぞ。

LOGGING = {
    'version': 1,
    'formatters': {
        'all': {
            'format': ' *** '.join([
                "[%(levelname)s]",
                "asctime:%(asctime)s",
                "module:%(module)s",
                "message:%(message)s",
                "process:%(process)d",
                "thread:%(thread)d",
            ])
        },
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': os.path.join('/var/log/httpd', 'django.log'),
            'formatter': 'all',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'all'
        },
    },
    'loggers': {
        'command': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
    },
}

6. PostgreSql周りの設定


postgresql.conflisten_addresses を環境に合わせ変更する。

$ vim /var/lib/pgsql/data/postgresql.conf
 listen_addresses = '*' #'localhost'を'*'に修正。 

※ 各自の公開範囲に合わせること。

pg_hba.conf(認証設定ファイル) にドメイン情報を追加する。
XXX.XXX.XXX.XXX は、サーバーのIPアドレスを指定する。その他項目については、下記の公式文章でご確認ください。
https://www.postgresql.jp/document/9.2/html/auth-pg-hba-conf.html

$ vim /var/lib/pgsql/data/pg_hba.conf
 # 下記を追記
 host    all             all             XXX.XXX.XXX.XXX/32        md5

▼ firewalldの設定。
ポート5432を解放する。

$ firewall-cmd --add-port=5432/tcp --zone=public --permanent # portを解放
$ firewall-cmd --reload # 再読込

▼ スーパーユーザーの作成。
PostgresSQL に対して、スーパーユーザーを作成する。
「[4] Python、Djangoインストール + Django起動確認」で作成したユーザーはあくまでsqliteに対して作成したユーザーなので、改めてPostgresSQL に対してスーパーユーザーを作成している。

$ /var/www/vops/ops/manage.py createsuperuser

※ ここで作成したスーパーユーザーで、Django管理サイトへのログインする。

7. 本番環境の起動確認


ApachePostgresSQL を再起動後、https://example.com にアクセスし、自身で作成したアプリが起動すれば成功。

モデルを定義している場合は、manage.pymakemigrationsmigrate を忘れずに。

また、Django を単独で起動する manage.pyrunserverrunsslserver は、あくまで開発モードなのでApacheと混同して両方起動しないように注意。

※ Apacheもrunserverも単独で動くので双方起動した場合は別プロセスで動きつつ、ApacheはApacheで、DjangoはDjangoでリスエストを解析しますので、設定次第でどちらかが先に動き、おかしな挙動となる。

以上で、本番環境の構築が完了。

前ページ:[5] Apache + Django + PostgreSQLで本番環境を構築 (インストール編)

Copyright UNISIA-SE All Rights Reserved.
s-hama@unisia-se.jp