Apache / mod_wsgi / virtualenv で Python / Flask アプリケーションを動かしてみた【EC2 / Amazon Linux 2】

Apach, mod_wsgi で Flask アプリケーションを動かしてみたのでその記録です。Python の実行環境として仮想環境を作成する方針で進めていきます。

作業手順

WIP

作業ログ

# ------------------------------------------------------------
# Apacheのデフォルトページを表示する
# ------------------------------------------------------------

# rootユーザーで作業
sudo su -

# タイムゾーンの設定
date
timedatectl status
timedatectl set-timezone Asia/Tokyo

# Apacheのインストール
yum list installed
yum list installed | grep httpd
yum -y install httpd httpd-devel
httpd -v
yum info httpd

# Apacheの起動・停止・ステータス
service httpd start
service httpd status
service httpd stop
service httpd restart

# ログの確認
tail -f -n 10 /etc/httpd/logs/access_log
tail -f -n 10 /etc/httpd/logs/error_log

# ここで http://<EC2のパブリックIP>:80/ にアクセスして確認する

# ------------------------------------------------------------
# 最小構成のWSGIアプリケーションでHello World
# ------------------------------------------------------------

# Pythonの依存モジュールのインストール
yum -y install \
 git \
 gcc \
 make \
 zlib-devel \
 bzip2 \
 bzip2-devel \
 readline \
 readline-devel \
 sqlite \
 sqlite-devel \
 openssl \
 tk-devel \
 libffi-devel \
 xz-devel \
 openssl-devel

# pyenvのインストール
git clone https://github.com/pyenv/pyenv.git /usr/local/pyenv
(cd /usr/local/pyenv/ && src/configure && make -C src)
echo 'export PYENV_ROOT="/usr/local/pyenv"' >> /etc/profile.d/pyenv.sh
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> /etc/profile.d/pyenv.sh
echo 'eval "$(pyenv init - --no-rehash)"' >> /etc/profile.d/pyenv.sh
exec $SHELL -l
which pyenv

# Pythonのインストール
pyenv install 3.9.16
pyenv global 3.9.16
python --version
which python

# poetryのインストール
curl -sSL https://install.python-poetry.org | POETRY_HOME=/usr/local/poetry python3 -
echo 'export POETRY_HOME="/usr/local/poetry"' >> /etc/profile.d/poetry.sh
echo 'export PATH="$POETRY_HOME/bin:$PATH"' >> /etc/profile.d/poetry.sh
exec $SHELL -l
which poetry

# virtualenvのインストール
pip install virtualenv

# アプリケーションのデプロイ先ディレクトリの作成
mkdir app
chmod 755 /app
chown root:root /app

# プロジェクトの作成
mkdir /app/myapp
touch /app/myapp/wsgi.py
touch /app/myapp/vhost.conf

# 仮想環境の作成とmod_wsgiのインストール
cd /app/myapp/
virtualenv venv
. venv/bin/activate
which python
python --version
python -c 'import sys; print(sys.prefix)'
pip install mod_wsgi

# wsgiファイルの編集
vi /app/myapp/wsgi.py

# apache設定ファイルの編集
mod_wsgi-express module-config
vi /app/myapp/vhost.conf

# 権限の編集
chmod -R 755 /app/myapp
find /app/myapp -type f -exec chmod 644 {} +

# apacheの設定変更・再起動
cp /app/myapp/vhost.conf /etc/httpd/conf.d/
httpd -t
service httpd restart

# ログの確認
tail -f -n 10 /etc/httpd/logs/access_log
tail -f -n 10 /etc/httpd/logs/error_log

# ここで http://<EC2のパブリックIP>:80/ にアクセスして確認する

# ここで http://<EC2のパブリックIP>:8000/ にアクセスして確認する

# ------------------------------------------------------------
# FlaskアプリケーションでHello World
# ------------------------------------------------------------

# Flaskアプリケーションのファクトリを定義する
vi /app/myapp/myapp/__init__.py

# wsgiファイルを編集してFlaskアプリケーションを読み込む
vi /app/myapp/wsgi.py

