Centos 7安装LNMP(PHP7.1)笔记及高并发优化

阿里云做活动,搞了一台服务器,一年200块,还是蛮便宜的,服务器系统选了Centos7.1, 应该是最新版的安装笔记了,记录一下安装LNMP的全过程,中间也遇到了一些问题,记录一下方便后面参考查找资料。 拿到服务器需要备案,遥遥无期的等待,正好先把服务器给安装一下

一键安装lnmp

服务器初始化安装

安装LNMP1.3稳定版

wget -c http://soft.vpser.net/lnmp/lnmp1.3-full.tar.gz && tar zxf lnmp1.3-full.tar.gz && cd lnmp1.3-full && ./install.sh lnmp

或者安装LNMP1.4测试版

wget -c http://soft.vpser.net/lnmp/lnmp1.4beta.tar.gz && tar zxf lnmp1.4beta.tar.gz && cd lnmp1.4 && ./install.sh lnmp

默认安装的是lnmp,可不写,如需要安装LNMPA或LAMP,将./install.sh 后面的参数替换为lnmpa或lamp即可。

具体安装地址查看这个lnmp安装文档地址

https://lnmp.org/install.html

Speedtest网络测速

默认拿到服务器的第一件事情就是网络测速,看看带宽是否足够

我们通过speedtest-cli来进行网络测速

wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest_cli.py
chmod +x speedtest-cli
./speedtest-cli

centos7下安装redis

Centos 7下安装redis,通过

yum install redis

安装以后运行有问题,不知道是不是阿里云的问题,也懒得去查具体原因,能成功的就直接这么用就好了

不能用的通过源码安装

redis下载地址 https://redis.io/download

wget http://download.redis.io/releases/redis-3.2.6.tar.gz

解压缩

tar xzf redis-3.2.6.tar.gz

进入解压后的文件目录

cd redis-3.2.6

redis安装的时候不需要configure,直接make编译即可

make

创建存储redis文件目录

mkdir -p /usr/local/redis

复制redis-server redis-cli到新建立的文件夹

cd src
cp ./redis-server /usr/local/redis/
cp ./redis-cli /usr/local/redis/

复制redis的配置文件

cd ..
cp redis.conf /usr/local/redis/

编辑配置文件

cd /usr/local/redis/
vim redis.conf

配置文件128行

deamonize yes #默认是no,改完yes表示后台守护进程运行

添加开机启动服务

vim /etc/systemd/system/redis-server.service

把下面的内容粘贴进去

[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target
[Service]
Type=simple
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/redis-server /usr/local/redis/redis.conf         
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
[Install]
WantedBy=multi-user.target

Centos 7开机启动设置有修改,需要用新命令

systemctl daemon-reload 
systemctl start redis-server.service 
systemctl enable redis-server.service

检查是否安装成功

ps -aux|grep redis

创建redis命令软连接

ln -s /usr/local/redis/redis-cli /usr/bin/redis

测试redis,命令行下输入redis

redis
set name akblog
get name

7ee697545a750a518784006d32e21784.jpg

Mysql配置优化

安装完mysql以后,发现数据不能插入

SQLSTATE[22003]: Numeric value out of range: 1264 Out of range value for column 'ip'

我用的是mysql 5.7,需改一下配置表

如果找不到my.cnf

查看mysql 配置文件的位置

mysqld --verbose --help|grep  my.cnf

通过vi编辑器打开,在my.cnf里面修改或者添加如下行

vim my.cnf

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

以下步骤用于维护和优化,不是必须的

修改密码

GRANT ALL PRIVILEGES ON *.* TO homestead@“127.0.0.1" IDENTIFIED BY ‘secret’ WITH GRANT OPTION;
FLUSH privileges;

数据去重样式,这个是去除 ADMD5重复的行

select SID,ADMD5 from spy where ADMD5 in (select  ADMD5 from spy group  by  ADMD5 having  count(ADMD5) > 1)
and SID not in (select min(`SID`) from  spy  group by ADMD5  having count(ADMD5 )>1)

mysql 调优,这个是调整并发连接数,一般设置同时并发3000也就够用了,不够就得加机器了,同样在my.cnf配置文件里面

max_connections = 3000

Apache调优

apache 调优,切换到lnmpa模式,当负载到一定阶段以后,需要对配置进行优化

直接贴配置了

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of connections a server process serves
#                         before terminating
<IfModule mpm_prefork_module>
    ServerLimit            1000  #服务连接数最大限制(不设置默认为256,对应MaxRequestWorkers的值)
    StartServers             20  #推荐设置:小=默认 中=20~50 大=50~100
    MinSpareServers          20  #推荐设置:与StartServers保持一致
    MaxSpareServers          50  #推荐设置:小=20 中=30~80 大=80~120
    MaxRequestWorkers      1000  #推荐设置:小=500 中=500~1500 大型=1500~3000
    MaxConnectionsPerChild  200  #推荐设置:小=500 中=500~1500 大型=1500~3000
</IfModule>

计算apache 平均内存占用

ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'

我们调优常常要查看httpd进程数(即prefork模式下Apache能够处理的并发请求数):

ps -ef | grep httpd | wc -l

出现的结果,就是当前Apache能够处理的多少个并发请求,这个值Apache根据负载情况自动调.

查看Apache的并发请求数及其TCP连接状态:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}'

返回结果示例:

LAST_ACK 5

SYN_RECV 30

ESTABLISHED 1597

FIN_WAIT1 51

FIN_WAIT2 504

TIME_WAIT 1057


其中的

SYN_RECV表示正在等待处理的请求数;

ESTABLISHED表示正常数据传输状态;

TIME_WAIT表示处理完毕,等待超时结束的请求数.

状态:描述


CLOSED:无连接是活动的或正在进行

LISTEN:服务器在等待进入呼叫

SYN_RECV:一个连接请求已经到达,等待确认

SYN_SENT:应用已经开始,打开一个连接

ESTABLISHED:正常数据传输状态

FIN_WAIT1:应用说它已经完成

FIN_WAIT2:另一边已同意释放

ITMED_WAIT:等待所有分组死掉

CLOSING:两边同时尝试关闭

TIME_WAIT:另一边已初始化一个释放

LAST_ACK:等待所有分组死掉

然后需要进行压力测试,以检测是否能够有效优化,如果没有ab测试工具,就通过yum安装一下

yum install httpd-tools

压力测试命令行如下

ab -n 50000 -c 500 http://ffkey.com

ab 测试系统修改

使用ab( apache benchmark )测试的时候,使用如下命令:

ab -n 15000 -c 200   http://localhost/abc/abc.php

执行操作一定条数,或连续执行该命令会出现如下问题:

apr_socket_recv: Connection timed out (110)

网上有说是资源描述符的问题,用

ulimit -n 65536

解决,试过不行。

查看系统日志:

dmesg

显示大量下面错误

nf_conntrack: table full, dropping packet.

通过google后,加入如下参数 // 需conntrack 模块

vi /etc/sysctl.conf
net.nf_conntrack_max = 655360
net.netfilter.nf_conntrack_tcp_timeout_established = 1200
sysctl -p /etc/sysctl.conf

修改后,重新启用apache ab 进行测试,问题解决。

Mencached安装调优

Mencached安装比较简单

 yum install memcached

调优直接修改配置

 

/etc/rc.d/init.d/memcached 连接数、内存修改

Nginx调优

如果使用nginx配置的时候,需要访问上层目录,没有设置的话会报错

open_basedir "/home/wwwroot/:/tmp/:/var/tmp/:/proc/"

在php.ini发现没有设置,需要在nginx里面进行设置

cd /usr/local/nginx/conf
grep -rn open_basedir .   #查找哪个配置文件设置了这个参数

最后发现在fastcgi.conf里面有这个文件

修改使上层路径也能访问

fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/../:$document_root/:/tmp/:/proc/";

当linux下Nginx达到并发数很高,TCP TIME_WAIT套接字数量经常达到两、三万,这样服务器很容易被拖死。事实上,我们可以简单的通过修改Linux内核参数,可以减少Nginx服务器 的TIME_WAIT套接字数量,进而提高Nginx服务器并发性能。

vi /etc/sysctl.conf

增加以下几行:

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024    65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

简单说明:


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 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改 为5000。

对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

#更改linux内核参数后,立即生效的命令!
/sbin/sysctl -p​
491
Sign in to leave a comment.
No Leanote account? Sign up now.
0 comments