Nginx + php-fpm:504 超时错误 - 上游超时(110:连接超时) [英] Nginx + php-fpm: 504 timeout error - upstream timed out (110: Connection timed out)

查看:81
本文介绍了Nginx + php-fpm:504 超时错误 - 上游超时(110:连接超时)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是我们第一次设置Nginx和PHP-FPM.一周前,我们使用 Apache 来提供网页服务,但我们决定尝试使用 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.

我们有一个运行 Ubuntu 14.04 LTS Trusty 的虚拟机.在其他实用程序中,机器正在运行带有 PHP-FPM 和 MySQL 的 Nginx,这是问题出现的时候:

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:

  • 在同一个网络中,所有同事(大约 10 个)都可以毫无问题地访问网络,而只有一个同事不能访问网络(错误 504).
  • 从外部,一些同事可以毫无问题地访问网络,而其他人则看到 504 错误.例如,在我的情况下,我可以通过我的家庭 WiFi 访问,但如果我使用手机的 3G,我就不能.有的同事遇到了相反的情况,他们可以通过3G访问但不能通过WiFi.其他人无法访问.

我们得出的结论是客户端可以连接到 Nginx,但是 Nginx 在将请求重定向到 FPM(可以通过端口 7777 访问)时没有收到响应并显示超时错误.我们一直专注于解决 Nginx 和 FPM 之间的通信问题,但几个小时后我们还没有找到解决方案.

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 错误日志(注:hostname 和 ip 已被抑制)

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>"

文件:/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/*;
}

文件:/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;
}

文件:/etc/nginx/fastcgi_params
注意:仅添加了 fastcgi_param REQUEST_SCHEME $scheme; 行.

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;

文件:/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

文件:/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

<小时>

到目前为止我们所做的(这些配置可能没有反映在上面的文件中)

  • 将 Nginx 和 FPM 用户设置为相同 (www-data).
  • 重启服务和机器.
  • 在 nginx 配置中设置 proxy_read_timeout.
  • max_execution_timerequest_terminate_timeout 设置为 300(分别在 php.ini 和 nginx.conf 上).
  • 在 nginx 配置上增加 worker_processworker_connections 的数量.
  • 在 nginx 配置和 php-fpm 上将 Listen 的值从/var/run/php5-fpm.sock 更改为 127.0.0.1:7777.
  • 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!

推荐答案

试试这个

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
    ........................
}

这篇关于Nginx + php-fpm:504 超时错误 - 上游超时(110:连接超时)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