如何优化高流量站点的nginx php和php-fpm的几个方面

如何优化高流量站点的nginx和php-fpm的几个方面_百度知道
如何优化高流量站点的nginx和php-fpm的几个方面
我有更好的答案
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)高流量站点NGINX与PHP-fpm配置优化(译)
发表于 日 00:00 | Hits: 2759
使用Nginx搭配PHP已有7年的这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置。
以下正是这方面的一些提示和建议:
1. 将TCP切换为UNIX域套接字
UNIX域套接字相比TCP套接字在loopback接口上能提供更好的性能(更少的数据拷贝和上下文切换)。
但有一点需要牢记:仅运行在同一台服务器上的程序可以访问UNIX域套接字(显然没有网络支持)。
upstream backend
# UNIX domain sockets
server unix:/var/run/fastcgi.
# TCP sockets
# server 127.0.0.1:8080;
2. 调整工作进程数
现代计算机硬件是多处理器的,NGINX可以利用多物理或虚拟处理器。
多数情况下,你的Web服务器都不会配置为处理多种任务(比如作为Web服务器提供服务的同时也是一个打印服务器),你可以配置NGINX使用所有可用的处理器,NGINX工作进程并不是多线程的。
运行以下命令可以获知你的机器有多少个处理器:
cat /proc/cpuinfo | grep processor
FreeBSD上 -
sysctl dev .cpu | grep location
将nginx.conf文件中work_processes的值设置为机器的处理器核数。
同时,增大worker_connections(每个处理器核心可以处理多少个连接)的值,以及将&multi_accept&设置为ON,如果你使用的是Linux,则也使用&epoll&:
# We have 16 cores
worker_processes 16;
# connections per worker
worker_connections 4096;
3. 设置upstream负载均衡
以我们的经验来看,同一台机器上多个upstream后端相比单个upstream后端能够带来更高的吞吐量。
例如,如果你想支持最大1000个PHP-fpm子进程(children),可以将该数字平均分配到两个upstream后端,各自处理500个PHP-fpm子进程:
upstream backend {
server unix:/var/run/php5-fpm.sock1 weight=100 max_fails=5 fail_timeout=5;
server unix:/var/run/php5-fpm.sock2 weight=100 max_fails=5 fail_timeout=5;
以下是两个来自php-fpm.conf的进程池:
&section name=&pool&&
&value name=&name&&www1&/value&
&value name=&listen_address&&/var/run/php5-fpm.sock1&/value&
&value name=&listen_options&&
&value name=&backlog&&-1&/value&
&value name=&owner&&&/value&
&value name=&group&&&/value&
&value name=&mode&&0666&/value&
&value name=&user&&www&/value&
&value name=&group&&www&/value&
&value name=&pm&&
&value name=&style&&static&/value&
&value name=&max_children&&500&/value&
&value name=&rlimit_files&&50000&/value&
&value name=&rlimit_core&&0&/value&
&value name=&request_slowlog_timeout&&20s&/value&
&value name=&slowlog&&/var/log/php-slow.log&/value&
&value name=&chroot&&&/value&
&value name=&chdir&&&/value&
&value name=&catch_workers_output&&no&/value&
&value name=&max_requests&&5000&/value&
&value name=&allowed_clients&&127.0.0.1&/value&
&value name=&environment&&
&value name=&HOSTNAME&&$HOSTNAME&/value&
&value name=&PATH&&/usr/local/bin:/usr/bin:/bin&/value&
&value name=&TMP&&/usr/tmp&/value&
&value name=&TMPDIR&&/usr/tmp&/value&
&value name=&TEMP&&/usr/tmp&/value&
&value name=&OSTYPE&&$OSTYPE&/value&
&value name=&MACHTYPE&&$MACHTYPE&/value&
&value name=&MALLOC_CHECK_&&2&/value&
&/section&
&section name=&pool&&
&value name=&name&&www2&/value&
&value name=&listen_address&&/var/run/php5-fpm.sock2&/value&
&value name=&listen_options&&
&value name=&backlog&&-1&/value&
&value name=&owner&&&/value&
&value name=&group&&&/value&
&value name=&mode&&0666&/value&
&value name=&user&&www&/value&
&value name=&group&&www&/value&
&value name=&pm&&
&value name=&style&&static&/value&
&value name=&max_children&&500&/value&
&value name=&rlimit_files&&50000&/value&
&value name=&rlimit_core&&0&/value&
&value name=&request_slowlog_timeout&&20s&/value&
&value name=&slowlog&&/var/log/php-slow.log&/value&
&value name=&chroot&&&/value&
&value name=&chdir&&&/value&
&value name=&catch_workers_output&&no&/value&
&value name=&max_requests&&5000&/value&
&value name=&allowed_clients&&127.0.0.1&/value&
&value name=&environment&&
&value name=&HOSTNAME&&$HOSTNAME&/value&
&value name=&PATH&&/usr/local/bin:/usr/bin:/bin&/value&
&value name=&TMP&&/usr/tmp&/value&
&value name=&TMPDIR&&/usr/tmp&/value&
&value name=&TEMP&&/usr/tmp&/value&
&value name=&OSTYPE&&$OSTYPE&/value&
&value name=&MACHTYPE&&$MACHTYPE&/value&
&value name=&MALLOC_CHECK_&&2&/value&
&/section&
4. 禁用访问日志文件
这一点影响较大,因为高流量站点上的日志文件涉及大量必须在所有线程之间同步的IO操作。
error_log /var/log/nginx-error.
若你不能关闭访问日志文件,至少应该使用缓冲:
access_log /var/log/nginx/access.log main buffer=16k;
5. 启用GZip
gzip_disable &msie6&;
gzip_comp_level 6;
gzip_min_length 1100;
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/
6. 缓存被频繁访问的文件相关的信息
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_
7. 调整客户端超时时间
client_max_body_size 500M;
client_body_buffer_size 1m;
client_body_timeout 15;
client_header_timeout 15;
keepalive_timeout 2 2;
send_timeout 15;
8. 调整输出缓冲区大小
fastcgi_buffers 256 16k;
fastcgi_buffer_size 128k;
fastcgi_connect_timeout 3s;
fastcgi_send_timeout 120s;
fastcgi_read_timeout 120s;
reset_timedout_
server_names_hash_bucket_size 100;
9. /etc/sysctl.conf调优
# Recycle Zombie connections
net.inet.tcp.fast_finwait2_recycle=1
net.inet.tcp.maxtcptw=200000
# Increase number of files
kern.maxfiles=65535
kern.maxfilesperproc=16384
# Increase page share factor per process
vm.pmap.pv_entry_max=
vm.pmap.shpgperproc=20000
# Increase number of connections
vfs.vmiodirenable=1
kern.ipc.somaxconn=3240000
net.inet.tcp.rfc1323=1
net.inet.tcp.delayed_ack=0
net.inet.tcp.restrict_rst=1
kern.ipc.maxsockbuf=2097152
kern.ipc.shmmax=
# Host cache
net.inet.tcp.hostcache.hashsize=4096
net.inet.tcp.hostcache.cachelimit=131072
net.inet.tcp.hostcache.bucketlimit=120
# Increase number of ports
net.inet.ip.portrange.first=2000
net.inet.ip.portrange.last=100000
net.inet.ip.portrange.hifirst=2000
net.inet.ip.portrange.hilast=100000
kern.ipc.semvmx=131068
# Disable Ping-flood attacks
net.inet.tcp.msl=2000
net.inet.icmp.bmcastecho=1
net.inet.icmp.icmplim=1
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
持续监控打开连接的数目,空闲内存以及等待状态线程的数目。
设置警报在超出阈值时通知你。你可以自己构建这些警报,或者使用类似的东西。
确认安装了NGINX的模块。该模块默认并不会编译进NGINX,所以可能你需要重新编译NGINX -
./configure --with-http_ssl_module --with-http_stub_status_module --without-mail_pop3_module
--without-mail_imap_module --without-mail_smtp_module
make install BATCH=yes
评价列表(0)高流量站点NGINX与PHP-fpm配置优化(译)
时间: 18:00:13
&&&& 阅读:163
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&使用Nginx搭配PHP已有7年的这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置。
以下正是这方面的一些提示和建议:
1. 将TCP切换为UNIX域套接字
UNIX域套接字相比TCP套接字在loopback接口上能提供更好的性能(更少的数据拷贝和上下文切换)。
但有一点需要牢记:仅运行在同一台服务器上的程序可以访问UNIX域套接字(显然没有网络支持)。
upstream backend
# UNIX domain sockets
server unix:/var/run/fastcgi.
# TCP sockets
# server 127.0.0.1:8080;
2. 调整工作进程数
现代计算机硬件是多处理器的,NGINX可以利用多物理或虚拟处理器。
多数情况下,你的Web服务器都不会配置为处理多种任务(比如作为Web服务器提供服务的同时也是一个打印服务器),你可以配置NGINX使用所有可用的处理器,NGINX工作进程并不是多线程的。
运行以下命令可以获知你的机器有多少个处理器:
cat /proc/cpuinfo | grep processor
FreeBSD上 -
sysctl dev .cpu | grep location
将nginx.conf文件中work_processes的值设置为机器的处理器核数。
同时,增大worker_connections(每个处理器核心可以处理多少个连接)的值,以及将"multi_accept"设置为ON,如果你使用的是Linux,则也使用"epoll":
# We have 16 cores
worker_processes 16;
# connections per worker
worker_connections 4096;
3. 设置upstream负载均衡
以我们的经验来看,同一台机器上多个upstream后端相比单个upstream后端能够带来更高的吞吐量。
例如,如果你想支持最大1000个PHP-fpm子进程(children),可以将该数字平均分配到两个upstream后端,各自处理500个PHP-fpm子进程:
upstream backend {
server unix:/var/run/php5-fpm.sock1 weight=100 max_fails=5 fail_timeout=5;
server unix:/var/run/php5-fpm.sock2 weight=100 max_fails=5 fail_timeout=5;
以下是两个来自php-fpm.conf的进程池:
&section name="pool"&
&value name="name"&www1&/value&
&value name="listen_address"&/var/run/php5-fpm.sock1&/value&
&value name="listen_options"&
&value name="backlog"&-1&/value&
&value name="owner"&&/value&
&value name="group"&&/value&
&value name="mode"&0666&/value&
&value name="user"&www&/value&
&value name="group"&www&/value&
&value name="pm"&
&value name="style"&static&/value&
&value name="max_children"&500&/value&
&value name="rlimit_files"&50000&/value&
&value name="rlimit_core"&0&/value&
&value name="request_slowlog_timeout"&20s&/value&
&value name="slowlog"&/var/log/php-slow.log&/value&
&value name="chroot"&&/value&
&value name="chdir"&&/value&
&value name="catch_workers_output"&no&/value&
&value name="max_requests"&5000&/value&
&value name="allowed_clients"&127.0.0.1&/value&
&value name="environment"&
&value name="HOSTNAME"&$HOSTNAME&/value&
&value name="PATH"&/usr/local/bin:/usr/bin:/bin&/value&
&value name="TMP"&/usr/tmp&/value&
&value name="TMPDIR"&/usr/tmp&/value&
&value name="TEMP"&/usr/tmp&/value&
&value name="OSTYPE"&$OSTYPE&/value&
&value name="MACHTYPE"&$MACHTYPE&/value&
&value name="MALLOC_CHECK_"&2&/value&
&/section&
&section name="pool"&
&value name="name"&www2&/value&
&value name="listen_address"&/var/run/php5-fpm.sock2&/value&
&value name="listen_options"&
&value name="backlog"&-1&/value&
&value name="owner"&&/value&
&value name="group"&&/value&
&value name="mode"&0666&/value&
&value name="user"&www&/value&
&value name="group"&www&/value&
&value name="pm"&
&value name="style"&static&/value&
&value name="max_children"&500&/value&
&value name="rlimit_files"&50000&/value&
&value name="rlimit_core"&0&/value&
&value name="request_slowlog_timeout"&20s&/value&
&value name="slowlog"&/var/log/php-slow.log&/value&
&value name="chroot"&&/value&
&value name="chdir"&&/value&
&value name="catch_workers_output"&no&/value&
&value name="max_requests"&5000&/value&
&value name="allowed_clients"&127.0.0.1&/value&
&value name="environment"&
&value name="HOSTNAME"&$HOSTNAME&/value&
&value name="PATH"&/usr/local/bin:/usr/bin:/bin&/value&
&value name="TMP"&/usr/tmp&/value&
&value name="TMPDIR"&/usr/tmp&/value&
&value name="TEMP"&/usr/tmp&/value&
&value name="OSTYPE"&$OSTYPE&/value&
&value name="MACHTYPE"&$MACHTYPE&/value&
&value name="MALLOC_CHECK_"&2&/value&
&/section&
4. 禁用访问日志文件
这一点影响较大,因为高流量站点上的日志文件涉及大量必须在所有线程之间同步的IO操作。
error_log /var/log/nginx-error.
若你不能关闭访问日志文件,至少应该使用缓冲:
access_log /var/log/nginx/access.log main buffer=16k;
5. 启用GZip
gzip_disable "msie6";
gzip_comp_level 6;
gzip_min_length 1100;
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/
6. 缓存被频繁访问的文件相关的信息
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_
7. 调整客户端超时时间
client_max_body_size 500M;
client_body_buffer_size 1m;
client_body_timeout 15;
client_header_timeout 15;
keepalive_timeout 2 2;
send_timeout 15;
8. 调整输出缓冲区大小
fastcgi_buffers 256 16k;
fastcgi_buffer_size 128k;
fastcgi_connect_timeout 3s;
fastcgi_send_timeout 120s;
fastcgi_read_timeout 120s;
reset_timedout_
server_names_hash_bucket_size 100;
9. /etc/sysctl.conf调优
# Recycle Zombie connections
net.inet.tcp.fast_finwait2_recycle=1
net.inet.tcp.maxtcptw=200000
# Increase number of files
kern.maxfiles=65535
kern.maxfilesperproc=16384
# Increase page share factor per process
vm.pmap.pv_entry_max=
vm.pmap.shpgperproc=20000
# Increase number of connections
vfs.vmiodirenable=1
kern.ipc.somaxconn=3240000
net.inet.tcp.rfc1323=1
net.inet.tcp.delayed_ack=0
net.inet.tcp.restrict_rst=1
kern.ipc.maxsockbuf=2097152
kern.ipc.shmmax=
# Host cache
net.inet.tcp.hostcache.hashsize=4096
net.inet.tcp.hostcache.cachelimit=131072
net.inet.tcp.hostcache.bucketlimit=120
# Increase number of ports
net.inet.ip.portrange.first=2000
net.inet.ip.portrange.last=100000
net.inet.ip.portrange.hifirst=2000
net.inet.ip.portrange.hilast=100000
kern.ipc.semvmx=131068
# Disable Ping-flood attacks
net.inet.tcp.msl=2000
net.inet.icmp.bmcastecho=1
net.inet.icmp.icmplim=1
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
持续监控打开连接的数目,空闲内存以及等待状态线程的数目。
设置警报在超出阈值时通知你。你可以自己构建这些警报,或者使用类似的东西。
确认安装了NGINX的模块。该模块默认并不会编译进NGINX,所以可能你需要重新编译NGINX -
./configure --with-http_ssl_module --with-http_stub_status_module --without-mail_pop3_module
--without-mail_imap_module --without-mail_smtp_module
make install BATCH=yes
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://www.cnblogs.com/goody9807/p/4676180.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!Nginx+php-fpm无法支撑大流量的并发访问?
11:08:57 +08:00 · 10333 次点击
统计服务器,无法支撑大流量的并发访问,导致php统计程序无法运行。现在加大pm.max_children可以访问一会,但是php-fpm进程会越来越多,直到内存耗尽。求解决思路。Nginx错误日志connect() failed (110: Connection timed out) while connecting to upstreamphp-fpm日志[05-Jul-:14] NOTICE: [pool www] child 1389 exited with code 0 after
seconds from start[05-Jul-:14] NOTICE: [pool www] child 1778 started[05-Jul-:53] NOTICE: [pool www] child 1382 exited with code 0 after
seconds from start[05-Jul-:53] NOTICE: [pool www] child 1779 started[05-Jul-:33] NOTICE: [pool www] child 1394 exited with code 0 after
seconds from start[05-Jul-:33] NOTICE: [pool www] child 1794 started[05-Jul-:55] NOTICE: [pool www] child 1391 exited with code 0 after
seconds from start[05-Jul-:55] NOTICE: [pool www] child 1799 started[05-Jul-:17] NOTICE: [pool www] child 1372 exited with code 0 after
seconds from start[05-Jul-:17] NOTICE: [pool www] child 1815 started
25 回复 &| &直到
10:37:25 +08:00
& & 11:10:56 +08:00
多少个并发啊
& & 11:17:15 +08:00
我也遇到这个问题,以前55个并发,耗尽1G内存。
& & 11:20:44 +08:00
你这是多大规模啊
& & 11:23:39 +08:00
做负载均衡吧
& & 11:45:13 +08:00
Nginx+php-fpm支撑不起的时候, apache+php也差不多了。
换大内存服务器。改变策略,增加服务器做负载均衡。
& & 11:47:34 +08:00
55 个并发太少了吧。
是不是达到带宽上限了?也就是瓶颈不在PHP这,而是在带宽?
& & 12:00:38 +08:00
无法运行的原因是什么?内存不够?进程死循环??在没有更多服务器现场数据的情况下,现在只能怀疑是你的程序有问题。
FPM只是一个跑php的载体,如果你的程序有问题,再调整FPM也是没用的。
所以strace一个进程,先看看程序到底在做什么吧
& & 12:17:35 +08:00
一味调大进程数最终只会导致整体性能下降
优化程序,请求处理越快越好。
找到瓶颈,如果瓶颈在php本身,那么考虑其它的高并发方案,比如用node.js 或者 golang重写。
如果一台机器达到上限,那就增加机器分流。
ps. 统计这玩意我都是node.js做的,直接写文件,然后后台脚本定时处理日志文件。
& & 12:21:51 +08:00
不是吧...这年头还有php-fpm把内存耗尽的...不过没关系...如果可以,做负载均衡把。没条件,把一些可以缓存的东西,先在客户端缓存起来...把一些耗时耗力的部分用纯php改写..还不行,上hidhop...杂七杂八的各种优化方法...
php-fpm进程数最好是根据内存和cpu来设置的..
& & 12:30:09 +08:00
进程越来越多说明你的php程序太慢,处理不过来。fpm也好apache也好,对慢代码都只有开进程。
& & 12:45:33 +08:00
统计服务器 就不要挂php好了,直接/dev/null 然后做 offline 分析
& & 13:05:45 +08:00
1G内存玩什么高并发
& & 14:01:42 +08:00
『统计服务器,无法支撑大流量的并发访问,导致php统计程序无法运行。』
这句最重要的描述却一笔带过,什么叫『无法支撑』和『无法运行』?
『现在加大pm.max_children可以访问一会』
然后走向了一条错误的道路。
& & 14:04:59 +08:00
低内存最好限制一下php-fpm的进程数量
& & 18:11:22 +08:00
我这样尝试的:
1.限制php-fpm进程数量
结果:connect() failed (110: Connection timed out) while connecting to upstream
2.我增加pm.max_children
结果:php-fpm进程不断增加,直到内存没有。
总是网站无法正常访问。
还是不知道如何解决。
& & 19:52:50 +08:00
别用lnmp用lanmp,php用apache来跑,这是cgi的通病。大压力下,掉包率很离谱
& & 19:53:38 +08:00
这就是所谓的nginx高并发下502的原因。。
& & 00:27:48 +08:00
55个并发不至于就给跑死了吧。
APC/eAccelerater/XCache之一装了没?
XDEBUG装了没?看看性能热点是在什么地方。
如果热点是数据库,数据库slowlog看了没,查询都走索引了吗,用memcache/redis做缓存了吗?
& & 00:31:02 +08:00
pm= static or dynamic ?
& & 13:03:51 +08:00
统计的任务要作队列,用户提交统计任务=&丢队列,返回让用户等着去,后面统计程序从队列领任务去跑,跑完返回结果。
统计这种要实时返回,数据量大/算法复杂,都不现实。
& & 17:22:49 +08:00
你的这种情况, 我最近也遇到, fpm没有可用进程, 不断启用新的进程, 但是新进行往往都没有提供服务. 最后到达最大子进程数, 而能够正常服务的进程又到达访问次数上限, 最后所有fpm下挂载的进程都不可用.
结果就是 nginx 连不上 fpm, fpm挂着一堆不可用的进程.
不过我还没定位到故障原因, 临时解决方案就是重启fpm
& & 19:37:06 +08:00
我以前在一台VPS上试跑过统计服务。nginx+php-fpm大概可以承受150req/s。
后来改用离线处理法,把nginx的access log写入文件里,用cron每分钟mv + kill -USR + 分析日志文件后更新memcache里的数据,然后nginx直接relay到memcache里取数据返回。
这种架构可以轻松撑起500req+/s的访问。
双核256M内存VPS实测。
& & 19:50:02 +08:00
@ 你描述的很清晰,我们遇到了一样的问题。目前我也没有解决,但是会一一尝试大家都建议。
& & 20:18:00 +08:00
@ 我看大伙的说法都是觉得phpfpm服务能力达不到当前并发的水平.
但是我感觉问题的关键并不是php业务的性能问题. 因为发生问题的时间都在深夜流量低谷, 而不是流量高峰.
& & 10:37:25 +08:00
目前也遇到这种情况,strace 进程 一直超时
& · & 568 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 · 60ms · UTC 22:29 · PVG 06:29 · LAX 14:29 · JFK 17:29? Do have faith in what you're doing.

我要回帖

更多关于 nginx配置多个php站点 的文章

 

随机推荐