У меня возникла проблема с моей текущей flask настройкой приложения, и я был бы очень признателен за это Спасибо!
Поток
пользователь -> nginx -> uwsgi -> flask приложение -> https вызов внешней системы (ответ обрабатывается и соответствующие данные возвращаются клиенту)
Рабочий процесс
Намерение Мой flask просмотр / маршрут вызывает другой класс, внутри которого выполняется вызов https (GET) внешней системе для извлечения данных. Эти данные затем обрабатываются (анализируются) и пользователю отправляется соответствующий ответ.
Фактический Пользователь получает 502 Bad Gateway от веб-сервера при вызове Flask На основе конечной точки. Это происходит только при размещении сервера nginx и uwsgi перед моим приложением flask. Начальные тесты на сервере напрямую со встроенным сервером flask оказались работоспособными.
Примечание: Этот бит аналитики занимает некоторое время, поэтому я увеличил все соответствующие таймауты (до безрезультатно)
Конфигурации
Nginx (пробовал с и без TLS)
worker_processes 4;
error_log /path/to/error.log;
pid /path/to/nginx.pid;
events {
worker_connections 1024;
}
http {
default_type application/json;
access_log /path/to/access.log;
sendfile on;
keepalive_timeout 0; [multiple values tried]
# HTTPS server
server {
listen 5555 ssl;
server_name my_host.domain.com;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /my_route {
uwsgi_connect_timeout 60s;
uwsgi_read_timeout 300s;
client_body_timeout 300s;
include uwsgi_params;
uwsgi_pass unix:/path/to/my/app.sock;
}
}
}
uWSGI (количество потоков уменьшено до 1 в результате попыток устранения неполадок)
[uwsgi]
module = wsgi:app
harakiri = 300 [also added as part of troubleshooting steps]
logto = /path/to/logs/uwsgi_%n.log
master = true
processes = 1
threads = 1
socket = app.sock
chmod-socket = 766
vacuum = true
socket-timeout = 60
die-on-term = true
Фрагменты кода
Основной Flask Класс (просмотр)
@app.route(my_route, methods=['POST'])
def my_view():
request_json = request.json
app.logger.debug(f"Request Received: {request_json}")
schema = MySchema()
try:
schema.load(request_json)
var1 = request_json["var1"]
var2 = request_json["var2"]
var3 = request_json["var3"]
var4 = request_json["var4"]
# begin
execute = AnotherClass(client_home, config, var1, var2, var3, var4, mime_type)
return jsonify(execute.result)
except ValidationError as exception:
error_message = json.dumps(exception.messages)
abort(Response(error_message, 400, mimetype=mime_type))
Класс, который выполняет HTTPS GET во внешней системе
custom_adapter = HTTPAdapter(max_retries=3)
session = requests.Session()
session.proxies = self.proxies
session.mount("https://", custom_adapter)
try:
json_data = json.loads(session.get(process_endpoint, headers=self.headers, timeout=(3, 6)).text)
Ошибки
Nginx
ошибка] 22680 # 0 : * 1 восходящее преждевременно закрытое соединение при чтении заголовка ответа из восходящего потока, клиент: client_ip, сервер: имя_сервера, запрос: "POST / my_route HTTP / 1.1", восходящий поток: "uwsgi: // unix: / path / to / my /app.sock: ", host:" имя_сервера: 5555 "
U Ser получает 502 на своем конце (Bad Gateway)
uWSGI
2020-04-24 16: 57: 23,873 - app.module.module_class - DEBUG - Конечная точка: https://external_system.com / endpoint_details 2020-04-24 16: 57: 23,876 - urllib3.connectionpool - DEBUG - Запуск нового соединения HTTPS (1): external_system.com: 443 !!! Процесс #W## UWSGI получил ошибку сегментации !!! * обратная трассировка #### / path / to / anaconda3 / bin / uwsgi (uwsgi_backtrace + 0x2e) [0x610e8e] / path / to / anaconda3 / bin / uwsgi (uwsgi_segfault + 0x21) [ 0x611221] /usr/lib64/libc.so.6(+0x363f0) [0x7f6c22b813f0] /path/to/anaconda3/lib/python3.7/lib-dynload/../../libssl.so .1.0.0 (ssl3_ctx_ctrl + 0x170) [0x7f6c191b77b0] /path/to/anaconda3/lib/python3.7/site-packages/cryptography/hazmat/bindings/_openssl.abi3.so(+0x5a496c. 0xxa7966) 0 ... конец следа * ЧЕРТ! рабочий 1 (pid: ####) умер :( пытается возродиться ... Возродился рабочий UWSGI 1 (новый pid: ####)