Perlbal::Manual::Internals - Perlbalの構造の一望
Perlbal 1.78.
Connections come in from wherever and get to the TCPListener. それはどの種類のClient*をspawnするかを決めるためにServiceオブジェクトを使用します。クライアントのクラスはその後ユーザのための応答を作成します。
{{ INTERNET }} | v [Service]<===>[TCPListener] ___/ | \___ v v v [ClientManage] [ClientHTTP] [ClientProxy] ^ | v [BackendHTTP]
Perlbalはリクエストをどのバックエンドに送信するかをランダムに決めます(現在のところ唯一サポートされているメソッドです)。サービスがbackend_persist
および connect_ahead
で定義される利用可能な空いているバックエンド接続を持つ場合、それらの接続を再利用し、待ち時間を大幅に減らします。詳細は the Perlbal::Manual::LoadBalancer manpage を見てください。
Perlbalはまた遅いクライアントに対して "spoonfeeding" データに特化しています。これにより、バックエンドはPerlbalが応答をクライアントが読み込めるだけ速く戻している間にリクエストに応え続けることができます。
以下はPerlbalのメインのクラスの短い紹介/概要です。
the Danga::Socket manpageを継承します。
基本クラスにHTTPソケットを作成するために特別便利ないくつかの機能を追加します。
読み込まれたままのヘッダ。
入ってくる最終的なthe Perlbal::HTTPHeaders manpageオブジェクト。
出て行く応答ヘッダ (the Perlbal::HTTPHeaders manpage オブジェクト)。
生成時間。
最後にaliveと記された時間。
一般的な目的の状態; 継承クラスで使われます。
onであれば、dieしそれ以上リクエストしません。
クライアントから読み込んだscalarrefのArrayref。
read_bufにあるバイト。
これまでクライアントから読み込んだ総バイト数。
trueであれば、次のヘッダのパースは先頭の\r\nを無視するでしょう。
定義されている場合は、応えているpeerのIP文字列を含みます。これはX-Forwarded-Forの値を保持するためのものであり、ACLを運用するために使われます。
the Perlbal::Socket manpageから継承します。
Very lightweight and fast connection accept class. Takes incoming connections as fast as possible and passes them off, instantiating one of the various Client* classes to handle it.
このサービスが新しい接続を受け取るためにlistenしているIPポートのスカラです。
SSLオプション。
use Data::Dumper; warn Dumper( $tcp_listener->{'sslopts'} );
上の行は以下のようなものを出力するでしょう:
$VAR1 = { 'ssl' => { 'SSL_cipher_list' => '...', 'SSL_cert_file' => '...', 'SSL_key_file' => ',,,', 'SSL_ca_path' => '...', 'SSL_verify_mode' => '...' } };
booleanはインストールされたPerlbalがIPv6をサポートするかどうかを示します (これは基本的に the Danga::Socket manpage v1.6.1 および the IO::Socket::INET6 manpage が利用可能に落ち着きます)。
the Perlbal::Socket manpageから継承します。
このクラスはユーザに返すデータを取得するためにバックエンドのwebノードへの接続を処理します。このクラスは内部のノードへリクエストを送るためにthe Perlbal::ClientProxy manpage のようなほかのクラスによって使われます。
the Perlbal::ClientProxy manpage 接続、あるいは 未定義。
the Perlbal::Pool manpage; whatever pool we spawned from.
IP scalar.
Port scalar.
$ip:$port
.
オブジェクト; reporter インタフェースを実装していなければなりません。
webサーバによって受け付けられ、確実にTCP須宅に話しかけているだけでは無いことを知っています。
trueであれば、いつ注目されるかを決めるために OPTIONS * 応答を待ちます。
kept-aliveおよびバックエンドが教える場合は、この接続が切断される時間; そうでなく未知であれば undef
。
転送されたドキュメントの長さ。バックエンドのサーバがcontent-lengthヘッダを送信した場合にのみ適用されます。
読み残しているバイト数。バックエンドのサーバがcontent-lengthヘッダを送信した場合にのみ適用されます。
このバックエンドが使われたリクエストの数。
Int; 何世代spawnしたかの数。
Boolean. noであれば、バッファされたupload転送をしています。
特別なストレージ; プラグインは必要であれば使うことができます。
Header management. ヘッダ(リクエストおよび応答)をパースし、更なるユーザのためにデータを保持します。また、HTTPの仕様に従うようにリクエスト行の検証を管理します。
href; lowercase header -> comma-sep list of values.
Href; lowercase header -> provided case.
Aref; order headers were received (canonical order).
Scalar; request method (if GET request).
Scalar; request URI (if GET request).
res
or req
.
HTTP 応答ステータスコード。
応答コードのためのステータス文字列。
バージョン(文字列) "1.1".
バージョン (番号: major*1000+minor): "1.1" => 1001.
(応答の場合は)HTTP応答の最初の行。
(リクエストの場合は)HTTPリクエストの最初の行。
the Perlbal::Socket manpageから継承します。
the Perlbal::ClientHTTP manpage および the Perlbal::ClientProxy manpage へ基本機能を提供します。特に、リモートのユーザにファイルをっ送信する機能があります。Also handles most of the state logic for statistics and such. サービスの種類のselector
としても使われます。the Perlbal::ClientHTTPBase manpage then reads in the request headers, and asks the service to re-bless the client instance to a more specific type, for either a the Perlbal::ClientProxy manpage or the Perlbal::ClientHTTP manpage (depending on selector's mapping).
the Perlbal::Service manpage オブジェクト。
リクエストされたURIの代わりに送信されるURI; ディレクトリを提供しようとして失敗する代わりに_serve_request
にインデックスファイルを送信するように教えるために使われます。
特別なストレージ; プラグインは必要であれば使うことができます。
バックエンドが私たちに開き始めることを伝えるファイル名。
ファイルのサイズ。かつて stat()
したもの。
必要であれば、fdのthe IO::Handle manpage。
そのファイルからどれだけ送信したか。
Subref to run after we're done sendfile'ing the current file.
このオブジェクトがユーザのために実施したリクエストの数。
私たちがやってきた元のサービス。
ソケットがSSLに所属していたかどうか(制限された操作)。
the Perlbal::ClientHTTPBase manpageから継承します。
とても単純で軽いクラス。あまりオーバーヘッド無しにユーザへのファイル送信を処理します。ほとんどの機能は親のクラスに含まれており、このクラスは新しいものをあまり実装していません。
返すための非同期jobを今待っているのであれば 1。
データを書くために使われるファイルハンドル。
put_fhのファイル名。
次のデータを書くファイルのオフセット。
転送されたドキュメントの長さ。
読み残しているバイト数。
Boolean/obj: チャンクされたuploadを処理する場合は、the Perlbal::ChunkedUploadState manpage オブジェクト。そうでなければ未定義。
the Perlbal::ClientHTTPBase manpageから継承します。
ユーザからやってくる接続を取り、バックエンドノード(Perlbal::BackendHTTP
) に接続しリクエストを中継します。バックエンドは、プロキシにreporxyしてディスクからファイルをロードするように言うか、あるいはファイルを直接返すかのどちらかをすることができます。あるいは単にステータスメッセージを返します。
the Perlbal::BackendHTTP manpage オブジェクト (あるいは切断された場合は undef
)。
このリクエストのためのバックエンドをリクエストした場合はtrue。
バックエンドに再接続しようとした回数。
Boolean; 高優先度キューであるか、そうであった場合には 1。
Boolean; 低優先度キューであるか、そうであった場合には 1。
Arrayref; reproxyするURIを並べたもの。
Int: reproxyで返ると期待されている応答のサイズ。
Arrayref; 現在reproxyしているホストの情報とURI。
Int: まだ待っているデータの総量。
Bool: ユーザに応答を既に送信したかそうでないか。
Int: 最後にリクエストを受け取った時間。
If defined, we are doing a transparent reproxy-URI and the headers we get back aren't necessarily the ones we want. Instead, get most headers from the provided res
headers object here.
Bool; リクエストのいくつか/全てをメモリ/ディスクにバッファしている場合。
Bool; onであれば、現在aio_write
を出力しています。
データをアップロードしている場合のHi-res時間。
バッファされたアップロードファイルハンドル オブジェクト。
String; バッファされたアップロードファイル名。
String; 定義された場合は、ディスクにバッファしている理由。
Int; バッファされた出力の位置。
Boolean: あまりに遅いためにバックエンドが読み込みを停止した場合。
Boolean: クライアントから読み込まれるデータがまだあると知っているが読み込みを停止した場合。
Bool/obj: チャンクされたアップロードを処理する場合、the Perlbal::ChunkedUploadState manpage オブジェクト。そうでなければ 未定義。
Integer: リクエストボディの長さ。宣言されたものか、あるいはチャンクされたアップロードが完了した後で計算されたもののどちらか。
最後にUDPアップロードパケットを送信したunixtime。perlbalは(xmlhttprequestアップロードバーのための)アップロードの状態に関係したUDPパケットを送信します。
クライアントが自己生成したアップロードセッション。perlbalは(xmlhttprequestアップロードバーのための)アップロードの状態に関係したUDPパケットを送信します。
500
エラーを受け取ってから今までこのリクエストを再送した回数。
the Perlbal::Socket manpageから継承します。
ユーザがPerlbalの管理インタフェースを使う方法を提供する簡単なインタフェース。webブラウザまたは通常のtelnetを使って(設定ファイルに定義された)管理ポートに接続することができます (詳しくは the Perlbal::Manual::Management manpage を見てください)。
読み込みバッファ。
リクエストがHTTPかどうかのboolean。
サービスはPerlbalが実施している特定の項目です。サービスはどのように動作するかを定義するroleを持つことができます。各サービスは挙動をさらに調整するために一連のパラメータを持つこともできます。サービスのクラスはそれ自身でバックエンドの接続のプールの管理と統計の管理を処理します。
サービスの名前。
role タイプ (web_server
, reverse_proxy
, など)。
Boolean; 有効にしているかそうでないか(有効 = listenしている)。
プロキシモードの場合に、ノードを割り当てるために使用しているthe Perlbal::Pool manpage。
有効な場合は、the Perlbal::TCPListener manpage オブジェクト。
有効な場合は、the Perlbal::Cache manpage オブジェクト。
新しい接続のためにlistenしているIP:port
。
web_server
role のための ドキュメントルート。
Boolean; ディレクトリのインデックス(web_server
roleのためのもの)。Not async.
Arrayref of filenames to try for index files.
Boolean; ユーザが連結されたファイルをリクエストできる場合。
Boolean; PUTがサポートされているかどうか。
putファイルの最大サイズのバイト数。
チャンクされたリクエストの最大バイト数(まず、ディスクに書き込まれます)。
putのURIの最初に存在する必要があるディレクトリの数。
Boolean; DELETE がサポートされているかどうか。
クライアントリクエストが高優先度と見なされるべきかどうかを調べるクッキーの名前。
high_priority_cookie_contents
も見てください。
前述したクッキーの値はこの文字列を含む必要があります。
クライアントが無い間に保持する永続的なバックエンドの最大数。
Boolean; クライアントのための永続的な接続。
Boolean; バックエンドのための永続的な接続。
Boolean; get attention of backend before giving it clients (using OPTIONS).
Path to check with the OPTIONS request (default is *
).
Max requests to send per kept-alive backend (default 0 = unlimited).
Number of spare backends to connect to in advance all the time.
How much data a the Perlbal::ClientProxy manpage object should buffer from a backend.
Same as above but for backends that are reproxying for us.
Number of outstanding standard priority connections to activate pressure relief at.
Int, 0-100; % chance to take a standard priority request when we're in pressure relief mode.
信頼できるupstreamのネットマスクを含んでいるthe Net::Netmask manpageオブジェクトの配列。
Boolean; trueであれば、常にupstreamを信頼します。
Boolean; trueであれば、X-Forwarded-For
, X-Host
, あるいは X-Forwarded-Host
ヘッダを修正しません。
Boolean; trueであれば、サーバがファイル および/あるいは URL をreporoxyすると通知します。
キャッシュされるreproxyの結果の最大数。(0は無効で、デフォルトです。)
SO_SNDBUF
のバイト数。
サーバプロセスへのパス(実行可能ファイル)。
クライアントのkeep-aliveタイムアウトの秒数(デフォルトは30)。
keep-aliveタイムを除くIdle タイムアウト(デフォルトは30)。
バックエンドのhttp接続を待っているクライアントのarrayref。
バックエンドのhttp接続を待っている高優先度のクライアントのarrayref。
バックエンドのhttp接続を待っている低優先度のクライアントのarrayref。
バックエンドを待っているクライアントの数。
Map of clientproxy fd -> 1 (if they're waiting for a connection).
Hashref of ip:port
-> $time
(only one pending connect to backend at a time).
Number of outstanding backend connects.
既に接続しているが、クライアントがいないバックエンドのarrayref。
Hashref: hookname => [ [ plugin, ref ], [ plugin, ref ], ... ].
Hashref: name => 1.
Arrayref: name, name, name...
Hashref: { plugin_name => { key_name => coderef } }.
特別な設定オプションを持つhashref; name => values.
Boolean; if true, we're currently in spawn_backends
.
{ insert => [ [ header, value ], ... ], remove => [ header, header, ... ], set => [ [ header, value ], ... ] }.
Used in header management interface.
Int; generation count so we can slough off backends from old pools.
{ "ip:port" => 1 }.
on であれば、spawn_backends
はこの ip:port
の組み合わせを無視するでしょう。
0 if off; otherwise, number of bytes to buffer before we ask for a backend.
CODE ref, or undef, for role selector
services.
セレクタがデフォルトとするサービスの名前。
Boolean; ディスクシステムへのバッファされたアップロードを有効/無効 にする。
バッファされたアップロードファイルの格納されているパス。
Int; buffer uploads estimated to take longer than this.
Int; これ以上のサイズ(バイト)のアップロードをバッファする。
Int; このレート(bytes/sec)より小さなアップロードをバッファアップロードする。
Comma separated list of ip:port
of UDP upload status receivers.
sockaddrs (packed ip/port) のarrayref。
Boolean; クライアントへこのサービスがSSLを話すかどうか。
key pemファイルへのパス。
cert pem ファイルへのパス。
OpenSSL cipher リストの文字列。
証明書のディレクトリへのパス。
Int; 検証モード。the IO::Socket::SSL manpageを見てください。
Boolean; エラーの後でリクエストを再試行しなければならないかどうか。
Comma-separated seconds (full or partial) to delay between retries.
リクエストに追加する遅延時間のミリ秒数。
Boolean; "Server"ヘッダを提供するかどうか。
このサービスへの総リクエスト。
reproxy-urlキャッシュを使って提供されるこのサービスへの総リクエスト。