@ironheaddd

Python3 или nginx: кто виноват?

Есть простой скрипт:
import json
import requests

url = "https://my-test-domain.example.com/api/views"
headers = {
  'Content-Type': 'application/json'
}
list_data = []
data = {
    "device":"mob",
    "requests":1,
    "country":"RU",
    "ip":"1433663550",
    "source_id":35100,
    "price":0.001672089216299355,
    "event_time":"2023-10-22T13:18:39+03:00",
    "browser":"Chrome",
    "browser_version":"112.0.0",
    "os":"Android",
    "os_version":"10.0.0"
}

count_obj = 17250 # кол-во объектов в отправляемых в массиве

for item in range(count_obj):
    list_data.append(data)

json_data = json.dumps(list_data)
print(json_data)
print('Data prepared')

response = requests.request("POST", url, headers=headers, data=json_data)
print('Request has been sent')
request_size = response.request.body
total_time = response.elapsed.total_seconds()

print(f'\n status_code {response.status_code}')
print(f'\n request_size {len(request_size)}byte')
print(f'\n answer {response.text}')
print(f'\n Total time {total_time}s')

После запуска скрипт всегда (какие бы параметры nginx я не правил) падает через 50 секунд.
В чем может быть проблема и как это исправить?
nginx.conf
load_module modules/ngx_http_headers_more_filter_module.so;
load_module modules/ngx_http_js_module.so;
user nginx;
worker_processes 32;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log warn;

events {
        worker_connections 65536;
        multi_accept on;
        use epoll;
}

http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        map $status $loggable
            {
                ~^2 0;
                ~^3 0;
                default 1;
            }

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        log_format upstream_logging '[$time_local] $remote_addr - $remote_user - $server_name upstream: $upstream_addr: "$request" status=$status ref:"$http_referer" upstream_response_time=$upstream_response_time s msec=$msec request_time=$request_time';

        log_format gelf_json '{ "time": "$time_iso8601", '
          '"connection": "$connection", '
          '"connection_requests": "$connection_requests", '
          '"remote_addr": "$remote_addr", '
          '"proxy_protocol_addr": "$proxy_protocol_addr", '
          '"remote_user": "$remote_user", '
          '"parent_servername": "$server_name", '
          '"ssl_protocol": "$ssl_protocol", '
          '"host": "$host", '
          '"upstream": "$upstream_addr", '
          '"proxy_host": "$proxy_host", '
          '"request": "$request", '
          '"response_status": $status, '
          '"ref": "$http_referer", '
          '"upstream_response_time": "$upstream_response_time", '
          '"request_time": $request_time, '
          '"nginx_log": "true" }';
        
        access_log /var/log/nginx/access.log gelf_json if=$loggable;

        #access_log /var/log/nginx/access.log upstream_logging;

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;

        keepalive_timeout 30s;
        keepalive_requests 100;
        reset_timedout_connection on;

        server_names_hash_max_size 512;
        server_names_hash_bucket_size 128;
        types_hash_max_size 2048;

        open_file_cache max=200000 inactive=20s;
        open_file_cache_valid 30s;
        open_file_cache_min_uses 2;
        open_file_cache_errors on;

        client_body_buffer_size 16k;
        client_header_buffer_size 1k;
        client_max_body_size 8m;
        large_client_header_buffers 4 16k;
        http2_max_field_size 4k;

        client_body_timeout 10;
        client_header_timeout 10;

        proxy_ssl_verify off;
        proxy_ssl_session_reuse off;

        ssl_verify_client off;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers off;

        gzip on;
        gzip_vary on;
        gzip_min_length 10240;
        gzip_disable "msie6";
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        include /etc/nginx/conf.d/*.conf;

        server {
                listen 8200;

                location /nginx_status {
                        access_log off;
                        stub_status on;
                }
        }
        vhost_traffic_status_zone shared:vhost_traffic_status:32m;
        server {
                listen 8201;
                location /metrics {
                        allow 10.1.5.8/32;
                        deny all;
                        access_log off;
                        vhost_traffic_status_bypass_limit on;
                        vhost_traffic_status_bypass_stats on;
                        vhost_traffic_status_display;
                        vhost_traffic_status_display_format prometheus;
                }
        }

}

my-test-domain.example.com.conf
server {
    listen 80 proxy_protocol;
    listen [::]:80 proxy_protocol;

    server_name my-test-domain.example.com;


    set_real_ip_from 10.1.5.1;
    set_real_ip_from 10.1.5.2;
    real_ip_header proxy_protocol;



    location / {
        return 301 https://$host$request_uri;
    }

}


server {
    listen 443 ssl http2 proxy_protocol;
    listen [::]:443 ssl http2 proxy_protocol;

    server_name my-test-domain.example.com;

    ssl_certificate /etc/letsencrypt/live/my-test-domain.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/my-test-domain.example.com/privkey.pem;

    set_real_ip_from 10.1.5.1;
    set_real_ip_from 10.1.5.2;
    real_ip_header proxy_protocol;






    location /favicon.ico {
        if ($request_method = 'GET') {
            add_header "Access-Control-Allow-Origin" "*";
            add_header "Access-Control-Allow-Methods" "GET";
            add_header "Access-Control-Allow-Headers" "*";
            add_header "Access-Control-Expose-Headers" "*";
        }

        expires max;
        access_log off;
        log_not_found off;
        return 204; 
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";

    }



    location / {
        resolver 127.0.0.11 valid=10s;
        set $backend "http://my-container:8080";
        proxy_pass $backend;
        client_body_buffer_size 16k;
        proxy_ignore_client_abort on;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $proxy_protocol_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 60;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
        proxy_next_upstream_timeout 0;
        proxy_next_upstream_tries 0;
        proxy_ssl_session_reuse off;
        proxy_buffering on;
        proxy_buffers 16 256k;
        proxy_buffer_size 512k;
        proxy_temp_file_write_size 512k;
        proxy_max_temp_file_size 2048m;
        proxy_busy_buffers_size 512k;
    }

}

Nginx проксирует запрос в контейнер.
При выполнении скрипта без nginx (по ip контейнера) все отрабатывает корректно.
UPD: при обращении по урлу получаю ошибку скрипта:
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 2
IvanU7n
@IvanU7n
не совсем понятно, но если это nginx смотрящий наружу, то proxy_protocol в listen вполне может быть виновником, т.к. при указании этой директивы nginx ожидает запросов исключительно через этот самый PROXY-протокол — сообщения об этом по идее должны быть в error.log

ну а если это внутренний сервер, то запросы нужно направлять через тот, в котором PROXY-протокол для клиентов не активирован на стандартных портах
Ответ написан
@ironheaddd Автор вопроса
если кому интересно - виноватым оказался балансировщик haproxy с таймаутом в 50 секунд.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы