Nginx - преждевременно закрытое соединение в восходящем направлении при чтении заголовка ответа из восходящего потока - PullRequest
0 голосов
/ 10 апреля 2020

У меня проблема с nginx, которая может быть более сложной, чем кажется. У меня есть приложение, написанное на flask, которое прекрасно работает локально. Я установил его на Ubuntu 16.04.6 LTS. У меня установлен Nginx 1.10.3 и настроен как прокси. База данных - MongoDB v4.2.3. У меня настроен Gunicorn, как в этом уроке: https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-18-04

Проблема в том, что при попытке загрузить данные из mon go он пытается обработать запрос на 30 секунд, а затем выдает 502 Bad Gateway . Я посмотрел в nginx error.log :

[error] 12361#12361: *28 upstream prematurely closed connection while reading response header from upstream, client: 123.123.123.123, server: example.com, request: "GET /example_route/view_database/ HTTP/1.1", upstream: "http://unix:/home/user/flaskapp/src/application.sock:/example_route/view_database/", host: "example.com", referrer: "http://example.com/example_route"

, как для mongod.log :

2020-04-09T22:18:29.534+0200 W  QUERY    [conn89] Plan executor error during distinct command: FAILURE, status: ClientDisconnect: operation was interrupted because a client disconnected, stats: { stage: "COLLSCAN", nReturned: 2745, executionTimeMillisEstimate: 24703, works: 2746, advanced: 2745, needTime: 1, needYield: 0, saveState: 1378, restoreState: 1377, isEOF: 0, direction: "forward", docsExamined: 2745 }
2020-04-09T22:18:29.534+0200 W  COMMAND  [conn89] Unable to gather storage statistics for a slow operation due to lock aquire timeout
2020-04-09T22:18:29.534+0200 I  COMMAND  [conn89] command db_name.col_name command: distinct { distinct: "elem", key: "some_key", lsid: { id: UUID("someid") }, $db: "db_name", $readPreference: { mode: "primaryPreferred" } } planSummary: COLLSCAN numYields:1378 ok:0 errMsg:"Executor error during distinct command :: caused by :: operation was interrupted because a client disconnected" errName:ClientDisconnect errCode:279 reslen:202 locks:{ ReplicationStateTransition: { acquireCount: { w: 1379 } }, Global: { acquireCount: { r: 1379 } }, Database: { acquireCount: { r: 1378 } }, Collection: { acquireCount: { r: 1378 } }, Mutex: { acquireCount: { r: 1 } } } protocol:op_msg 30475ms
2020-04-09T22:18:29.535+0200 I  NETWORK  [conn89] end connection 127.0.0.1:40296 (5 connections now open)
2020-04-09T22:18:29.614+0200 I  NETWORK  [conn88] end connection 127.0.0.1:40294 (4 connections now open)
2020-04-09T22:18:30.136+0200 I  NETWORK  [listener] connection accepted from 127.0.0.1:40310 #96 (5 connections now open)
2020-04-09T22:18:30.137+0200 I  NETWORK  [conn96] received client metadata from 127.0.0.1:40310 conn96: { driver: { name: "PyMongo", version: "3.10.1" }, os: { type: "Linux", name: "Linux", architecture: "x86_64", version: "4.4.0-165-generic" }, platform: "CPython 3.5.2.final.0" }
2020-04-09T22:18:30.160+0200 I  NETWORK  [listener] connection accepted from 127.0.0.1:40312 #97 (6 connections now open)
2020-04-09T22:18:30.160+0200 I  NETWORK  [conn97] received client metadata from 127.0.0.1:40312 conn97: { driver: { name: "PyMongo", version: "3.10.1" }, os: { type: "Linux", name: "Linux", architecture: "x86_64", version: "4.4.0-165-generic" }, platform: "CPython 3.5.2.final.0" }

Другое дело, что когда я пытаюсь загрузить данные на сервер (а загрузка для меня гораздо важнее), я получаю просто всплывающее окно, которое выглядит так:

example.com says

INTERNAL SERVER ERROR

Нет данных в nginx error.log об этом. Когда я смотрю на консоль разработчика в браузере, я просто вижу:

POST http://example.com/example_route/send 500 (INTERNAL SERVER ERROR)

Обе вещи прекрасно работают локально на моем ноутбуке.

nginx Конфигурация сервера:

server {
        listen 80;
        listen [::]:80;
        server_name example.com www.example.com;
        client_max_body_size 100M;
        location /static {
                alias /home/user/flaskapp/src/app_here/static;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/home/user/flaskapp/src/application.sock;
                proxy_redirect off;
                proxy_max_temp_file_size 16400M;
                proxy_buffering off;
                proxy_http_version 1.1;
                proxy_read_timeout 36000s;
        }
}

Конфигурация процесса Gunicorn:

[Unit]
Description=Gunicorn instance to serve flaskapp
After=network.target

[Service]
User=user
Group=www-data
WorkingDirectory=/home/user/flaskapp
Environment="PATH=/home/user/flaskapp/venv/bin"
ExecStart=/home/user/flaskapp/venv/bin/gunicorn --workers 3 --bind unix:application.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

функция, которая отправляет данные на сервер в python:

@main.route('/example_route/send', methods=['POST'])
@login_required
def send():
    data = request.json
    new_data = Data_model(
        timestamp = data['Timestamp'],
        area = data["Area"],
        image = data["Image"]
    ).save()
    return redirect(url_for('main.data_viewer'))

и js на стороне клиента:

$.ajax({
        url: '/example_route/send',
        type: "POST",
        data: JSON.stringify(sendDict),
        contentType: "application/json",
        success: function (data) {
// success code
        },
        error: function (request, status, error) {
            alert(request.statusText);
        },
    });

как для чтения данных с сервера:

@db_viewer.route('/example_route/view_database/')
@login_required
def view_database():
    data = Data.objects.only('UID').distinct('UID')
    return render_template('example_app/view_database.html', ids=data, user=current_user)

Подводя итог, есть 2 проблемы, которые вызывают кошмары, и я просто не могу их решить:

  • 500 внутренние ошибка сервера, когда я пытаюсь отправить json данные на сервер
  • ошибка в восходящем направлении, когда я пытаюсь прочитать из базы данных

, только проблема на сервере, оба работают нормально локально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...