При вызове request.get () в подклассе приложения flask возникает ошибка сегментации uwsgi и 502 на nginx - PullRequest
0 голосов
/ 25 апреля 2020

У меня возникла проблема с моей текущей 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: ####)

1 Ответ

0 голосов
/ 28 апреля 2020

решено

Предпринятые шаги

криптография обновления

запросы на обновление

обновление urllib3

добавление недостающих шифров TLS в Py HTTP-адаптер Py (см. Это руководство )

...