Bottle:タグのアーカイブ|ネットマーベラス(株)データアップロード詳しい開発実績など(非公開)....主要取引先(非公開)....お見積り出し(IP認証+Oauth)隠しノウハウ、隠し資料など(IP認証+Oauth)インターネット上のアクセスボリュームUPをお約束します。BottleフレームワークをCaddyで連携してみる。ソケット経由での例を作ってみました。スクリプトタイプで接続するのでスレッドセーフな作りを心がけてpythonコーディングすればスクリプト側はマルチスレッドせずに連携できるはずです。caddy側でマルチスレッド通信を制御してくれるはず。通常連携する方法で一番簡単なのはリバースProxy接続なのですが今回はfastCGIでBottleフレームワークのアプリを連携する例をやってみました。今回はhttp仕様での例ですが、SSL証明書を登録すればHTTP2対応も簡単にできちゃいます。Bottleを連携(今回はソケット接続でやってみます。)下記のようなソースコードapp.pyを用意します。app.pyCaddy側の設定(fastCGIソケット仕様)非常に設定がシンプルですね。最近は何かと話題のhttp/2対応のWEB接続がかなり増えてきました。オリジナルアプリケーションをフレームワークで作ったものをhttp2対応させる事もフレームワークのライブラリーに既に実装されているのもあり手軽になってきているとはいえ、まだまだ敷居が高いかもしれません。今回は、非http2対応のウェブアプリをリバースプロキシーで簡単に対応させるサーバを紹介します。haskellベースのプロキシーですが簡単に構築できます。Apache,nginx,h2o,Caddyでもできますができるだけ設定が単純なもので行きたいのでこれを使用しました。バーストのメモリ消費は多いみたいだ。ソフトのダウンロードhproxをgithubから取得します。install作成するとデフォルトで~/.local/bin/hproxにバイナリーが設置されます。.bashrcに環境変数PATHで追加登録しておきましょう。使い方Proxyサーバは8000番ポートでリッスン状態にします。http/2接続の場合は証明書は当然ですが必須です。h2オプションスイッチはありませんがSSL仕様にすると標準でhttp/2対応になるようになっています。証明書がなければ自動でhttp/1.1接続になります。-revで指定します。pythonのアプリサーバソースコード(test.py)毎度のお決まりのソースコードですが。bottleのサーバで実験してみます。port=8001)ブラウザーで確認するか、curlコマンドで確認してみましょう。-wsで後方にあるwebsocketのサーバを指定すれば利用できます。with...DoS攻撃激減。python3.5でiptablesの国内IPのみの接続ルールを生成&適用。前回の章ではWSGI方式で行ったが今回はRverseProxy方式のApache連携を紹介する。ReverseProxy方式は透過型のProxyで内部で動作しているhttp方式のWEBサーバをお手軽に安全にラッピングしてくれる方式である。内部サーバのコンテンツ作りに不安があるならこの方式が良いと思います。内部のシステムが簡単にhttpsに置き換えられないなら、この方法で強引に変更できれば簡単にすみますね!非常に便利なリバースプロキシーです転送先内部サーバーいつものごとくありがちなサンプルコード。127.0.0.1で設定しておくと更に安全な接続になります。ローカルホストは外部から接続できませんので。reloader=True)Apacheのリバースプロキシー設定ほんのすこしだけ手を加えればリバースプロキシーになります。ProxyPassとProxyPassReverseの箇所だけです。Proxy先のpythonサーバ&プログラムはマルチスレッド通信でなおかつスレッドセーフなコーディングになっていることが前提です。httpdサイトにアクセスする例/hello/の後に任意の文字列を入れてください。ページボディに表示されます。テストサーバにIPアドレスを割り当て名前をWindowsのHostsに登録しておけば下記のように名前ベースのホスト名で実験ができます。担当者WEBサーバーでApacheと連携したいと思う人は多いと思います。いままで紹介していなかったので改めて見本を掲載したいと思います。ApacheとBottleの連携方法は2種類あります。1つはこれから紹介する外部WSGI連携とリバースプロキシーで対応する方法です。プログラミングでセキュリティに不安な人は後者が良い場合が多いかもしれません。同時アクセス数とパフォーマンスを重視するなら前者だと思います。シンプルな起動メインコードそれでは最初にメインのソースコードを書いていきたいと思います。WSGI対応しているBottleですから記述はシンプルです。下記コードは直接Pythonコマンドで指定起動もOK。Apacheの場合はelse分岐の方で起動します。このファイルは取り敢えずindex.pyという名前にしておきましょう。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側の双方)に調整してゆくことでもっと本格的な設定が可能になります。httpdサイトにアクセスする例/hello/の後に任意の文字列を入れてください。ページボディに表示されます。テストサーバにIPアドレスを割り当て名前をWindowsのHostsに登録しておけば下記のように名前ベースのホスト名で実験ができます。SessionDoS攻撃激減。python3.5でiptablesの国内IPのみの接続ルールを生成&適用。今回は、Pythonでお馴染みのWSGI(外部サーバ)の技術を使ったSSL接続を試してみます。WSGIとはシンプルすぎて非常にわかりにくいものですが、簡単に言うと通常コマンドラインで標準出力しているものを内部及び外部のhttpサーバで使われているネットワークの土管にバイパスしてブラウザへの表示を拝借してしまおうという発想です。bottleフレームワークはもとからWSGIの内部WEBサーバを走らせる機能が標準装備しているため外部WEBサーバ使う理由に何が必要なのか?という疑問を持つ人もいると思います。それはbottleの標準WEBサーバはシングルスレッドなので多くの接続を処理したり、SSL接続をしたい場合はこのようにWSGIの外部サーバ連携する技術を駆使しないと現実的なWEBサーバとして利用できないのです。最初にbottleで簡単なWEBサーバを起動してみましょう。port=80)index.pyを実行するとシンプルなWEBサーバ(正確に言うとシングルスレッド内部WSGIサーバです。index.pyここまでは誰でも普段からやっていると思います。今度はこれを外部接続WSGI仕様に変えてソースを改良します。WSGI関連ライブラリーを呼び出す必要はありません。ポイントはapplicationというクラスです。uWSGIから呼び出すため、mainは生成されずelseへ分岐します。ここへbottleのインスタンスを渡してあげます。このケースではdefault_app()ですが、もしご自分でbottleのインスタンスを他の変数やクラスへ継承させているならそれを代入しましょう。これがWSGI仕様にする要になります。default_app()最下行にたった2行が追加されました。