LoginSignup
13
9

More than 5 years have passed since last update.

Apache To Python For mod_wsgi

Last updated at Posted at 2017-12-19

Apache To Python For mod_wsgi

まずはじめに知っててほしいこと

Apache上でpythonを動作させる場合、cgiとして単体で動かすことは可能だが、
BottleDjangoなどのフレームワーク上で動作させる際には、下記の外部module(mod_wsgi)が必要となる。
今回は、Bottleを前提に設定を進めて行きます。
Djangoは、まだ試していない為、別途設定が異なることがあるかと思います。
公式サイトなどを参考にご対応ください。

※macOSHighSierraでの動作しています。

構築環境

iMacのみのスペックを記載してますが、同様な環境構築にて、
MacBook PRO,Mac miniでも動作している事を確認済みです。

iMac(Retina-5K,27-inch,2017)
バージョン 10.13.2
プロセッサー 4.2 GHz Intel Core i7
メモリ 64 GB 2400 MHz DDR4
グラフィック Radeon Pro 580 8 GB

mod_wsgiの存在 [引用元: wikipedia]

wsgi(Web Server Gateway Interface)

Web Server Gateway Interfaceとは...

Web Server Gateway Interface (WSGI; ウィズギー) は、
プログラミング言語Pythonにおいて、WebサーバとWebアプリケーション(もしくはWebアプリケーションフレームワーク)を接続するための、
標準化されたインタフェース定義である。また、WSGIから着想を得て、他の言語でも同様のインタフェースが作られた。

開発環境の構築

今回の開発環境構築は、macOS 用パッケージマネージャーのHomebrewを利用して、作業を進めていきます。
こちらHomebrewの環境が整っていない場合は、公式サイトを熟読の上、作業を進めてください。

Apache2 Install


# apache2
brew install apache2

python3 Install


# python3
brew install python3
python3 -m pip install mod_wsgi

cd /usr/local
find Cellar
ls -l bin

WSGI Install


mod_wsgiのインストールはまず[Source code]を入手します。
(現時点での最新は、mod_wsgi 4.5.22でした)
入手したソースコードを下記の手順で行い、[.so]ファイルを作成します。

なお、既にapacheやpythonの環境ができている場合は、
xcode-select --installを実行して、Xcode command line toolsが動作可能である状態にしておきましょう。

※注意: 下記のcommand実行は、自分の環境に合わせて、ご対応ください。
今回上記の対応で進めていた場合、環境によっては一部異なっている場合があります。

ターミナル
# configure Setting.
./configure --with-python=/usr/local/bin/python --with-apxs=/usr/local/bin/apxs

# もし上記のパスがわからない場合は、以下を試してください。

make
sudo make install
chmod 755 /usr/local/lib/httpd/modules/mod_wsgi.so

Apacheの設定

httpd.confの設定

httpd.conf
# 必要最低限のみ記載あとは環境に合わせてください。
Listen 80
ServerName exmaple.com:80
Listen 127.0.0.1:80 http

# (You will also need to add "ExecCGI" to the "Options" directive.)
<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options +ExecCGI 
    Require all granted
    AddHandler cgi-script .py .cgi
</Directory>

# Virtual hosts
Include /usr/local/etc/apache/extra/httpd-vhosts.conf

httpd-vhosts.confの設定

httpd-vhosts.conf
LoadModule wsgi_module /usr/local/lib/httpd/modules/mod_wsgi.so

<VirtualHost *:80>
  #SSLEngine Off
  DocumentRoot /usr/local/var/www/htdocs
  ServerAdmin info@exmaple.com

  ServerName exmaple.com
  ScriptAlias /cgi-bin/ /usr/local/var/www/cgi-bin/

  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  ErrorLog /usr/local/var/log/httpd/http-httpd-error.log
  CustomLog /usr/local/var/log/httpd/http-httpd-access.log combined

  WSGIDaemonProcess cgi-bin user=_www group=_www processes=1 threads=5 python-path=/usr/local/bin/python
  WSGIScriptAlias / /usr/local/var/www/cgi-bin/app.wsgi

  <Directory "/usr/local/var/www/cgi-bin/htdocs">
    Options Includes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>

  <Directory "/usr/local/var/www/cgi-bin/">
    AllowOverride None
    Options ExecCGI
    WSGIProcessGroup cgi-bin
    WSGIApplicationGroup %{GLOBAL}
    Require all granted
  </Directory>

</VirtualHost>

app.wsgiファイルの設定
これは、pythonファイルとしての記述と変わらず、
おまじない感覚でご利用ください。
ちなみに、wsgiをこのファイルを起点に起動確保することで、
importされたindexファイルが読み込まれ、動作する仕組みなっています。
cgiとなるファイルは、index.pyであり、
実際のアプリケーションファイルとなり、Python上での実行ファイルとなります。

app.wsgi
# -*- coding:utf-8 -*-
import sys, os
dirpath = os.path.dirname(os.path.abspath(__file__))
sys.path.append(dirpath)
os.chdir(dirpath)
import bottle
import index
application = bottle.default_app()

他のモジュールは必要に応じて、追加。
また、userとgroupは環境や権限より異なる為、
環境設定をご確認の上、変更が必要。

まとめ

今回学んだ事は...
コレまで、開発環境をPythonだけで、本番環境とは異なった環境だったために、
いざ本番にあげたら正常に動作しないなどが多かったが、
それらを中和しつつ、「データベースとの連携、webserverとしての稼働上の問題、表示速度、外部接続時の挙動...」なども含め、
あらゆる想定もでき、本来のバックエンド側の事を意識しながら、開発できたことが一番の大きい収穫だったと思います。

また以前は、マークアップエンジニアだったので、フロントエンド側の処理経験を生かしつつ、
バックエンド側の負荷軽減なども含め、pythonだけで動くのではなく、
実際の環境でもそのまま動くモノとしてを常に意識しつつ開発ができたと思います。

今回の開発では、下記の内容が設定以外にも含まれた開発となっています。
「gzip圧縮や非同期処理でのファイルのアップロード、ログインのセッション管理、データベースの構成、システム設計、デザイン、テスト、サーバー構築、HTTPS接続、SQL、Cookieなど...」
実務を通し、実際に稼働するシステムを一人で、全て作る事でのメリットは独学の時よりも遥かに大きモノとなった思います。

以上。
最後に...
if 環境構築などにおいて、エラーに遭遇した場合に見とくといいもの。
else 学ぶ行為は、生き抜くために必要な行為だという事。

ERRORが発生した場合

Erro no2

これは、Command Line Toursの参照先、もしくは実行バージョンがOSのバージョンに合っていないために、発生するエラーである。
もしCommand Line Toursのインストール前に、古いバージョンのXcodeを先にインストールしている場合、または、複数バージョンのXcodeがインストールされている環境の場合は、これらのエラーが発生することを確認している。

対策としては、最新のXcodeインストールし直しメインにするか、常に使用しているXcode起動して、Preferences... > Locations > Command Line Toursの順番に進み、Command Line Toursのバージョンを最新、もしくはOSに合わせたバージョンを選択する事で、エラーが発生しなくなる。

error

FileNotFoundError: [Errno 2] No such file or directory: '/Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.12.xctoolchain/usr/local/bin/apr-1-config'

あとがき

一部書き方がカタコトだがこれは、海外の人がこの記事をみた時を考慮し、敢えてであり、google翻訳された時を想定し、翻訳に似せて書いてみたので、文章力は大目にみてください。

13
9
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
13
9