Я пишу инструмент на python для мониторинга приложения fastcgi.Единственное, что мне нужно от fastcgi, - это загрузить страницы ping и status (и вернуть какую-то ошибку в случае сбоя).
Существует множество библиотек (от привязок python-fasctgi до twisted), которые, кажется,быть способным на это, но большинство из них просто излишни для моей цели, и многие из них лишают меня дополнительных зависимостей, вызывая некоторые проблемы с упаковкой.
Итак, есть ли простой python fastcgi client реализаций / библиотек, которые легко установить / упаковать (в rpm) или достаточно малы для распространения с проектом.
ОБНОВЛЕНИЕ :
Благодаря 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в обработке stdin:
# 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)
, что является частью некоторых связанных с wsgi вещей из flup.Поэтому он должен отправить пустой стандартный ввод.
Кроме того, я изменил flup на return status, headers, result
.
Я проверил код чтения ответа, и, похоже, все в порядке: тело действительно пустое изFPM.Я проверил сетевую связь с Wireshard, и мне кажется, что все параметры передаются.
Есть идеи?
ОБНОВЛЕНИЕ :
Проблема была в функции фильтрации параметров fastcgi: она отфильтровывала множество полезных параметров, таких как DOCUMENT_ROOT, SCRIPT_FILENAME и так далее.После отключения этого все работает хорошо.
Для всех, кто заинтересован, вот модифицированный клиент: https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/lib/flup_fcgi_client.py,, а вот пример использования: https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/php/fpm.py