# apacheの設定変更・再起動
service httpd restart

# ログの確認
tail -f -n 10 /etc/httpd/logs/access_log
tail -f -n 10 /etc/httpd/logs/error_log

# ここで http://<EC2のパブリックIP>:8000/ にアクセスして確認する

wsgi.py

import os
import sys

project_root = os.path.dirname(__file__)
python_home = os.path.join(project_root, "venv")
activate_this = os.path.join(python_home, "bin", "activate_this.py")

print('---------------------------------------------')
print('project_root', project_root)
print('python_home', python_home)
print('activate_this', activate_this)
print('---------------------------------------------')

print('---------------------------------------------')
print('sys.prefix', sys.prefix)
print('sys.path', sys.path)
print('---------------------------------------------')

with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

sys.path.insert(0, project_root)

print('---------------------------------------------')
print('sys.prefix', sys.prefix)
print('sys.path', sys.path)
print('---------------------------------------------')


def application(environ, start_response):
    status = "200 OK"
    output = b"Hello World!"

    response_headers = [("Content-type", "text/plain"), ("Content-Length", str(len(output)))]
    start_response(status, response_headers)

    return [output]

# from myapp import create_app

# print('---------------------------------------------')
# print('create_app', create_app)
# print('---------------------------------------------')

# application = create_app()

vhost.conf

Listen 8000

<VirtualHost *:8000>
  LoadModule wsgi_module "/app/myapp/venv/lib/python3.9/site-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"

  ServerName myapp.com

  LogLevel info
  
  WSGIDaemonProcess myapp user=apache group=apache
  # WSGIDaemonProcess myapp user=apache group=apache python-home=/app/myapp/venv

  WSGIProcessGroup myapp
  WSGIApplicationGroup %{GLOBAL}

  WSGIScriptAlias / /app/myapp/wsgi.py
  
  WSGIScriptReloading On
  
  <Directory /app/myapp>
    Require all granted
  </Directory>
</VirtualHost>

myapp/__init__.py

from flask import Flask


def create_app() -> Flask:
    app = Flask(__name__)

    @app.route("/hello")
    def hello() -> str:
        print('=========================================')
        print('hello')
        print('=========================================')
        return "Hello, World!"

    return app

vhost.sample.conf

<IfModule !version_module>
  LoadModule version_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_version.so'
</IfModule>

ServerName localhost
ServerRoot '/tmp/mod_wsgi-localhost:8000:1000'
PidFile '/tmp/mod_wsgi-localhost:8000:1000/httpd.pid'

<IfVersion >= 2.4>
  Defaul RuntimeDir '/tmp/mod_wsgi-localhost:8000:1000'
</IfVersion>

ServerTokens ProductOnly
ServerSignature Off

<IfDefine !MOD_WSGI_MPM_ENABLE_WINNT_MODULE>
  User ${MOD_WSGI_USER}
  Group ${MOD_WSGI_GROUP}
</IfDefine>

<IfDefine MOD_WSGI_WITH_LISTENER_HOST>
  Listen localhost:8000
</IfDefine>

<IfDefine !MOD_WSGI_WITH_LISTENER_HOST>
  Listen 8000
</IfDefine>

<IfVersion < 2.4>
  LockFile '/tmp/mod_wsgi-localhost:8000:1000/accept.lock'
</IfVersion>

<IfVersion >= 2.4>
  <IfDefine MOD_WSGI_WITH_PHP5>
    <IfModule !mpm_event_module>
      <IfModule !mpm_worker_module>
        <IfModule !mpm_prefork_module>
          <IfDefine MOD_WSGI_MPM_EXISTS_PREFORK_MODULE>
            LoadModule mpm_prefork_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_mpm_prefork.so'
          </IfDefine>
        </IfModule>
      </IfModule>
    </IfModule>
  </IfDefine>
</IfVersion>

