Python3 Bottleフレームワーク入門(その11)- WSGI方式 Bottle連携SSL Apache起動
2018年7月26日Python Bottle Framework, トピックス, ノウハウ
WEBサーバーでApacheと連携したいと思う人は多いと思います。いままで紹介していなかったので改めて見本を掲載したいと思います。ApacheとBottleの連携方法は2種類あります。1つはこれから紹介する外部WSGI連携とリバースプロキシーで対応する方法です。プログラミングでセキュリティに不安な人は後者が良い場合が多いかもしれません。同時アクセス数とパフォーマンスを重視するなら前者だと思います。
シンプルな起動メインコード
それでは最初にメインのソースコードを書いていきたいと思います。元々WSGI対応しているBottleですから記述はシンプルです。下記コードは直接Pythonコマンドで指定起動もOK。Apacheの場合はelse分岐の方で起動します。このファイルは取り敢えずindex.pyという名前にしておきましょう。
1 2 3 4 5 6 7 8 9 10 |
from bottle import route, run, template,default_app @route('/hello/<name>') def index(name): return template('<b>Hello {{name}}</b>!', name=name) if __name__ == "__main__": run(host="0.0.0.0",port=8080, quiet=False, reloader=True) else: application = default_app() |
Apacheの仮想サーバ設定
/etc/httpd/conf.d/python.confとして配置した場合の記述です。これは仮想サーバの設定です。予めmod_wsgiはインストールしておいてください。
肝はWSGIDaemonProcessの部分です。スレッド関連のパラメータを記述していますがきちんと設定しましょうね。これを正しく設置しないとスレッドセーフにならない場合があるため要注意です。DoS攻撃されたらイチコロです。実勢のアクセス量にあわせてチューニングしてください。maximum-requestsはこの値を超えるとカレントプロセスが破棄され新プロセスが再作成されます。ごみメモリもクリアされます。WSGIDaemonProcessのpython-pathの値は自分の環境に合わせ設定してください。python-homeは仮想環境のときに使います。また仮想環境ではないが複数のpythonバージョンが存在するならpython-pathを明示的に使用します。python仮想環境を使って利用する場合はglobalで設定し起動すれば明示的な指定は不要かもしれません。
呼び出すpythonコードの中身を考慮しないで考えた場合はプロセス数とスレッドに関してはもし貴方がプログラムのコードをマルチに動作させることに自信がないのならまずはスレッドセーフにできるだけ安全確実なのはprocess数は任意としてthreadsは’1’にすることです。(もちろん複数のリクエストに対して競合が起きないようにしていないと論外ですよ。)proxy側と呼び出すpython側のプログラムがマルチプロセス・マルチスレッドでスレッドならApacheとpythonプログラムが適正なセッション数で処理できるようprocess&thredsを調整することもできます。つまり後方の呼び出されるプログラムがシングルスレッドなのか、マルチスレッドなのか、マルチプロセスマルチスレッドなのかで状況が違ってきます。それが分かりにくいならthreadsを’1’にしておくことが無難なのです。余裕があるならapacheとpythonアプリケーションのスレッドコネクションの生成の仕方を相互に見極めて調整してゆくと良いでしょう。スレッドの生成が相互に噛み合わないとプログラムが落ちてしまうので注意が必要です。テストに負荷テストのプログラムを使ってthredsやprocessの値を相互(apache側、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 28 29 30 31 |
LoadModule wsgi_module modules/mod_wsgi.so Listen 443 https <virtualHost *:443> ServerAdmin ichinohe@netmars.mobi ServerName www.pytest.net DocumentRoot /var/www/vhosts/pydo SSLEngine on SSLProtocol all -SSLv2 -SSLv3 -TLSV1 SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1 WSGIDaemonProcess py_app processes=25 threads=1 maximum-requests=1000 python-path=/usr/local/lib/python3.5/site-packages WSGIProcessGroup py_app WSGIScriptAlias / /var/www/vhosts/pydo/index.py SSLCertificateFile /etc/httpd/conf.d/auth/www.pytest.net.crt SSLCertificateKeyFile /etc/httpd/conf.d/auth/private.key SSLCertificateChainFile /etc/httpd/conf.d/auth/ca-bundle.ca SetEnvIf User-Agent ".*MSIE.*"mnokeepalive ssl-unclean-shutdown CustomLog logs/pytest_access_log common ErrorLog logs/pytest_error_log AddHandler wsgi-script .wsgi .py <Directory /var/www/vhosts/pydo> Options All -Indexes Order deny,allow Allow from all AllowOverride All </Directory> </VirtualHost> |
Apache起動
1 2 3 |
# systemctl start httpd or # systemctl restart httpd |
サイトにアクセスする例
/hello/の後に任意の文字列を入れてください。ページボディに表示されます。
尚、予めテストサーバにIPアドレスを割り当て名前をWindowsのHostsに登録しておけば下記のように名前ベースのホスト名で実験ができます。