配置Apache为系统服务
安装Ubuntu系统管理软件
sudo apt install sysv-rc-conf
复制apache 启动文件到系统目录
cp /usr/local/apache2/bin/apachectl /etc/init.d/apache2
注册服务
sysv-rc-conf --level 2 apache2 on
酱紫就可以通过 service apache2 -k start/stop/restart 启动或者重启Apache服务
安装php5.6做下对比。
下载PHP5.6 编译安装。在此不做赘述。
-
修改httpd.conf
-
注释掉 LoadModule php7_module 否则会出现内存非法访问的错误。
先在Apache2.4.25+PHP5.6.30下测试
修改httpd.conf 加载php5_module。
重启Apache。
开始测试
使用命令
/usr/local/apache2/bin/ab -n10000 -c200 test.tt/index.php
上图说明有1%的请求超过800ms,可以认为连接超时。说明服务器不足以承载200个用户的10000个请求。
按照N是C的50倍,慢慢递减C跟N,C没减1,N减50.找到100%的请求在800ms内的临界值。
如下图,我的虚拟机的临界值是-n7350 -c147
使用httpd-mpm
打开httpd.conf找到 httpd-mpm.conf 注释掉前面的 # 号。
重启Apache,使用临界值测试一下
说明开启MPM是有效果的。
修改httpd-mpm.conf
此时的数量已经达到了156
到这里httpd-mpm已经达到最大的负载了。
Linux内核优化
-
Tcp的链接及断开过程中间是经过一系列状态变换的。有这些状态:
- 建立链接状态:LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED
- 关闭链接状态:FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT 和 CLOSED。
Linux系统下,TCP连接主动断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。
通过 ab 模拟1000个客户端发起200000个并发请求,然后统计linux tcp等待个数,
netstat -tnp awk | grep "{print $6}" | sort | uniq -c
如下图:
从上图图中可以看出,有24986个链接等待。
接下来我们优化一下TIMEWAIT,然后再统计。
vi /etc/sysctl.conf
添加如下配置:
命令行输入使配置生效
/sbin/sysctl -p
-
>
-
net.ipv4.tcp_syncookies = 1
开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
-
net.ipv4.tcp_tw_reuse = 1
开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
-
net.ipv4.tcp_tw_recycle = 1
开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
-
net.ipv4.tcp_fin_timeout = 30
修改系統默认的 TIMEOUT 时间
-
net.ipv4.tcp_keepalive_time = 1200
TCP发送keepalive消息的频度。默认为2小时,改小。tcp链接在空闲 1200秒之后,内核发起关闭链接probe
-
net.ipv4.tcp_keepalive_intvl = 30
查看系统默认timeout时间: # cat /proc/sys/net/ipv4/tcp_fin_timeout 默认为60秒。
- net.ipv4.tcp_keepalive_probes = 3 #如果probe 3次(每次30秒)不成功,内核才彻底放弃
-
net.ipv4.ip_local_port_range = 1024 65000
向外连接的端口范围。默认为32768到61000,范围改大
-
net.ipv4.tcp_max_syn_backlog = 2148
SYN队列的长度。默认为1024,改大
-
net.ipv4.tcp_max_tw_buckets = 5000
系统同时保持TIME_WAIT套接字的最大数量,超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000
-
net.core.netdev_max_backlog = 1000
进入包的最大设备队列,默认300,改大
-
net.core.somaxconn = 511
socket的监听队列backlog的上限,默认值为128
调整文件描述符限制
vi /etc/security/limits.conf
添加如上配置
重启系统。
重新通过 ab 模拟1000个客户端发起200000个并发请求,然后统计linux tcp等待TIMEWAIT个数
netstat -tnp | awk ‘{print $6}’ | sort | uniq -c
结果如下图:
TIMEWAIT个数明显减少了
现在试试500个并发,25000个请求
/usr/lical/apache2/bin/ab -n2500 -c500 test.tt/index.php
结果如下图: