私は、fastcgiアプリケーションを監視するためのツールをPythonで作成しています。私がfastcgiから必要とするのは、pingとステータスページをロードすることだけです(失敗した場合は何らかのエラーを返します)。Python fastcgi client
これに対応していると思われるライブラリ(python-fasctgiバインディングから)がたくさんありますが、それらのほとんどは私の目的のために過度のものですが、その多くは追加の依存関係を生み出してしまいますパッケージングの問題。
したがって、簡単なpython fastcgi クライアントのインストール/パッケージ(rpm)またはプロジェクトと一緒に配布するのに十分な実装/ライブラリがありますか?
UPDATE:AGFへ
おかげで、私は、FastCGIのアプリに接続し、それに要求のいくつかの種類を送信することができました。これは標準のphp-fpm以上のものではありません。しかし、私はどんな場所でも反応を得ることができません:私は '/ ping'から出ようとしています。これは200 OKとボディの 'pong'で応答する必要があります。私が手に入れているのは、自分のリクエストに対して空のボディを持つ200 OK応答です。
私はこの方法でリクエストをやってる:
def _load_page(self, url):
""" load fastcgi page """
fcgi = fcgi_client.FCGIApp(host = self.fcgi_host, port = self.fcgi_port)
env = {
'SCRIPT_FILENAME': url,
'QUERY_STRING': url,
'REQUEST_METHOD': 'GET',
'SCRIPT_NAME': url,
'REQUEST_URI': url,
'GATEWAY_INTERFACE': 'CGI/1.1',
'SERVER_SOFTWARE': 'ztc',
'REDIRECT_STATUS': '200',
'CONTENT_TYPE': '',
'CONTENT_LENGTH': '0',
'DOCUMENT_URI': url,
'DOCUMENT_ROOT': '/',
#'SERVER_PROTOCOL' : ???
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '123',
'SERVER_ADDR': self.fcgi_host,
'SERVER_PORT': str(self.fcgi_port),
'SERVER_NAME': self.fcgi_host
}
ret = fcgi(env)
print ret
は、私はまた、標準入力の取り扱いにFLUPクライアントを変更しなければならなかった:
# Transfer wsgi.input to FCGI_STDIN
content_length = int(environ.get('CONTENT_LENGTH') or 0)
s = ''
while True:
chunk_size = min(content_length, 4096)
#s = environ['wsgi.input'].read(chunk_size)
content_length -= len(s)
rec = Record(FCGI_STDIN, requestId)
rec.contentData = s
rec.contentLength = len(s)
rec.write(sock)
if not s: break
注一部ですs=''
の代わりs = environ['wsgi.input'].read(chunk_size)
を追加flupからのwsgi関連のもののいくつか。だから、それは空の標準を送信する必要があります。
さらに、flupをreturn status, headers, result
に変更しました。
私はレスポンスコードを調べましたが、これはうまくいくようです:実際には、fpmの空のボディがあります。私はwireshardとのネットワーク通信をチェックしました。それは私にとってはうまくいくようです。すべてのパラメータが転送されています。
アイデア?
UPDATE:
問題はのFastCGIのparamフィルタリング機能していました:それはそうでDOCUMENT_ROOT、SCRIPT_FILENAMEなど便利なのparamsの多くをフィルタリングました。これを無効にした後、すべてうまくいっています。興味がある人々のために
、ここで変更クライアントである:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/lib/flup_fcgi_client.py、ここで使用例である:flup
は主にFastCGI サーバーとして使用されているがhttps://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/php/fpm.py
私はfastcgiサーバーに接続することができますが、答えを得ることができません - 何らかの理由で空のボディで常に200を返します。なぜどんなアイデア? – rvs
FCGIサーバーに入力を渡すのが標準入力処理のように見えるので、コメントアウトした場合は空のリクエストを送信している可能性があります。 – agf
私は実際にはコメントしていませんが、空の標準入力を送信しました。私がfascgi protocol docsとphp-fpmソースコードから正しいと理解していれば、stdinはポストデータを渡すためにのみ使用され、他のすべての情報はparamsを介して渡されます。詳細を編集して質問してください。 – rvs