Apache2.4(Ubuntu/Debian)で複合言語(メイン:php サブ:python)で組み合わせる典型的なやり方。
2020年3月21日Python Bottle Framework, テクニカル, トピックス
サイトを構築する場合、1つのプログラミング言語で作る場合より複数の言語で構成するほうが多いと思う。従来WEBに非常に親和性の高い言語といえばなんといってもphpになるだろう。さらにCMSとなるとWORDPRESSをケースが非常に多いと思います。このようなケースでサイトの一般的なページはWORDPRESSで作るけど、システム的な部分はsymfonyやlaravel、cakephpのようなフレームワークで作るのではないかと思います。今回はこのシステムを組み込む部分に異なる言語pythonを使った場合はどうやって一つのサイトにまとめるか解説していきたいと思います。
PythonをApache2.4に組み込む
1 2 3 4 5 6 7 |
$ sudo apt install apache2-dev $ sudo pip3 install mod_wsgi $ sudo vi /etc/apache2/mods-available/wsgi.load LoadModule wsgi_module /usr/local/lib/python3.6/dist-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so $ sudo a2enmod wsgi $ sudo systemctl restart apache2 |
Apache2.4へ仮想ホストを登録する
WSGIScriptAlias,WSGIDaemonProcess,WSGIProcessGroup,WSGIApplicationGroupのパラメータ設定が肝である。特に注意しなければならないのは通常apacheのユーザ、グループはwww-dataなのだが、pythonで作るシステム部分が共通でwww-dataで良い場合もあるだろうし、異なったほうが良い場合もある。下記の例では異なるユーザでpythonプログラムを起動して動かす前提で作っています。予めuser&groupをuseraddコマンドで作っておきましょう。pythonプログラムを設置するパスは当然起動ユーザのアクセス権になっている必要があります。そのユーザのログインパスをそこに設置するというのも一つの手法です。あともう一つ注意点があるとすれば、processとthreadsの数です。apache2.4でhttp2対応させるケースが増えてきた現在ではpreforkからevent,workerタイプに移行しapacheを動作させるケースが多くなりました。メイン設定プロセス数とスレッド数に対しpythonのプログラムが独立してマルチプロセス、マルチスレッドで動作するためメインとサブで恐らく設定数の兼ね合い、バランスを取らないとApacheサーバが落ちてしまう原因を作りそうな気はしています。サブがサイト運用の中で処理メインならば、当然サブのほうがプロセス数、スレッド数が多くなければいけないだろうと思います。興味ある方は実験してみてください。Scriptで呼び出していると言ってもバックエンドで動いてる動作に近いのではないかと推測します。
下記の例ではドキュメントルートは/var/www/vhosts/flat_siteへ配置し、pythonのコンテンツは/var/www/vhosts/sideaに配置します。セキュリティ的にpythonコンテンツをドキュメントルート配下に設置しないよう気をつけましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<VirtualHost *:80> ServerName zero.serve.net ServerAdmin webmaster@localhost DocumentRoot /var/www/vhosts/flat_site WSGIDaemonProcess py_apps user=pyexec group=pyexec python-path=/usr/local/lib/python3.6/dist-packages process=5 threads=30 lang=ja_JP.utf8 WSGIScriptAlias /sideapp /var/www/vhosts/sidea/index.py process-group=py_apps application-group=%{HOST} LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/zero_error.log CustomLog ${APACHE_LOG_DIR}/zero_access.log combined <Directory "/var/www/vhosts/flat_site"> WSGIProcessGroup py_apps WSGIApplicationGroup %{HOST} Options FollowSymlinks Includes AllowOverride All Require all granted </Directory> </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet |
Pythonプログラム
/var/www/vhosts/sideaに下記をindex.pyとして配置します。
開発とデバッグ用に単独起動の処理を”__main__”に導入しています。通常はapache起動ではelseのapplicationに分岐します。尚WSCRIPTSで動作させる場合はpython側はシングルスレッド仕様で作成して大丈夫です。(スレッドセーフにプログラムを作ってさえいれば問題なし)マルチプロセス・マルチスレッドの部分はApache側が担当します。
1 2 3 4 5 6 7 8 9 10 11 12 |
from bottle import route, run, template,default_app from bottle import TEMPLATE_PATH @route('/') def index(): return "Hello World! Bottle Simple Web Server!" if __name__ == '__main__': run(host='0.0.0.0', port=3001) else: application = default_app() |
接続確認を行う。
下記の例で「http://zero.serve.net/sideapp」にアクセスするとpythonのコンテンツが表示され、それ以外のフォルダーはWORDPRESS(php)で動作するようになっています。ドメインは貴方のドメインして実験してみてください。
タグ: Apache, php, process, Python, thread, WSGI, WSGIDaemonProcess, WSGIScriptAlias