。それが重くプロキシマシンからインスピレーションを得たが、前フォークワーカーモデルのようにいくつかのユニークなを持っていますGunicornする借り;
tproxyあなたはPythonでルーチン·ロジックを設定することができます&NBSPはGeven_t上に構築された単純なTCPのルーティングプロキシ(レイヤ7)が、あります。
インスタレーション:
tproxyは、Python 2.xの> = 2.5が必要です。 Pythonの3.xのサポートが計画されています。
geventをインストールピップ
tproxyをインストールピップ
ソースからインストールするには:
gitのクローンgitの://github.com/benoitc/tproxy.git
CDのtproxy
ピップ-r requirements.txtをインストール
Pythonはsetup.py installを
コマンドラインを実行して、インストールをテストします:
tproxy例/ transparent.py
そして、あなたは、Googleのホームページを参照してくださいする必要があり、http://127.0.0.1:5000に行きます。
使用法:
tproxy -h
使用法:tproxy [オプション] script_path
オプション:
  - バージョンショーのプログラムのバージョン番号を表示して終了します
  -h、このヘルプメッセージを表示して終了--help
  - = - ログファイルに書き込むためのログファイル。 [ - ]
  - ログレベル= LEVELログ出力の細かさ。 [情報]
  - = - 設定を記録に使用するログ設定ファイルをファイルです。 [なし]
  -n STRING、--name = STRING
 プロセス命名setproctitleで使用するベース。
  [なし]
&NBSP ;-D、--daemonデーモンGunicornプロセス。 [FALSE]
&NBSP ;-p FILE、--pid = FILE PIDファイルに使用するファイル名。 [なし]
 このユーザーとして実行されるように-u USER、--user = USERスイッチのワーカープロセス。 [501]
  -g GROUP、--group = GROUP
 スイッチワーカープロセスがグループとして実行します。 [20]
  -m INT、--umask = INTが書き込むファイルのファイルモードのビットマスク
  Gunicorn。 [0]
  -b ADDRESS、--bind = ADDRESS
 ソケットがバインドします。 [127.0.0.1:8000]
  - バックログ= INT保留状態にある接続の最大数。 [2048]
  -w INT、--workers = INT
 要求を処理するワーカープロセスの数。
  [1]
  - 労働者の接続= INT
 労働者一人当たりの同時クライアントの最大数。
  [1000]
  -t INT、--timeout = INT
 労働者サイレントこの秒数である以上用
 停止して再起動。 [30]
信号
QUIT - グレースフルシャットダウンを。すぐに接続の受け入れを停止します
 と近いすべての接続まで待ちます
TERM - 高速シャットダウン。受け入れを停止し、すべてのconectionsを閉じます
  10秒後。
INT - TERMと同じ
HUP - 優雅なリロード。新しいコードで、すべての労働者を再読み込み
 あなたのルーティングスクリプトで。
USR2 - オンザフライでtproxyアップグレード
TTIN - 1から労働者の数を増やします
TTOU - 1から労働者の数を減らして
ルーティングスクリプトのExemple
輸入再
re_host = re.compile( "ホスト: S *(*) r n"が)
クラスCouchDBRouter(オブジェクト):
 ルーティングテーブルに#の外観と使用するCouchDBのノードを返します
 デフルックアップ(自己、名):
  "" "" "何かを"
ルータ= CouchDBRouter()
#ストリームデータに基づいて、コンテンツアウェアルーティングを実行します。ここに、
HTTPプロトコルから#ホストヘッダ情報は見つけるために解析されます
#ユーザ名とルックアップルーチンが正しいを見つけるために、名前で実行されています
#1のCouchDBノード。一致がまだ行われていないことができれば、と何もしません
#接続。 (自分のcouchoneサーバーを作ります...)
デフプロキシ(データ):
 一致= re_host.findall(データ)
 一致の場合:
 ホスト= router.lookup(matches.pop())
 リターン{"リモート":ホスト}
  Noneを返します
18行目の例でSOCKS4プロキシ
輸入ソケット
輸入構造
デフプロキシ(データ):
&NBSP;場合LEN(データ)<9:
&NBSP;リターン
&NBSP;コマンド= ORD(データ[1])
&NBSP; IP、ポート= socket.inet_ntoa(データ[4:8])、struct.unpack( "> H"、データ[2:4])[0]
&NBSP; IDX = data.index( " 0")
&NBSP;ユーザーID =データ[8:IDX]
&NBSP; ifコマンド== 1:#CONNECT
&NBSP;リターンのdict(リモート= "%sの:%s"は%(IP、ポート)、
&NBSP;返信= " 0 X5A 0 0 0 0 0 "、
&NBSP;データ=データ[IDX:])
&NBSP;他:
&NBSP; {"閉じる": "X5B 0 0 0 0 0 0 "}リターン
有効な戻り値
&NBSP; {"リモート":文字列またはタプル} - :プロキシされるサーバーのポート文字列は、ホストです。
&NBSP; {「リモート」:文字列、「データ」:文字列} - 上記と同じですが、代わりに与えられたデータを送信します。
&NBSP; {「リモート」:文字列、「データ」:文字列、「返信」:文字列} - 上記と同じですが、クライアントに与えられたデータを返信
&NBSP;なし - 何もしません。
&NBSP; {「閉じる」:真} - 接続を閉じます。
&NBSP; {「閉じる」:文字列} - 文字列を送信した後に接続を閉じます。
エラーを処理
簡単にあなたのスクリプトでproxy_error機能を追加することで、エラーを処理することができます。
デフproxy_error(クライアント、E):
&NBSP;パス
この関数は、第一引数と第二引数でエラー例外としてClientConnectionインスタンス(現在の接続)を取得
この要件:ます。
Pythonの
コメントが見つかりません