草庐IT

tcp - nginx php5-fpm 上游超时(110 : Connection timed out) while connecting to upstream

coder 2023-09-17 原文

我们有一个运行 nginx php5-fpm apc 设置的网络服务器。 但是,我们最近在页面呈现期间遇到了上游连接超时错误和速度减慢。快速重启 php5-fpm 解决了问题,但我们找不到原因。

我们有另一个网络服务器在另一个子域下运行 apache2,连接同一个数据库,做完全相同的工作。但是减速只发生在 nginx-fpm 服务器上。 我认为 php5-fpm 或 apc 可能会导致问题。

日志显示各种连接超时:

上游连接超时(110:连接超时)bla bla bla

php5-fpm 日志没有显示任何内容。只是 child 开始和结束:

Apr 07 22:37:27.562177 [NOTICE] [pool www] child 29122 started
Apr 07 22:41:47.962883 [NOTICE] [pool www] child 28346 exited with code 0 after 2132.076556 seconds from start
Apr 07 22:41:47.963408 [NOTICE] [pool www] child 29172 started
Apr 07 22:43:57.235164 [NOTICE] [pool www] child 28372 exited with code 0 after 2129.135717 seconds from start

发生错误时服务器未加载,平均负载仅为 2(2cpus 16 核),php5-fpm 进程似乎工作正常。

nginx 配置文件:

user www-data;
worker_processes 14;
pid /var/run/nginx.pid;
# set open fd limit to 30000
worker_rlimit_nofile 30000;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

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

        ##
        # Logging Settings
        ##

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

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # 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/x-javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

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

启用 nginx 的站点配置:

    location ~* \.php$ {
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass   backend;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
        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_intercept_errors        off;
        fastcgi_ignore_client_abort     off;
        fastcgi_connect_timeout 20;
        fastcgi_send_timeout 20;
        fastcgi_read_timeout 180;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

## Disable viewing .htaccess & .htpassword
    location ~ /\.ht {
        deny  all;
    }
}
upstream backend {
        server 127.0.0.1:9000;
}

fpm 配置文件:

pm.max_children = 500
pm.start_servers = 100
pm.min_spare_servers = 50
pm.max_spare_servers = 100
pm.max_requests = 10000

fpm conf文件中有紧急重启设置。 我不知道他们是否帮助我们解决了问题?

emergency_restart_interval = 0

最佳答案

首先,将 PHP-FPM max_requests 减少到 100;您希望 PHP 线程比 10000 个请求更快地重新启动。

其次,您只有一个 PHP 进程与许多子进程一起运行。这对开发来说很好,但在生产中,您希望拥有更多的 PHP 进程,每个进程都有更少的子进程,这样如果该进程由于任何原因而停止,还有其他进程可以填补空缺。因此,与其现在采用 1:50 的比例,不如选择 10:5 的比例。这将更稳定。

要实现这一点,您可能需要查看类似 supervisor 的内容管理您的 PHP 进程。我们在生产中使用它,它确实有助于增加我们的正常运行时间并减少我们花在管理/监控服务器上的时间。这是我们的配置示例:

/etc/php5/php-fpm.conf:

[global]
daemonize = no

[www]
listen = /tmp/php.socket

/etc/supervisor.d/php-fpm.conf:

[program:php]
user=root
command=/usr/sbin/php-fpm -c /etc/php5/php.ini -y /etc/php5/php-fpm.conf
numprocs=10
process_name=%(program_name)s

/etc/nginx/conf/php.backend:

upstream backend {
    server unix:/tmp/php.socket
}

编辑:

与所有服务器设置一样,不要依靠猜测来追踪您的问题所在。我建议安装 Munin 以及各种 PHP(-FPM) 和 Nginx 插件;这些将帮助您跟踪有关请求、响应时间、内存使用、磁盘访问、线程/进程级别的硬统计信息……在跟踪问题所在时这些都是必不可少的。

此外,正如我在下面的评论中提到的,将服务器端和客户端缓存添加到您的设置中,即使是适度的级别,也可以帮助为用户提供更好的体验,无论是使用 nginx 的原生缓存支持或更具体的东西,如 varnishd。即使是最动态的网站/应用程序也有许多静态元素,可以保存在内存中并更快地提供服务。从缓存中提供这些服务有助于减少总体负载,并确保那些绝对需要动态的元素在需要时拥有所需的所有资源。

关于tcp - nginx php5-fpm 上游超时(110 : Connection timed out) while connecting to upstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588297/

