阿里云做活动,搞了一台服务器,一年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
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
No Leanote account? Sign up now.