<IfVersion >= 2.4>
  <IfModule !mpm_event_module>
    <IfModule !mpm_worker_module>
      <IfModule !mpm_prefork_module>

        <IfDefine MOD_WSGI_MPM_ENABLE_EVENT_MODULE>
          LoadModule mpm_event_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_mpm_event.so'
        </IfDefine>

        <IfDefine MOD_WSGI_MPM_ENABLE_WORKER_MODULE>
          LoadModule mpm_worker_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_mpm_worker.so'
        </IfDefine>

        <IfDefine MOD_WSGI_MPM_ENABLE_PREFORK_MODULE>
          LoadModule mpm_prefork_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_mpm_prefork.so'
        </IfDefine>

      </IfModule>
    </IfModule>
  </IfModule>
</IfVersion>

<IfDefine MOD_WSGI_WITH_HTTP2>
  LoadModule http2_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_http2.so'
</IfDefine>

<IfVersion >= 2.4>
  <IfModule !access_compat_module>
    LoadModule access_compat_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_access_compat.so'
  </IfModule>

  <IfDefine !MOD_WSGI_MPM_ENABLE_WINNT_MODULE>
    <IfModule !unixd_module>
      LoadModule unixd_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_unixd.so'
    </IfModule>
  </IfDefine>

  <IfModule !authn_core_module>
    LoadModule authn_core_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_authn_core.so'
  </IfModule>

  <IfModule !authz_core_module>
    LoadModule authz_core_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_authz_core.so'
  </IfModule>
</IfVersion>

<IfModule !authz_host_module>
  LoadModule authz_host_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_authz_host.so'
</IfModule>

<IfModule !mime_module>
  LoadModule mime_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_mime.so'
</IfModule>

<IfModule !rewrite_module>
  LoadModule rewrite_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_rewrite.so'
</IfModule>

<IfModule !alias_module>
  LoadModule alias_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_alias.so'
</IfModule>

<IfModule !dir_module>
  LoadModule dir_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_dir.so'
</IfModule>

<IfModule !env_module>
  LoadModule env_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_env.so'
</IfModule>

<IfModule !headers_module>
  LoadModule headers_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_headers.so'
</IfModule>

<IfModule !filter_module>
  LoadModule filter_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_filter.so'
</IfModule>

<IfDefine MOD_WSGI_DIRECTORY_LISTING>
  <IfModule !autoindex_module>
    LoadModule autoindex_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_autoindex.so'
  </IfModule>
</IfDefine>

<IfVersion >= 2.2.15>
  <IfModule !reqtimeout_module>
    LoadModule reqtimeout_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_reqtimeout.so'
  </IfModule>
</IfVersion>

<IfDefine MOD_WSGI_COMPRESS_RESPONSES>
  <IfModule !deflate_module>
    LoadModule deflate_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_deflate.so'
  </IfModule>
</IfDefine>

<IfDefine MOD_WSGI_AUTH_USER>
  <IfModule !auth_basic_module>
    LoadModule auth_basic_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_auth_basic.so'
  </IfModule>

  <IfModule !auth_digest_module>
    LoadModule auth_digest_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_auth_digest.so'
  </IfModule>

  <IfModule !authz_user_module>
    LoadModule authz_user_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_authz_user.so'
  </IfModule>
</IfDefine>

<IfDefine MOD_WSGI_WITH_PROXY>
  <IfModule !proxy_module>
    LoadModule proxy_module ${MOD_WSGI_MODULES_DIRECTORY}/mod_proxy.so
  </IfModule>

  <IfModule !proxy_http_module>
    LoadModule proxy_http_module ${MOD_WSGI_MODULES_DIRECTORY}/mod_proxy_http.so
  </IfModule>
</IfDefine>

<IfModule mpm_prefork_module>
  <IfDefine MOD_WSGI_WITH_PHP5>
    <IfModule !php5_module>
      Loadmodule php5_module '${MOD_WSGI_MODULES_DIRECTORY}/libphp5.so'
    </IfModule>

    AddHandler application/x-httpd-php .php
  </IfDefine>
</IfModule>

<IfDefine MOD_WSGI_LOAD_PYTHON_DYLIB>
  LoadFile ''
</IfDefine>

LoadModule wsgi_module '/app/myapp/venv/lib/python3.9/site-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so'