有关tcp - nginx php5-fpm 上游超时(110 : Connection timed out) while connecting to upstream的更多相关文章

  1. ruby-on-rails - connect() 到 unix :/var/run/unicorn. 连接到上游时 sock 失败(111:连接被拒绝) - 2

    我遵循ruby​​onrails一个应用程序点击部署。数据库做得很好,即使我检查Rails控制台一切正常017/02/2615:34:17[error]18564#0:*31connect()tounix:/var/run/unicorn.sockfailed(111:Connectionrefused)whileconnectingtoupstream,client:121.52.156.57,server:_,request:"GET/HTTP/1.1",upstream:"http://unix:/var/run/unicorn.sock:/",host:"188.166.157

  2. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

  3. ruby - yarn 未初始化常量 Socket::SOL_TCP - 2

    我在这里尝试使用yarn,遇到了一个可能与ruby​​相关的问题。在执行任何yarn命令,我收到错误.../.rvm/gems/ruby-2.3.0/gems/yarn-0.1.1/lib/yarn/server.rb:14:in':uninitializedconstantSocket::SOL_TCP(NameError)错误堆栈:$yarn.../.rvm/gems/ruby-2.3.0/gems/yarn-0.1.1/lib/yarn/server.rb:14:in':uninitializedconstantSocket::SOL_TCP(NameError)Didyoume

  4. ruby - 你如何使用 Ruby 找到空闲的 TCP 服务器端口? - 2

    我正在尝试创建一个使用一次的HTTP服务器来处理单个回调,并且需要帮助在Ruby中找到一个空闲的TCP端口。这是我正在做的事情的框架:require'socket't=STDIN.readport=8081whiles=TCPServer.new('127.0.0.1',port).acceptputss.getss.print"HTTP/1.1200/OK\rContent-type:text/plain\r\n\r\n"+ts.closeexitend(它回显标准输入到第一个连接然后死掉。)如何自动找到空闲端口进行监听?这似乎是在远程服务器上启Action业然后使用唯一作业ID回调

  5. ruby-on-rails - 服务器是否在主机 "localhost"(::1) 上运行并在端口 5432 上接受 TCP/IP 连接? - 2

    首先请注意,我在StackOverflow和网络上的文章中发现了几个类似的问题,但没有一个能帮助我解决我的问题:PGErrorcouldnotconnecttoserver:ConnectionrefusedIstheserverrunningonport5432?PG::ConnectionBad-couldnotconnecttoserver:Connectionrefusedpsql:couldnotconnecttoserver:Connectionrefused问题来了:我有一个非常棒的Rails应用程序。我和我的合作者使用GitHub一起工作。我们有一个master和一个m

  6. 【操作系统】十分钟了解关于TCP/IP网络的基础知识(二)ARP、路由器、DHCP、DNS以及TCP/IP - 2

    承接上篇文章(十分钟了解关于TCP/IP网络的基础知识)五.ARP(地址解析协议)        虽说使用IP地址确实方便了我们使用者记忆以及整理归类、寻找信息的发送目的地,但是最终接收数据的地方,还是MAC地址,于是乎,为了实现有IP地址到MAC地址的转换,引入了名为ARP(AddressResolutionProtocol)又称之为地址解析协议。      ARP通过广播(Broadcast,这是个专业名词,后面还会继续提起)的方式对LAN中所有的计算机提问:“哎,谁IP地址是10.165.7.116(上篇文章中的例子)呀?你MAC地址多少啊,快过来登记一下!”,如果有哪台计算机回复了MA

  7. ruby - TCP 服务器错误 : Address already in use - bind(2) - 2

    几周前Jekyll对我来说工作正常,但现在突然出现以下错误:TCPServerError:Addressalreadyinuse-bind(2)INFOWEBrick::HTTPServer#start:pid=7300port=4000%lsof-i:4000即使端口上没有任何运行。以下是详细信息:%jekyll--versionJekyll0.11.2%wherejekyll/home/bhaarat/.rvm/gems/ruby-1.9.2-p290/bin/jekyll/usr/bin/jekyll%ruby--versionruby1.9.2p290(2011-07-09re

  8. javascript - 有没有办法用 javascript 建立到 IP 的 tcp 连接? - 2

    让我介绍一下我正在努力完成的事情的背景。我有一个具有本地IP地址的设备(芯片和pin终端),它已被编程为接收特定数据并处理它。示例:我发送十六进制格式的字符串"05""3035",终端读取它并重新启动。我试过使用SockJS-Client以及内置的WebSockets.但是使用Websockets我注意到浏览器正在发送:GET/HTTP/1.1Host:IP:PORTConnection:UpgradePragma:no-cacheCache-Control:no-cacheUpgrade:websocketOrigin:MYIPSec-WebSocket-Version:13User

  9. SpringBoot+Netty实现TCP客户端实现接收数据按照16进制解析并存储到Mysql以及Netty断线重连检测与自动重连 - 2

    场景在SpringBoot项目中需要对接三方系统,对接协议是TCP,需实现一个TCP客户端接收服务端发送的数据并按照16进制进行解析数据,然后对数据进行过滤,将指定类型的数据通过mybatis存储进mysql数据库中。并且当tcp服务端断连时,tcp客户端能定时检测并发起重连。全流程效果 注:博客:霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主实现1、SpringBoot+Netty实现TCP客户端本篇参考如下博客,在如下博客基础上进行修改Springboot+Netty搭建基于TCP协议的客户端(二):https://www.cnblogs.com/haolb

  10. TCP 中 Flags 标志位 ACK、SYN 与 seq、ack - 2

    单独存在时ACK(Acknowledgment):向对方确认它已成功接收。当ACK=1时,确认号字段才有效。SYN(Synchronization):用于发起和建立连接,连接建立后无用。FIN(Finish):当FIN=1时,表明数据已经发送完毕,要求释放连接。seq(SequenceNumber):占4字节。首先,在传输过程的每一个字节都会有一个编号。在建立连接后,序号代表:这一次传给对方的TCP数据部分的第一个字节的编号。ack(AcknowledgmentNumber):占4字节。在建立连接后,确认号代表:期望对方下一次传过来的TCP数据部分的第一个字节的编号。组合时SYN=1、ACK=

随机推荐