Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nginx + php-fpm: 504 timeout error - upstream timed out (110: Connection timed out)

Tags:

php

nginx

Is the first time we set up Nginx and PHP-FPM. A week back we were using Apache to serve a webpage, but we have decided to try out the Nginx combination and we are facing several problems.

We have a Virtual Machine running Ubuntu 14.04 LTS Trusty. Among other utilities, the machine is running Nginx with PHP-FPM and MySQL, and here is when the problem comes:

  • From the same network, all coworkers (around 10) can access the web without problem, while there is one coworker that cannot (Error 504).
  • From outside, some coworkers can access the web without problems and others see the 504 error. For example, in my case I can access via my home WiFi but if I use mobile's 3G I cannot. Some coworkers have faced the opposite, they can access via 3G but not WiFi. And others cannot access.

We have reached the conclusion that the client can connect to the Nginx, but Nginx, when redirects the request to FPM (which can be accessed via port 7777) does not receive a response and shows a timeout error. We have focused on troubleshooting the communication between Nginx and FPM but after several hours we haven't found a solution.

Note: this problem is repeated across the four virtual machines that we have set up.


Nginx error log (note: hostname and ip have been suppressed)

2014/09/27 01:57:26 [error] 12686#0: *8 upstream timed out (110: Connection timed out) while reading response header from upstream, client: <ip>, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock", host: "<hostname>"
2014/09/27 02:03:26 [error] 12718#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: <ip>, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock", host: "<hostname>"
2014/09/27 02:05:29 [error] 12744#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: <ip>, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock", host: "<hostname>"

File: /etc/nginx/nginx.conf

user www-data;
worker_processes 4;
worker_rlimit_nofile 8192;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
  worker_connections 4096;
}

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

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

  sendfile    on;
  server_tokens on;

  types_hash_max_size 1024;
  types_hash_bucket_size 512;

  server_names_hash_bucket_size 64;
  server_names_hash_max_size 512;

  keepalive_timeout  65;
  tcp_nodelay        on;

  gzip         on;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";

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

File: /etc/nginx/sites-available/default.conf

server {
    listen 80;
    root /var/www/html/web;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /app.php; #$is_args$args;
    }

    location ~ ^/(app|app_dev|config)\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
}

File: /etc/nginx/fastcgi_params
Note: only the line fastcgi_param REQUEST_SCHEME $scheme; has been added.

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

File: /etc/php5/fpm/php-fpm.conf

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
include=/etc/php5/fpm/pool.d/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Default Value: none
pid = /var/run/php5-fpm.pid

request_terminate_timeout=30s

; Error log file
; Default Value: /var/log/php-fpm.log
error_log = /var/log/php5-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
process_control_timeout = 0

; The maximum number of processes FPM will fork. This has been design to control
; the global number of processes when using dynamic PM within a lot of pools.
; Use it with caution.
; Note: A value of 0 indicates no limit
; Default Value: 0
; process.max = 128

; Specify the nice(2) priority to apply to the master process (only if set)
; The value can vary from -19 (highest priority) to 20 (lower priority)
; Note: - It will only work if the FPM master process is launched as root
; - The pool process will inherit the master process priority
; unless it specified otherwise
; Default Value: no set
; process.priority = -19

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
;daemonize = yes

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;

; See /etc/php5/fpm/pool.d/*.conf

File: /etc/php5/fpm/pool.d/www.conf

;; For readability, comments have been suppressed.    

[www]

user = www-data
group = www-data

listen = /var/run/php5-fpm.sock
listen.backlog = -1
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 0

ping.response = pong

slowlog = /var/log/php-fpm/www-slow.log

catch_workers_output = no

php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on

What we have done so far (these configurations may not be reflected in the above files)

  • Set the Nginx and FPM user the same (www-data).
  • Restart services and machines.
  • Set proxy_read_timeout in the nginx configuration.
  • Set max_execution_time and request_terminate_timeout to 300 (on php.ini and nginx.conf, respectively).
  • Increase the number of worker_process and worker_connections on the nginx config.
  • Change the value of Listen from /var/run/php5-fpm.sock to 127.0.0.1:7777 on both nginx config and php-fpm.

We will continue working on a solution, and if found will be posted here. Thanks!

like image 476
Marc Avatar asked Sep 27 '14 01:09

Marc


People also ask

What is upstream timeout?

The upstream timeout error generally triggers when the upstream takes too much to answer the request and NGINX thinks the upstream already failed in processing the request. [ 0] proxy_read_timeout – Defines a timeout for reading a response from the proxied server. Default is 60 seconds.

What is NGINX default timeout?

The default timeout limit is 60 seconds for proxying requests from nginx to Apache.


1 Answers

try this

server {
    listen       80;
    server_name  *.domain_name.com ;

    #add this begin
    large_client_header_buffers 4 16k;
    client_max_body_size 300m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_buffer_size 64k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    #add this end
    ........................
}
like image 107
0xcodex Avatar answered Oct 06 '22 01:10

0xcodex