<IfDefine MOD_WSGI_SERVER_METRICS>
  <IfModule !status_module>
    LoadModule status_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_status.so'
  </IfModule>
</IfDefine>

<IfDefine MOD_WSGI_CGID_SCRIPT>
  <IfModule !cgid_module>
    LoadModule cgid_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_cgid.so'
  </IfModule>
</IfDefine>

<IfDefine MOD_WSGI_CGI_SCRIPT>
  <IfModule !cgi_module>
    LoadModule cgi_module '${MOD_WSGI_MODULES_DIRECTORY}/mod_cgi.so'
  </IfModule>
</IfDefine>

<IfVersion < 2.4>
  DefaultType text/plain
</IfVersion>

TypesConfig '/etc/mime.types'

HostnameLookups Off
MaxMemFree 64
Timeout 60
ListenBacklog 500

<IfDefine MOD_WSGI_WITH_HTTP2>
  Protocols h2 h2c http/1.1
</IfDefine>

<IfVersion >= 2.2.15>
  RequestReadTimeout header=15-30,MinRate=500 body=15,MinRate=500
</IfVersion>

LimitRequestBody 10485760

<Directory />
  AllowOverride None

  <IfVersion < 2.4>
    Order deny,allow
    Deny from all
  </IfVersion>

  <IfVersion >= 2.4>
    Require all denied
  </IfVersion>
</Directory>

WSGIPythonHome '/app/myapp/venv'

WSGIVerboseDebugging 'Off'

<IfDefine !MOD_WSGI_MPM_ENABLE_WINNT_MODULE>
  <IfDefine MOD_WSGI_WITH_SOCKET_PREFIX>
    WSGISocketPrefix None/wsgi
  </IfDefine>

  <IfDefine !MOD_WSGI_WITH_SOCKET_PREFIX>
    WSGISocketPrefix /tmp/mod_wsgi-localhost:8000:1000/wsgi
  </IfDefine>

  WSGISocketRotation Off
</IfDefine>

<IfDefine EMBEDDED_MODE>
  MaxConnectionsPerChild 0
</IfDefine>

<IfDefine ORPHAN_INTERPRETER>
  WSGIDestroyInterpreter Off
</IfDefine>

<IfDefine !ORPHAN_INTERPRETER>
  WSGIDestroyInterpreter On
</IfDefine>

<IfDefine !ONE_PROCESS>
  <IfDefine !EMBEDDED_MODE>
    WSGIRestrictEmbedded On

    <IfDefine MOD_WSGI_MULTIPROCESS>
      WSGIDaemonProcess localhost:8000 \
        display-name='(wsgi:localhost:8000:1000)' \
        home='/app/myapp' \
        processes=1 \
        threads=5 \
        maximum-requests=0 \
        python-path='' \
        python-eggs='/tmp/mod_wsgi-localhost:8000:1000/python-eggs' \
        lang='en_US.UTF-8' \
        locale='en_US.UTF-8' \
        listen-backlog=100 \
        queue-timeout=45 \
        socket-timeout=60 \
        connect-timeout=15 \
        request-timeout=60 \
        inactivity-timeout=0 \
        startup-timeout=15 \
        deadlock-timeout=60 \
        graceful-timeout=15 \
        eviction-timeout=0 \
        restart-interval=0 \
        cpu-time-limit=0 \
        shutdown-timeout=5 \
        send-buffer-size=0 \
        receive-buffer-size=0 \
        header-buffer-size=0 \
        response-buffer-size=0 \
        response-socket-timeout=0 \
        server-metrics=Off
    </IfDefine>

    <IfDefine !MOD_WSGI_MULTIPROCESS>
      WSGIDaemonProcess localhost:8000 \
        display-name='(wsgi:localhost:8000:1000)' \
        home='/app/myapp' \
        threads=5 \
        maximum-requests=0 \
        python-path='' \
        python-eggs='/tmp/mod_wsgi-localhost:8000:1000/python-eggs' \
        lang='en_US.UTF-8' \
        locale='en_US.UTF-8' \
        listen-backlog=100 \
        queue-timeout=45 \
        socket-timeout=60 \
        connect-timeout=15 \
        request-timeout=60 \
        inactivity-timeout=0 \
        startup-timeout=15 \
        deadlock-timeout=60 \
        graceful-timeout=15 \
        eviction-timeout=0 \
        restart-interval=0 \
        cpu-time-limit=0 \
        shutdown-timeout=5 \
        send-buffer-size=0 \
        receive-buffer-size=0 \
        response-buffer-size=0 \
        response-socket-timeout=0 \
        server-metrics=Off
    </IfDefine>
  </IfDefine>
