title: Nginx + php-fpm: 504 timeout error - upstream timed out (110: Connection timed out)
body: <p>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.</p>
  
  <p>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:   </p>
  
  <ul>
  <li>From the same network, all coworkers (around 10) can access the web without problem, while there is one coworker that cannot (Error 504).</li>
  <li>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.</li>
  </ul>
  
  <p>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.</p>
  
  <p><strong>Note</strong>: this problem is repeated across the four virtual machines that we have set up.</p>
  
  <hr>
  
  <p><strong>Nginx error log (note: hostname and ip have been suppressed)</strong></p>
  
  <pre><code>2014/09/27 01:57:26 [error] 12686#0: *8 upstream timed out (110: Connection timed out) while reading response header from upstream, client: &lt;ip&gt;, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock", host: "&lt;hostname&gt;"
  2014/09/27 02:03:26 [error] 12718#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: &lt;ip&gt;, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock", host: "&lt;hostname&gt;"
  2014/09/27 02:05:29 [error] 12744#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: &lt;ip&gt;, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock", host: "&lt;hostname&gt;"
  </code></pre>
  
  <p><strong>File: /etc/nginx/nginx.conf</strong></p>
  
  <pre><code>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/*;
  }
  </code></pre>
  
  <p><strong>File: /etc/nginx/sites-available/default.conf</strong></p>
  
  <pre><code>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;
  }
  </code></pre>
  
  <p><strong>File: /etc/nginx/fastcgi_params</strong><br>
  <strong>Note</strong>: only the line <code>fastcgi_param  REQUEST_SCHEME     $scheme;</code> has been added.</p>
  
  <pre><code>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;
  </code></pre>
  
  <p><strong>File: /etc/php5/fpm/php-fpm.conf</strong></p>
  
  <pre><code>;;;;;;;;;;;;;;;;;;;;;
  ; 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
  </code></pre>
  
  <p><strong>File: /etc/php5/fpm/pool.d/www.conf</strong></p>
  
  <pre><code>;; 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
  </code></pre>
  
  <hr>
  
  <p><strong>What we have done so far (these configurations may not be reflected in the above files)</strong></p>
  
  <ul>
  <li>Set the Nginx and FPM user the same (www-data).</li>
  <li>Restart services and machines.</li>
  <li>Set <code>proxy_read_timeout</code> in the nginx configuration.</li>
  <li>Set <code>max_execution_time</code> and <code>request_terminate_timeout</code> to 300 (on php.ini and nginx.conf, respectively).</li>
  <li>Increase the number of <code>worker_process</code> and <code>worker_connections</code> on the nginx config.</li>
  <li>Change the value of <code>Listen</code> from /var/run/php5-fpm.sock to 127.0.0.1:7777 on both nginx config and php-fpm.</li>
  </ul>
  
  <p>We will continue working on a solution, and if found will be posted here. Thanks!</p>