当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

Apache2.4(Ubuntu/Debian)で複合言語(メイン:php サブ:python)で組み合わせる典型的なやり方。

Apache2.4(Ubuntu/Debian)で複合言語(メイン:php サブ:python)で組み合わせる典型的なやり方。


サイトを構築する場合、1つのプログラミング言語で作る場合より複数の言語で構成するほうが多いと思う。従来WEBに非常に親和性の高い言語といえばなんといってもphpになるだろう。さらにCMSとなるとWORDPRESSをケースが非常に多いと思います。このようなケースでサイトの一般的なページはWORDPRESSで作るけど、システム的な部分はsymfonyやlaravel、cakephpのようなフレームワークで作るのではないかと思います。今回はこのシステムを組み込む部分に異なる言語pythonを使った場合はどうやって一つのサイトにまとめるか解説していきたいと思います。

PythonをApache2.4に組み込む

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コンテンツをドキュメントルート配下に設置しないよう気をつけましょう。

Pythonプログラム

/var/www/vhosts/sideaに下記をindex.pyとして配置します。

開発とデバッグ用に単独起動の処理を”__main__”に導入しています。通常はapache起動ではelseのapplicationに分岐します。尚WSCRIPTSで動作させる場合はpython側はシングルスレッド仕様で作成して大丈夫です。(スレッドセーフにプログラムを作ってさえいれば問題なし)マルチプロセス・マルチスレッドの部分はApache側が担当します。

接続確認を行う。

下記の例で「http://zero.serve.net/sideapp」にアクセスするとpythonのコンテンツが表示され、それ以外のフォルダーはWORDPRESS(php)で動作するようになっています。ドメインは貴方のドメインして実験してみてください。

タグ: , , , , , , ,

Caddyソケット連携fastCGI + Python bottle FrameworkでWEBサーバ起動


Python BottleフレームワークをCaddyで連携してみる。ソケット経由での例を作ってみました。スクリプトタイプで接続するのでスレッドセーフな作りを心がけてpythonコーディングすればスクリプト側はマルチスレッドせずに連携できるはずです。つまりcaddy側でマルチスレッド通信を制御してくれるはず。通常連携する方法で一番簡単なのはリバースProxy接続なのですが今回はfastCGIでBottleフレームワークのアプリを連携する例をやってみました。今回はhttp仕様での例ですが、SSL証明書を登録すればHTTP2対応も簡単にできちゃいます。

flupを導入してfastcgi仕様でPython Bottleを連携(今回はソケット接続でやってみます。)

下記のようなソースコードapp.pyを用意します。

Caddy側の設定(fastCGIソケット仕様)

非常に設定がシンプルですね。

タグ: , , ,

Python3 Bottleフレームワーク入門(その13)- HTTP/2対応hproxで ReverseProxy SSL対応 & Bottle連携


最近は何かと話題のhttp/2対応のWEB接続がかなり増えてきました。オリジナルアプリケーションをフレームワークで作ったものをhttp2対応させる事もフレームワークのライブラリーに既に実装されているのもあり手軽になってきているとはいえ、まだまだ敷居が高いかもしれません。

今回は、非http2対応のウェブアプリをリバースプロキシーで簡単に対応させるサーバを紹介します。haskellベースのプロキシーですが簡単に構築できます。もちろん、Apache,nginx,h2o,Caddyでもできますができるだけ設定が単純なもので行きたいのでこれを使用しました。但しバーストのメモリ消費は多いみたいだ。

ソフトのダウンロード

hproxをgithubから取得します。

作成するとデフォルトで~/.local/bin/hproxにバイナリーが設置されます。.bashrcに環境変数PATHで追加登録しておきましょう。

使い方

Proxyサーバは8000番ポートでリッスン状態にします。http/2接続の場合は証明書は当然ですが必須です。h2オプションスイッチはありませんがSSL仕様にすると標準でhttp/2対応になるようになっています。証明書がなければ自動でhttp/1.1接続になります。後は末端にあるリバースプロキシー先のアプリサーバ設定を- -revで指定します。