</IfDefine>

WSGICallableObject 'application'
WSGIPassAuthorization On
WSGIMapHEADToGET Auto

<IfDefine MOD_WSGI_DISABLE_RELOADING>
  WSGIScriptReloading Off
</IfDefine>

<IfDefine EMBEDDED_MODE>
  <IfDefine MOD_WSGI_WITH_PYTHON_PATH>
   WSGIPythonPath ''
  </IfDefine>
</IfDefine>

<IfDefine ONE_PROCESS>
  WSGIRestrictStdin Off

  <IfDefine MOD_WSGI_WITH_PYTHON_PATH>
    WSGIPythonPath ''
  </IfDefine>
</IfDefine>

<IfDefine MOD_WSGI_SERVER_METRICS>
  ExtendedStatus On
</IfDefine>

WSGIServerMetrics Off

<IfDefine MOD_WSGI_SERVER_STATUS>
  <Location /server-status>
    SetHandler server-status

    <IfVersion < 2.4>
      Order deny,allow
      Deny from all
      Allow from localhost
    </IfVersion>

    <IfVersion >= 2.4>
      Require all denied
      Require host localhost
    </IfVersion>
  </Location>
</IfDefine>

<IfDefine MOD_WSGI_KEEP_ALIVE>
  KeepAlive On
  KeepAliveTimeout 2
</IfDefine>

<IfDefine !MOD_WSGI_KEEP_ALIVE>
  KeepAlive Off
</IfDefine>

<IfDefine MOD_WSGI_ENABLE_SENDFILE>
  EnableSendfile On
  WSGIEnableSendfile On
</IfDefine>

<IfDefine MOD_WSGI_COMPRESS_RESPONSES>
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE application/json
</IfDefine>

<IfDefine MOD_WSGI_ROTATE_LOGS>
  ErrorLog "|/usr/sbin/rotatelogs \
    /tmp/mod_wsgi-localhost:8000:1000/error_log.%Y-%m-%d-%H_%M_%S 5M"
</IfDefine>

<IfDefine !MOD_WSGI_ROTATE_LOGS>
  ErrorLog "/tmp/mod_wsgi-localhost:8000:1000/error_log"
</IfDefine>

LogLevel warn

<IfDefine MOD_WSGI_ERROR_LOG_FORMAT>
  ErrorLogFormat "None"
</IfDefine>

<IfDefine MOD_WSGI_ACCESS_LOG>
  <IfModule !log_config_module>
    LoadModule log_config_module ${MOD_WSGI_MODULES_DIRECTORY}/mod_log_config.so
  </IfModule>

  LogFormat "%h %l %u %t \"%r\" %>s %b" common
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
  LogFormat "undefined" custom

  <IfDefine MOD_WSGI_ROTATE_LOGS>
    CustomLog "|/usr/sbin/rotatelogs \
      /tmp/mod_wsgi-localhost:8000:1000/access_log.%Y-%m-%d-%H_%M_%S 5M" common
  </IfDefine>

  <IfDefine !MOD_WSGI_ROTATE_LOGS>
    CustomLog "/tmp/mod_wsgi-localhost:8000:1000/access_log" common
  </IfDefine>
</IfDefine>

<IfDefine MOD_WSGI_CHUNKED_REQUEST>
  WSGIChunkedRequest On
</IfDefine>

<IfDefine MOD_WSGI_WITH_PROXY_HEADERS>
  WSGITrustedProxyHeaders
</IfDefine>

<IfDefine MOD_WSGI_WITH_TRUSTED_PROXIES>
  WSGITrustedProxies
