对于高性能网站 ,请求量大,如何支撑?
1方面,要减少请求:
对于开发人员----合并打包css,js等静态资源文件, 背景图片,服务器gzip压缩,减少带宽, 减少mysql查询等。
像一些经常不会发生改变的资源像图片等,充分利用客户端缓存,nginx的expires,在过期时间内直接从本地缓存取。
如果有可能,一些静态资源文件走cdn,图片走图片服务器。
2在上面过滤一些请求后,最终是不可避免的落在了后端服务器上--->负载均衡--->服务器集群,使得请求尽可能均衡的落在每一台集群服务器上(思考如何更好的响应高并发请求,每台服务器的性能都被充分利用)
nginx 单机10000并发
nginx支持单机10000并发还是很轻松的,关键在于如果配置,
nginx响应请求
1:建立socket连接
2: 打开文件,并沿socket返回.
1.1: 首先把ab测试端的性能提高,使之能高并发的请求.
易出问题: too many open files
原因 : ab在压力测试时,打开的socket过多
解决: ulimit -n 30000 (重启失效)
观察结果: nginx 不需要特殊优化的情况下, 5000个连接,1秒内响应.
满足要求,但 wating状态的连接过多
1.2: 解决waiting进程过多的问题.
解决办法: keepalive_timeout = 0;
即: 请求结果后,不保留tcp连接.
在高并发的情况下, keepalive会占据大量的socket连接.
结果: waiting状态的连接明显减少.
1.3: 解决服务端 too many open files
分析: nginx要响应,
1是要建立socket连接,
2 是要读本地文件
这两个者限制
1: nginx接受的tcp连接多,能否建立起来?
2: nginx响应过程,要打开许多文件 ,能否打开?
系统内核层面:
net.core.somaxconn = 4096 允许等待中的监听
net.ipv4.tcp_tw_recycle = 1 tcp连接快速回收
net.ipv4.tcp_tw_reuse = 1 tcp连接重用
net.ipv4.tcp_syncookies = 0 不抵御洪水攻击
ulimit -n 30000
Nginx层面:
解决: nginx.conf 下面: work_connection 加大
worker_connections 10240;
Worker_rlimit_nofiles 10000;
Keepalive_timeout 0;
如上图,在很多个nginx来访问fpm时, fpm的进程要是不够用, 会生成子进程.生成子进程需要内核来调度,比较耗时,如果网站并发比较大, 我们可以用静态方式一次性生成若干子进程,保持在内存中
修改php-fpm.conf
Pm = static 让fpm进程始终保持,不要动态生成
Pm.max_children= 32 始终保持的子进程数量