9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Django + Apache with mod_wsgi on Windows Server 2016

Last updated at Posted at 2020-05-05

#背景
毎回同じところで躓くので自分用にメモ。

#環境

  • Windows Server 2016
  • Apache 2.4 + mod_wsgi
  • Django 3.0

#前提

#ダウンロード~インストール
Python Windows で mod_wsgi を Apache に組み込む方法 に従う。

#mod_wsgiをApacheに組み込む
上記記事の通りではうまくいかなかったので追記。

##1. モジュールのロード+α
インストールまでできたら、PythonのScriptsディレクトリ(自環境ではC:\Program Files\Python38\Scripts)に、mod_wsgi-express.exeが作成されている。
mod_wsgi-express module-configでApache httpd.confの設定が自動生成されるので、これをhttpd.confにコピペする。

> mod_wsgi-express module-config

LoadFile "c:/program files/python38/python38.dll"
LoadModule wsgi_module "c:/program files/python38/lib/site-packages/mod_wsgi/server/mod_wsgi.cp38-win_amd64.pyd"
WSGIPythonHome "c:/program files/python38"

httpd.conf
…
LoadFile "c:/program files/python38/python38.dll"
LoadModule wsgi_module "c:/program files/python38/lib/site-packages/mod_wsgi/server/mod_wsgi.cp38-win_amd64.pyd"
WSGIPythonHome "c:/program files/python38"
…

##2. WSGIScriptAliasの設定
参考:Django 1.4 documentation - Apache と mod_wsgi 環境で Django を使う方法

WSGIScriptAliasの行の最初の引数は、アプリケーションを公開する場所(/はルートURLを表しています)、二つ目の引数はシステム上の「WSGIファイル(後述)」の場所です。 WSGIは通常、プロジェクトパッケージ(この例ではmysite)の中に置きます。これで、ApacheはルートURL以下のすべてのリクエストを、指定のWSGIファイルを使って処理します。

すなわち、第1引数以下に来たリクエストを、第2引数で指定したWSGIファイルで処理する、という意味。第2引数には、接続したいDjangoプロジェクトのアプリの中に入っているwsgi.pyを指定する。

httpd.conf
WSGIScriptAlias / d:/apps/appname/appname/wsgi.py

参考:mod_wsgi - WSGIScriptAlias

##3. WSGIPythonPathの設定
参考:Django 1.4 documentation - Apache と mod_wsgi 環境で Django を使う方法

WSGIPythonPathの行は、プロジェクトのパッケージが Python パスでのインポー トで使えることを保証します。

ようは、プロジェクトで使用するsite-packagesの場所を教えてあげるという意味。なお、Pythonのバージョンを変えてvenvをさらに作成した場合は、このパスも変えてあげる必要がある(関連記事:ValueError at set_wakeup_fd only works in main thread の対処法)が、普通はappname/venv/Lib/site-packagesでよい。

httpd.conf
WSGIPythonPath d:/apps/appname/venv/Lib/site-packages

##4. Directoryの設定

<Directory>の部分はApacheがwsgi.pyファイルにアクセスできることを保証します。

下記では、d:/apps/appname/appnameへのアクセスを許可(Require all granted)するという意味。

httpd.conf
<Directory d:/apps/appname/appname>
   <Files wsgi.py>
       Require all granted
   </Files>
</Directory>

注意Django 1.4 Documentationのような古い資料では下記のような記述になっているが、Apache2.4以降ではこれは動かない(参考:Apache2.4で、アクセス制限の記述方法が変更されていた)。

httpd.conf
# Apache2.2以前の記述方法
<Directory d:/apps/appname/appname>
   <Files wsgi.py>
      Order allow,deny
      Allow from all
   </Files>
</Directory>

#Django側のwsgi.pyの設定
いざ接続してみると、ここでまさかのInternal Server Error。
ss19.png
下記で解決できる。

wsgi.py
"""
WSGI config for appname project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/
"""

import os
import sys  # ←追加

from django.core.wsgi import get_wsgi_application

sys.path.append('D:/apps/appname') # ←追加

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'appname.settings')

application = get_wsgi_application()

関連記事:mod_wsgi 500 Internal Server Errorの対処法

参考:Apache2 mod_wsgi, 500 Internal Server Error

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?