ソースコード(test.py)

毎度のお決まりのソースコードですが。。。。python bottleのサーバで実験してみます。下記はシングルスレッドですが、実運用ではマルチスレッド対応のWSGIにしてpythonアプリサーバを動作させてください。

ブラウザーで確認するか、curlコマンドで確認してみましょう。

hproxの使えるオプション

このサーバはwebsocket接続のproxyにも対応しておりますので、- -wsで後方にあるwebsocketのサーバを指定すれば利用できます。



Python Bottle Framework入門 全13回
1.基礎編サーバ起動
2.リクエストメソッド
3.ORM Peewee (MySQL)
4.ORM Peewee CRUD
5.Cookie And Session
6.Abort and Redirect
7.マルチスレッドWEBサーバ
8.デーモン化
9.Json
10.WSGI on SSL
11.Apache連携起動(外部WSGI) SSL接続
12.Apache連携起動(ReverseProxy)SSL接続
13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応

合わせて読みたいPython MySQL操作関連

タグ: , , , , , ,

Python3 Bottleフレームワーク入門(その11)- WSGI方式 Bottle連携SSL Apache起動


WEBサーバーでApacheと連携したいと思う人は多いと思います。いままで紹介していなかったので改めて見本を掲載したいと思います。ApacheとBottleの連携方法は2種類あります。1つはこれから紹介する外部WSGI連携とリバースプロキシーで対応する方法です。プログラミングでセキュリティに不安な人は後者が良い場合が多いかもしれません。同時アクセス数とパフォーマンスを重視するなら前者だと思います。


シンプルな起動メインコード

それでは最初にメインのソースコードを書いていきたいと思います。元々WSGI対応しているBottleですから記述はシンプルです。下記コードは直接Pythonコマンドで指定起動もOK。Apacheの場合はelse分岐の方で起動します。このファイルは取り敢えずindex.pyという名前にしておきましょう。

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側の双方)に調整してゆくことでもっと本格的な設定が可能になります。

Apache起動

サイトにアクセスする例

/hello/の後に任意の文字列を入れてください。ページボディに表示されます。

尚、予めテストサーバにIPアドレスを割り当て名前をWindowsのHostsに登録しておけば下記のように名前ベースのホスト名で実験ができます。



Python Bottle Framework入門 全13回
1.基礎編サーバ起動
2.リクエストメソッド
3.ORM Peewee (MySQL)
4.ORM Peewee CRUD
5.Cookie And Session
6.Abort and Redirect
7.マルチスレッドWEBサーバ
8.デーモン化
9.Json
10.WSGI on SSL
11.Apache連携起動(外部WSGI) SSL接続
12.Apache連携起動(ReverseProxy)SSL接続
13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応

タグ: , , , , ,

Python MySQLデータベース操作その2(更新、トランザクション) mysqlclientモジュール


今回はアップデート処理を行いトランザクション処理としてロールバック機能等を入れてみる。ついでにSQLインジェクション対策のパラメータ挿入の仕方で記述します。パラメータの入れ方は多くの人がハマってしまうPython特有のぶら下がりカンマをあえて使います。入れる型に合わせて記述を考慮しなければいけませんがPython独特な書き方だと中々気づきにくいものです。他の言語では複数のリストやarrayを記述する場合は最後のパラメータの後方にはカンマを入れないのですがpythonは必要となるケースがありますのでご注意ください。尚、予め「pip install MySQL-python」or「pip install pymysql」でインストールしてください。mysql driverはpip側のアップデートで名前が変わったりすることもあります。また互換性のあるdriverであれば何でも良いと思いますのでpip searchで調べてみてください。

更新、トランザクション処理を入れたプログラム。SQLインジェクション対策の書き方にもなっている。

更新前と更新後を実行

タグ: , , ,

1 2 3 4