</IfDefine>

<IfDefine MOD_WSGI_WITH_HTTPS>
  <IfModule !ssl_module>
    LoadModule ssl_module ${MOD_WSGI_MODULES_DIRECTORY}/mod_ssl.so
  </IfModule>
</IfDefine>

<IfModule mpm_prefork_module>
  <IfDefine !ONE_PROCESS>
    ServerLimit 20
    StartServers 1
    MaxClients 20
    MinSpareServers 1
    MaxSpareServers 2
  </IfDefine>

  <IfDefine ONE_PROCESS>
    ServerLimit 1
    StartServers 1
    MaxClients 1
    MinSpareServers 1
    MaxSpareServers 1
  </IfDefine>

  MaxRequestsPerChild 0
</IfModule>

<IfModule mpm_worker_module>
  <IfDefine !ONE_PROCESS>
    ServerLimit 2
    ThreadLimit 10
    StartServers 1
    MaxClients 20
    MinSpareThreads 10
    MaxSpareThreads 10
    ThreadsPerChild 10
  </IfDefine>

  <IfDefine ONE_PROCESS>
    ServerLimit 1
    ThreadLimit 1
    StartServers 1
    MaxClients 1
    MinSpareThreads 1
    MaxSpareThreads 1
    ThreadsPerChild 1
  </IfDefine>

  MaxRequestsPerChild 0
  ThreadStackSize 262144
</IfModule>

<IfModule mpm_event_module>
  <IfDefine !ONE_PROCESS>
    ServerLimit 2
    ThreadLimit 10
    StartServers 1
    MaxClients 20
    MinSpareThreads 10
    MaxSpareThreads 10
    ThreadsPerChild 10
  </IfDefine>

  <IfDefine ONE_PROCESS>
    ServerLimit 1
    ThreadLimit 1
    StartServers 1
    MaxClients 1
    MinSpareThreads 1
    MaxSpareThreads 1
    ThreadsPerChild 1
  </IfDefine>

  MaxRequestsPerChild 0
  ThreadStackSize 262144
</IfModule>

<IfDefine !MOD_WSGI_VIRTUAL_HOST>
  <IfVersion < 2.4>
    NameVirtualHost *:8000
  </IfVersion>

  <VirtualHost _default_:8000>
  </VirtualHost>
</IfDefine>

<IfDefine MOD_WSGI_VIRTUAL_HOST>
  <IfVersion < 2.4>
    NameVirtualHost *:8000
  </IfVersion>

  <VirtualHost _default_:8000>
    <Location />
      <IfVersion < 2.4>
        Order deny,allow
        Deny from all
      </IfVersion>

      <IfVersion >= 2.4>
        Require all denied
      </IfVersion>

      <IfDefine MOD_WSGI_ALLOW_LOCALHOST>
       Allow from localhost
      </IfDefine>
    </Location>
  </VirtualHost>

  <IfDefine !MOD_WSGI_HTTPS_ONLY>
    <VirtualHost *:8000>
      ServerName None

      <IfDefine MOD_WSGI_SERVER_ALIAS>
        ServerAlias None
      </IfDefine>
    </VirtualHost>

    <IfDefine MOD_WSGI_REDIRECT_WWW>
      <VirtualHost *:8000>
        ServerName unspecified
        Redirect permanent / http://None:8000/
      </VirtualHost>
    </IfDefine>
  </IfDefine>

  <IfDefine MOD_WSGI_HTTPS_ONLY>
    <VirtualHost *:8000>
      ServerName None

      <IfDefine MOD_WSGI_SERVER_ALIAS>
        ServerAlias None
      </IfDefine>

      RewriteEngine On
      RewriteCond %{HTTPS} off
      RewriteRule (.*) https://None:None%{REQUEST_URI}
    </VirtualHost>

    <IfDefine MOD_WSGI_REDIRECT_WWW>
      <VirtualHost *:8000>
        ServerName unspecified
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*) https://None:None%{REQUEST_URI}
      </VirtualHost>
    </IfDefine>
  </IfDefine>
