Как исправить «(110: истекло время ожидания соединения) при чтении заголовка ответа из восходящего потока» (504 ошибки) в журнале nginx? - PullRequest
0 голосов
/ 14 января 2019

За последние несколько дней в логах nginx стало появляться МНОЖЕСТВО тайм-аутов, и после многих проблем я никуда не попал.

Вот некоторые характеристики:
Сервер Ubuntu 14.04, работает Nginx 1.4.6 и PHP 5.6. Приложение (хотя и не относящееся к этой проблеме) работает на Laravel 5.2. Физические характеристики сервера: 2 процессора и 8 ГБ памяти. У меня может быть от 50 до 100 пользователей одновременно, и я ожидаю, что в ближайшем будущем он будет расти.
Я попытался добавить, увеличить и уменьшить таймауты, добавил буферы, добавил fastcgi_keep_conn on; и отключил access.log, чтобы уменьшить используемые ресурсы. Я также отразил необходимые изменения в соответствующих местах в моем nginx.conf, sites-enabled / site.conf и php.ini. Однако эти тайм-ауты просто продолжают происходить. В моем приложении есть несколько запросов, которые очень тяжелы на сервере (большие запросы SQL, большие запросы API и т. П.), И именно на них всегда происходят тайм-ауты.


nginx.conf:

events {
    worker_connections 2048;
    multi_accept on;
}

http {
    sendfile on;
    # tcp_nopush on;
    tcp_nodelay on;
    types_hash_max_size 2048;
    server_tokens off; # do not expose nginx version

    server_names_hash_bucket_size 64;
    server_names_hash_max_size 512;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    client_max_body_size 30M;

    # Timeouts
    # keepalive_timeout 15;
    # send_timeout 15;
    # client_header_timeout 15;
    # client_body_timeout 15;

    fastcgi_keep_conn on;

    fastcgi_buffering on;
    fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;

    fastcgi_temp_file_write_size 16k;
    fastcgi_max_temp_file_size 1024m;

    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 60;
    fastcgi_read_timeout 60;

    access_log off;
    error_log /var/log/nginx/error.log;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}


сайты с поддержкой / site.conf:

# non-ssl to ssl
server {
    listen 80;
    server_name site.com api.site.com;
    return 301 https://$host$request_uri;
}

server {
    server_name site.com api.site.com;
    root /home/user/sites/site.com/public;

    listen 443; # LISTEN PORT MARKER

    # SSL PLACEHOLDERS
    ssl on;
    ssl_certificate /etc/ssl/site.com/2019/crt;
    ssl_certificate_key /etc/ssl/site.com/2019/key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # disable SSLv3

    charset utf-8;

    client_header_buffer_size 1k;
    large_client_header_buffers 2 1k;

    access_log  off;
    # access_log  /var/log/nginx/site.com-access.log; # uncomment to enable
    error_log  /var/log/nginx/site.com-error.log error;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt { access_log off; log_not_found off; }
    location ~ /\. { deny all; }

    index index.php index.htm index.html;
    error_page 404 /index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        client_body_buffer_size 10k;
        client_max_body_size 8m;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_pass unix:/var/run/php5.6-fpm.sock;
        fastcgi_keep_conn on;
        fastcgi_buffering on;
        fastcgi_buffers 8 16k;
        fastcgi_buffer_size 32k;
        fastcgi_temp_file_write_size 16k;
        fastcgi_max_temp_file_size 1024m;
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 60;
        fastcgi_read_timeout 60;
    }
}


Дело в том, что я веб-разработчик, а не системный администратор. Я летал вслепую здесь, пытаясь бросить дротики в доску, которую я едва вижу. Я не уверен, что все сделал правильно, и все, что мне нужно, - это обновить мой сервер и / или оптимизировать свои запросы, или моя конфигурация nginx абсолютно ужасна.

...