ネット上のアクセスボリュームをUPさせ効率の良い集客をご提案します。

カテゴリー「Python Bottle Framework」の記事

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

 / Linux Tips, Python Bottle Framework, テクニカル, トピックス, ノウハウ


前回の章ではWSGI方式で行ったが今回はRverseProxy方式のApache連携を紹介する。ReverseProxy方式は透過型のProxyで内部で動作しているhttp方式のWEBサーバをお手軽に安全にラッピングしてくれる方式である。内部サーバのコンテンツ作りに不安があるならこの方式が良いと思います。また、内部のシステムが簡単にhttpsに置き換えられないなら、この方法で強引に変更できれば簡単にすみますね!非常に便利なリバースプロキシーです


転送先内部サーバー

いつものごとくありがちなサンプルコード。127.0.0.1で設定しておくと更に安全な接続になります。ローカルホストは外部から接続できませんので。

Apacheのリバースプロキシー設定

ほんのすこしだけ手を加えればリバースプロキシーになります。ProxyPassとProxyPassReverseの箇所だけです。Proxy先のpythonサーバ&プログラムはスレッドセーフになっていることが前提です。

リバースプロキシー起動

サイトにアクセスする例

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

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



Python Bottle Framework入門 全12回
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接続

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

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

 / Python Bottle Framework, トピックス, ノウハウ


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’にすることです。しかしながら呼び出すpython側のプログラムがマルチプロセス・マルチスレッドでスレッドセーフな作りだと連携しやすくなりApacheとpythonプログラムが適正なセッション数で処理できるようprocess&thredsを調整します。これにより設定のバリエーションも広がります。

Apache起動

サイトにアクセスする例

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

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



Python Bottle Framework入門 全12回
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接続

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

 / Linux Tips, Python Bottle Framework, Security Tips, テクニカル, トピックス, ノウハウ


今回はアップデート処理を行いトランザクション処理としてロールバック機能等を入れてみる。ついでにSQLインジェクション対策のパラメータ挿入の仕方で記述します。パラメータの入れ方は多くの人がハマってしまうPython特有のぶら下がりカンマをあえて使います。入れる型に合わせて記述を考慮しなければいけませんがPython独特な書き方だと中々気づきにくいものです。他の言語では複数のリストやarrayを記述する場合は最後のパラメータの後方にはカンマを入れないのですがpythonは必要となるケースがありますのでご注意ください。


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

更新前と更新後を実行

Python MySQLデータベース操作その1(基本編) mysqlclientモジュール

 / Python Bottle Framework, テクニカル, トピックス, ノウハウ


pythonでMySQLの操作をする場合現在ではmysqlclientモジュールを利用するユーザ数が多いようだ。フレームワークではbottleに限らず使えます。今回はmysqlclientモジュールを使った場合の基本操作をまとめて行こうと思います。本テストではカーソルは意図的にcloseしていません。規模が多くなりメモリの再利用が必要な場合は必要かと思いますが通常の小規模では不要なケースのほうが多いと思います。


とりあえず、データベースを実験用に2つ用意します。

user_dbデータベース usersテーブル

local_areaデータベース districtテーブル

db_sampleのSQLダウンロード(ZIP形式)

下記の手順で一気にDB作成、テーブル作成、データ挿入までやります。

DB接続情報をyamlファイルで保存

viかnanoエディターでdb.yamlと開いて接続情報を次のような感じで記述保存してください。プログラムに記述しないでDB接続を書いておくとやはり便利です。とくに沢山のDBやテーブルを操作するのであればそうした方が合理的になると思います。ご自分のMySQL環境に合わせてユーザ名やパスワードを書き換えてください。

もし、yamlがインストールされていなかったら「apt-get install libyaml-dev」「yum install python-yaml」「pip3 install pyyaml」とかでインストールできると思います。

fetchoneで一つづつレコードを取り出すやり方で表示する場合

この方式は、データ量が多いときに有利です。1回毎に1レコードを取り出すためバッファの枯渇になることがありません。大規模ならこの方式を使うのが基本です。工夫次第で取得レコードを複数ライン取り出すことも可能でしょう。

実行結果

fetchallで全てバッファに読み込んで表示する場合

メモリ空間が大きい場合は一度にバッファに詰め込んで取り出せるのでパフォーマンス的に有利です。しかしメモリの枯渇が生じる可能性があるので本格的に大規模系で使う場合はレコード数をチェックしてからメモリ容量を予測して不足かどうか判断の上、実行するか判断しないと行けない場合もあります。

実行結果

DB2つを使ってjoinでinner結合して表示する。

実行結果

他のデータベースを使用する場合

21行目の「cons = db_connect(config_db(),’DB1′)」の部分のDB1をDB2にすればDB2から情報を取り出すことが出来ます。あとは全て同じです。

Python3 Bottleフレームワーク入門(その10)- WSGI via uwsgi Server on SSL

 / Python Bottle Framework, トピックス, ノウハウ


今回は、Pythonでお馴染みのWSGI(外部サーバ)の技術を使ったSSL接続を試してみます。

WSGIとはシンプルすぎて非常にわかりにくいものですが、簡単に言うと通常コマンドラインで標準出力しているものを内部及び外部のhttpサーバで使われているネットワークの土管にバイパスしてブラウザへの表示を拝借してしまおうという発想です。

bottleフレームワークはもとからWSGIの内部WEBサーバを走らせる機能が標準装備しているため外部WEBサーバ使う理由に何が必要なのか?という疑問を持つ人もいると思います。それはbottleの標準WEBサーバはシングルスレッドなので多くの接続を処理したり、SSL接続をしたい場合はこのようにWSGIの外部サーバと連携する技術を使用して同時接続処理を実現することが可能なのです。まず最初にbottleで簡単なWEBサーバを起動してみましょう。

index.pyを実行するとシンプルなWEBサーバ(正確に言うとシングルスレッド内部WSGIサーバです。)が起動します。

ここまでは誰でも普段からやっていると思います。

今度はこれを外部接続WSGI仕様に変えてソースを改良します。
特にWSGI関連ライブラリーを呼び出す必要はありません。ポイントはapplicationというクラスです。uWSGIから呼び出すため、mainは生成されずelseへ分岐します。ここへbottleのインスタンスを渡してあげます。このケースではdefault_app()ですが、もしご自分でbottleのインスタンスを他の変数やクラスへ継承させているならそれを代入しましょう。これがWSGI仕様にする要になります。

最下行にたった2行が追加されました。たったこれだけです。大変シンプルですね。

次はuwsgiというシンプルな外部WSGI接続が可能なWEBサーバーをpipでインストールします。

これでブラウザへ接続をすれば「Hello World! Bottle and uWSGI!」と表示されます。

次にwsgiでSSL接続を行ってみましょう。pythonのプログラムは特に修正する必要はありません。uwsgiのネットワークトンネルを拝借していますから、SSLの処理はuwsgiの機能で行います。


テスト環境でSSLサーバの設置を行う場合のやり方

よくオレオレ証明書を使う方がいますが、今は安いSSL証明書なら年間ライセンス1000円程度で購入できます。私はテスト用に1000円のSSLライセンスを購入して実験利用しています。
テスト環境で実験する場合はWindows側では”c:\Windows\System32\Drivers\etc\hosts”を管理者権限モードでテキストエディタで開いてDNSの照合よりも先にhostsファイルに登録したドメインとIPアドレスを参照するように予めテスト用のドメインを登録しておきます。ドメイン認証だけのSSLならこれでうまくいきます。それ以外の認証が入っている高価なSSLだと「安全ではない」がでるかもしれません。



こうすることで、SSL証明書のドメインとテスト用のサーバのドメインを一致させブラウザを騙します。そうしないとhttps接続時に赤色でバツや三角がブラウザ上のURLそばのアイコンが表示されます。


証明書の準備と取得証明書のマージ処理からサーバ起動まで

証明書が購入できたら次に作業するフォルダーに証明書用のフォルダーを作成します。今はとりあえずauthという名前のフォルダーを作成します。そこに購入した証明書ファイルを配置します。以下のような最低でも3種類のファイルが必要となります。

  • サーバー証明書(server.crt)
  • サーバ秘密鍵(server.key)
  • 中間証明書(ca-bundle.ca)

これらのファイルで中間証明書はuwsgiコマンドのパラメータで指定する事ができないため、中間証明書とサーバ証明書は1つのファイルにマージします。

マージされた証明書は必ず一度エディターで中を開けてチェックして下さい。順番は関係あります。サーバ証明書が一番上に来るようにして下さい。また中間証明書はサーバ証明書のend区切りコメントに連続にならないように改行を必ず入れてください。そうしないとエラーになります。

下記は証明書を結合した場合の証明書同士のボーダーを示しています。予め結合する前にサーバ証明書に改行を入れておくと安全です。必ず結合後はチェックしましょう。

次のようにuwsgiを起動する際に鍵ファイルや証明書を指定します。

実際の実行時のターミナル画面は次のようになります。

実際に本番稼働させる場合は実行用のユーザとグループを用意してchrootさせて実行すると以下の警告はなくなります。

その他uwsgiの実行オプションはここ

パラメータでスレッド数、プロセス数やパフォーマンスに関するその他の項目、ログの場所など細かくチューニングが可能です

スレッド数やプロセス数を増やせば必ずしもマルチスレッドに対応したコンテンツになるとは限りません。例えばコンテンツがREAD主体の静的コンテンツはスレッド数やプロセス数を増やせばマルチスレッドになると思いますが、動的に変化するコンテンツは内部側でもマルチスレッド対応(thread_safe)にしないと駄目なケースが多いと思います。

ブラウザから以下のようにアクセスができたら成功です。中間証明書がきちんと登録ができていないと今のブラウザは厳しいので「このサイトは安全でない」と表示されるので要注意です。必ず中間証明書とサーバー証明書をマージして区切り線が前後に改行されていることを確認しましょう。




Python Bottle Framework入門 全12回
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接続

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

TOPへ戻る

AGA 成長因子