</IfDefine>

<IfDefine MOD_WSGI_VIRTUAL_HOST>

  <IfDefine MOD_WSGI_WITH_HTTPS>
    <IfDefine MOD_WSGI_WITH_LISTENER_HOST>
      Listen localhost:None
    </IfDefine>
    <IfDefine !MOD_WSGI_WITH_LISTENER_HOST>
      Listen None
    </IfDefine>
    <IfVersion < 2.4>
      NameVirtualHost *:None
    </IfVersion>
    <VirtualHost _default_:None>
      <Location />
        <IfVersion < 2.4>
          Order deny,allow
          Deny from all
        </IfVersion>
        <IfVersion >= 2.4>
          Require all denied
        </IfVersion>
        <IfDefine MOD_WSGI_ALLOW_LOCALHOST>
          Allow from localhost
        </IfDefine>
      </Location>
      SSLEngine On
      SSLCertificateFile None
      SSLCertificateKeyFile None
      <IfDefine MOD_WSGI_VERIFY_CLIENT>
        SSLCACertificateFile None
        SSLVerifyClient none
      </IfDefine>
      <IfDefine MOD_WSGI_CERTIFICATE_CHAIN>
        SSLCertificateChainFile None
      </IfDefine>
    </VirtualHost>
    <VirtualHost *:None>
      ServerName None
      <IfDefine MOD_WSGI_SERVER_ALIAS>
        ServerAlias None
      </IfDefine>
      SSLEngine On
      SSLCertificateFile None
      SSLCertificateKeyFile None
      <IfDefine MOD_WSGI_VERIFY_CLIENT>
        SSLCACertificateFile None
        SSLVerifyClient none
      </IfDefine>
      <IfDefine MOD_WSGI_CERTIFICATE_CHAIN>
      S SLCertificateChainFile None
      </IfDefine>
      <IfDefine MOD_WSGI_HTTPS_ONLY>
        <IfDefine MOD_WSGI_HSTS_POLICY>
          Header set Strict-Transport-Security None
        </IfDefine>
      </IfDefine>
      <IfDefine MOD_WSGI_SSL_ENVIRONMENT>
        SSLOptions +StdEnvVars
      </IfDefine>
    </VirtualHost>
  <IfDefine MOD_WSGI_REDIRECT_WWW>
    <VirtualHost *:None>
      ServerName unspecified
      Redirect permanent / https://None:None/
      SSLEngine On
      SSLCertificateFile None
      SSLCertificateKeyFile None
      <IfDefine MOD_WSGI_VERIFY_CLIENT>
        SSLCACertificateFile None
        SSLVerifyClient none
      </IfDefine>
      <IfDefine MOD_WSGI_CERTIFICATE_CHAIN>
        SSLCertificateChainFile None
      </IfDefine>
    </VirtualHost>
    </IfDefine>
  </IfDefine>

</IfDefine>

DocumentRoot '/tmp/mod_wsgi-localhost:8000:1000/htdocs'

AccessFileName .htaccess

<Directory '/tmp/mod_wsgi-localhost:8000:1000'>
  AllowOverride None
  <Files handler.wsgi>
    <IfVersion < 2.4>
      Order allow,deny
      Allow from all
    </IfVersion>
    <IfVersion >= 2.4>
      Require all granted
    </IfVersion>
  </Files>
</Directory>

<Directory '/tmp/mod_wsgi-localhost:8000:1000/htdocs'>
  AllowOverride None
  <IfDefine MOD_WSGI_DIRECTORY_INDEX>
      DirectoryIndex None
  </IfDefine>
  <IfDefine MOD_WSGI_DIRECTORY_LISTING>
      Options +Indexes
  </IfDefine>
  <IfDefine MOD_WSGI_CGI_SCRIPT>
      Options +ExecCGI
  </IfDefine>
  <IfDefine MOD_WSGI_CGID_SCRIPT>
      Options +ExecCGI
  </IfDefine>
      RewriteEngine On
      Include /tmp/mod_wsgi-localhost:8000:1000/rewrite.conf
  <IfVersion < 2.4>
      Order allow,deny
      Allow from all
  </IfVersion>
  <IfVersion >= 2.4>
      Require all granted
  </IfVersion>
</Directory>

<Directory '/tmp/mod_wsgi-localhost:8000:1000/htdocs/'>
  <IfDefine !MOD_WSGI_STATIC_ONLY>
    RewriteCond %{REQUEST_FILENAME} !-f
    <IfDefine MOD_WSGI_DIRECTORY_INDEX>
      RewriteCond %{REQUEST_FILENAME} !-d
    </IfDefine>
    <IfDefine MOD_WSGI_SERVER_STATUS>
      RewriteCond %{REQUEST_URI} !/server-status
    </IfDefine>
    RewriteRule .* - [H=wsgi-handler]
  </IfDefine>
</Directory>

<IfDefine MOD_WSGI_ERROR_OVERRIDE>
  WSGIErrorOverride On
</IfDefine>

<IfDefine MOD_WSGI_HOST_ACCESS>
  <Location />
    WSGIAccessScript 'None'
  </Location>
</IfDefine>

<IfDefine MOD_WSGI_AUTH_USER>
  <Location />
    AuthType Basic
    AuthName 'localhost:8000'
    AuthBasicProvider wsgi
    WSGIAuthUserScript 'None'
    <IfDefine MOD_WSGI_AUTH_GROUP>
      WSGIAuthGroupScript 'None'
    </IfDefine>
    <IfVersion < 2.4>
      Require valid-user
      <IfDefine MOD_WSGI_AUTH_GROUP>
          Require wsgi-group 'wsgi'
      </IfDefine>
    </IfVersion>
    <IfVersion >= 2.4>
      <RequireAll>
        Require valid-user
        <IfDefine MOD_WSGI_AUTH_GROUP>
          Require wsgi-group 'wsgi'
        </IfDefine>
      </RequireAll>
    </IfVersion>
  </Location>
</IfDefine>

<IfDefine !ONE_PROCESS>
  <IfDefine !EMBEDDED_MODE>
  WSGIHandlerScript wsgi-handler '/tmp/mod_wsgi-localhost:8000:1000/handler.wsgi' \
    process-group='localhost:8000' application-group=%{GLOBAL}
  WSGIImportScript '/tmp/mod_wsgi-localhost:8000:1000/handler.wsgi' \
    process-group='localhost:8000' application-group=%{GLOBAL}
  </IfDefine>
</IfDefine>

<IfDefine EMBEDDED_MODE>
  WSGIHandlerScript wsgi-handler '/tmp/mod_wsgi-localhost:8000:1000/handler.wsgi' \
    process-group='%{GLOBAL}' application-group=%{GLOBAL}
  WSGIImportScript '/tmp/mod_wsgi-localhost:8000:1000/handler.wsgi' \
    process-group='%{GLOBAL}' application-group=%{GLOBAL}
</IfDefine>

<IfDefine ONE_PROCESS>
  <IfDefine !MOD_WSGI_MPM_ENABLE_WINNT_MODULE>
    WSGIHandlerScript wsgi-handler '/tmp/mod_wsgi-localhost:8000:1000/handler.wsgi' \
      process-group='%{GLOBAL}' application-group=%{GLOBAL}
    WSGIImportScript '/tmp/mod_wsgi-localhost:8000:1000/handler.wsgi' \
      process-group='%{GLOBAL}' application-group=%{GLOBAL}
  </IfDefine>
  <IfDefine MOD_WSGI_MPM_ENABLE_WINNT_MODULE>
    WSGIHandlerScript wsgi-handler '/tmp/mod_wsgi-localhost:8000:1000/handler.wsgi' \
      application-group=%{GLOBAL}
    WSGIImportScript '/tmp/mod_wsgi-localhost:8000:1000/handler.wsgi' \
      application-group=%{GLOBAL}
  </IfDefine>
</IfDefine>


<IfDefine MOD_WSGI_VERIFY_CLIENT>
  <Location '/'>
    SSLVerifyClient require
    SSLVerifyDepth 1
  </Location>
</IfDefine>