2018年8月10日更新为lnmp1.5
2020年3月10日更新为lnmp1.6
2021年4月5日更新为lnmp1.7 for centos 7.2
2023年4月2日更新为lnmp2.0 for centos 7.6
2024年2月6日更新为lnmp2.0 for centos 7.6
—————————
1\服务器操作系统基本配置
—————————
ssh登录上服务器:
基本的加强linux服务器安全的措施:修改ssh端口禁用root账户密码登录,限制使用密匙登录->>>参照https://xiaohost.com/2414.html
基本环境及工具
1 2 3 4 5 | yum install wget screen -y && screen -S lnmp sudo yum check-update || sudo yum update -y yum groupinstall -y 'Development Tools' yum install -y epel-release yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel |
—————————
2\
准备lnmp
—————————
1 | cd / && mkdir codefiles && cd codefiles |
1 | wget http://soft.vpser.net/lnmp/lnmp2.0.tar.gz -cO lnmp2.0.tar.gz && tar zxf lnmp2.0.tar.gz && cd lnmp2.0 |
准备工作:下载ngx_cache_purge-2.3.tar.gz解压后放入lnmp2.0目录内(当前目录)
1 | cd src && wget https://publicfilesforkk-1251162478.cos.ap-chongqing.myqcloud.com/ngx_cache_purge-2.3.tar.gz && tar zxvf ngx_cache_purge-2.3.tar.gz && rm -rf ngx_cache_purge-2.3.tar.gz && cd .. |
修改lnmp根目录下(一键包解压后的lnmp1.x目录下)的lnmp.conf文件,将需要安装的模块加入Nginx_Modules_Arguments=””
另外,为了以后需要增加前端做反代的时候扩展,启用Nginx自带的Module ngx_http_realip_module
1 | vi lnmp.conf |
修改配置文件
为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Download_Mirror='https://soft.lnmp.com' Nginx_Modules_Options='--add-module=/codefiles/lnmp2.0/src/ngx_cache_purge-2.3' PHP_Modules_Options='' ##MySQL/MariaDB database directory## MySQL_Data_Dir='/usr/local/mysql/var' MariaDB_Data_Dir='/usr/local/mariadb/var' ##Default website home directory## Default_Website_Dir='/home/wwwroot/default' Enable_Nginx_Openssl='y' #允许在 Nginx 中嵌入和执行 Lua 脚本 Enable_Nginx_Lua='y' Enable_Ngx_FancyIndex='n' Enable_Swap='y' Enable_PHP_Exif='n' #用于检测文件类型和 MIME 类型的 PHP 模块 Enable_PHP_Fileinfo='y' Enable_PHP_Ldap='n' #处理 bzip2 格式的压缩文件,bzip2 是一种广泛使用的数据压缩算法,其压缩率通常比 Gzip 更高,但计算密集度也相对更大一些 Enable_PHP_Bz2='y' #Sodium 扩展提供了丰富的加密、解密、签名和验证等函数,为 PHP 开发者带来了强大的加密和解密功能 Enable_PHP_Sodium='y' Enable_PHP_Imap='n' |
———————–
安装lnmp
启动安装脚本
1 | ./install.sh lnmp |
选择需要安装的数据库,输入数据库root账户密码
选择要安装的php版本
然后……….等着安装完成
—————————
3\安装网站需要用到的其他软件
—————————
先删除之前安装lnmp不需要保留的东西
1 | rm -rf /codefiles/lnmp2.0.tar.gz && rm -rf /codefiles/lnmp2.0/src/ngx_cache_purge-2.3.tar.gz |
安装mercached
1 | cd /codefiles/lnmp2.0/ && ./addons.sh |
wordpress 的mercached插件下载地址:
https://github.com/tollmanz/wordpress-pecl-memcached-object-cache
下载并解压得到的 object-cache.php,上传到 wp-content 目录即可开启 memcached 缓存。
注意:
在wp-config.php中增加配置
1、memcached在本机
1 2 3 4 5 6 7 | global $memcached_servers; $memcached_servers = array( array( '127.0.0.1', // Memcached server IP address 11211 // Memcached server port ) ); |
2、memcached在不同的服务器(需要修改ip地址和端口,注意远程服务器的防火墙问题)
1 2 3 4 5 6 7 8 9 10 11 | global $memcached_servers; $memcached_servers = array( array( '1.2.3.4', 11211 ), array( '1.2.3.5', 11211 ) ); |
上述下载地址失效的话,可以在这里下载wordpress-pecl-memcached-object-cache-master
mercached官方探针下载:
http://pecl.php.net/get/memcache-3.0.8.tgz
解压后,里面有一个 memcache.php 文件,编辑并找到如下代码:
1 2 3 4 5 6 7 8 | define('ADMIN_USERNAME','memcache'); // Admin Username define('ADMIN_PASSWORD','password'); // Admin Password define('DATE_FORMAT','Y/m/d H:i:s'); define('GRAPH_SIZE',200); define('MAX_ITEM_DUMP',50); $MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array $MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array |
修改为:
1 2 3 4 5 6 7 8 | define('ADMIN_USERNAME','memcache'); // Admin Username 登录名称,自行修改 define('ADMIN_PASSWORD','password'); // Admin Password 登录密码,自行修改 define('DATE_FORMAT','Y/m/d H:i:s'); define('GRAPH_SIZE',200); define('MAX_ITEM_DUMP',50); //下面是定义memcached服务器,一般我们是单机部署,所以注释掉一行,并将服务器地址根据实际修改,比如本文是127.0.0.1 $MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array //$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array |
上传到网站私密目录(临时测试可以放到根目录),然后通过前台访问 memcache.php 这个文件,输入上面的用户名和密码即可看到 memcached 状态:
如果发现页面可以打开,但是里面没有 Hits 数据,说明 WordPress 并没有成功连接到 memcached,这时候我们可以在 wp-config.php 加入如下参数:
1 2 3 4 5 6 7 | global $memcached_servers; $memcached_servers = array( array( '127.0.0.1', // Memcached server IP address 11211 // Memcached server port ) ); |
实际的 memcached 监听 IP 和端口,通过命令查看
1 | netstat -nutlp | grep memcache |
启用opcache优化php执行(lnmp已经有,但未启用,使用下面命令启用即可)
1 | ./addons.sh install opcache |
重要:
添加泛域名SSL
要支持泛域名,必须用DNS解析验证方式去申请
要用的各家DNS验证API详见https://lnmp.org/faq/letsencrypt-wildcard-ssl.html
下面以he为例
ssh连接上后每行输入
1 | export HE_Username="he账户的用户名" |
1 | export HE_Password="he账户的密码" |
1 | lnmp dnsssl he |
然后输入相关信息进行SSl申请并生成网站配置
注意第一个域名输入根域名,第二个域名输入*.根域名,否则生成失败
copy配置文件到新服务器备用
Nginx主配置文件
/usr/local/nginx/conf/nginx.conf
虚拟主机配置文件
/usr/local/nginx/conf/vhost/域名.conf
MySQL配置文件(Mariadb的配置文件与mysql通用,但是新环境所以决定使用默认的配置进行修改)
/etc/my.cnf
PHP配置文件
/usr/local/php/etc/php.ini
php-fpm配置文件
/usr/local/php/etc/php-fpm.conf
SNMP监控配置文件
/etc/snmp/snmpd.conf
coretab 的计划任务
,同时查看原服务器定时执行的任务相关脚本,可能之前对脚本进行过修改,需要在新服务器使用
1 2 3 4 | */5 * * * * /bin/bash /codefiles/lnmp1.4/tools/checkmysql.sh */5 * * * * /bin/bash /codefiles/lnmp1.4/tools/check502.sh 00 03 * * * /bin/bash /codefiles/lnmp1.4/tools/cut_nginx_logs.sh 00 23 * * 3 /bin/bash /codefiles/lnmp1.4/backup.sh |
—————————
4\
网站配置
—————————
(1)新建vhost/绑定域名/开启SSL/将原来的php/Nginx配置文件拷贝过来,优化php及Nginx配置
(2)https://xiaohost.com/1138.html Centos下lnmp正确iptables配置规则
—————————
5\lnmp日志的记录与处理
—————————
(1)使用脚本设定coretab任务,对日志进行切割按天保存,30天后自动删除,参照https://xiaohost.com/1201.html
(2)禁用lnmp的mysql日志功能防止占满磁盘导致出错,参考https://xiaohost.com/119.html
—————————
6\
防火墙规则
—————————
注意iptables规则与云主机的安全组相匹配,参照https://xiaohost.com/1138.html
另外,如果服务器或者程序需要给用户发邮件,需要开启25端口,如果用第三方,开启465
注意:check502和checkmysql脚本检测到php和mysql异常时,服务器会发送邮件通知自己
如果默认使用linux当前登录用户发信,通常会被当成垃圾邮件,需要指定发件人邮箱信息
命令:vi /etc/mail.rc编辑内容如:
1 2 3 4 5 | set from=username@126.com set smtp=smtp.126.com set smtp-auth-user=username set smtp-auth-password=password set smtp-auth=login |
注意配置中的smtp-auth-password不是邮箱登录密码,是邮箱服务器开启smtp的授权码,每个邮箱开启授权码操作不同(网易126邮箱开启菜单:设置-> 客户端授权密码)。
—————————
7\开启snmp,使用第三方监控平台对服务器进行监控,以便及时掌握服务器状态(有精力,后期可以自己搭建监控平台,使用)
—————————
1 | yum install net-snmp net-snmp-devel -y |
snmp分v2c和v3,各自的数据验证方式不同
V2版验证方法
首先清空默认配置文件,里面太多无关内容
1 | > /etc/snmp/snmpd.conf |
然后编辑配置文件
1 | vi /etc/snmp/snmpd.conf |
加入以下内容
1 2 3 4 5 | rocommunity public 127.0.0.1 rocommunity public 192.168.1.1 # 如果您使用的是采集器,以下IP应该是安装采集器的服务器的IP rocommunity public 60.195.252.107 rocommunity public 60.195.252.110 |
将上述的192.168.1.1更改为服务器IP,public可替换为您希望的验证字符串。
之前清空的默认的配置文件里会有一些权限控制的配置,如果您有这个需求,请自行参考CentOS的man文档加入相关配置。
V3验证方法
运行之前请先停用net-snmp服务,否则无法添加,命令如下:
1 | service snmpd stop |
使用如下命令创建一个snmpv3用户(权限为只读,加密方式为MD5,用户名为jiankongbao,密码为snmp@jiankongbao):
1 | net-snmp-config --create-snmpv3-user -ro -A snmp@jiankongbao -a MD5 jiankongbao |
运行Net-SNMP
1 2 | service snmpd start chkconfig snmpd on |
V2c版本检测
使用如下命令查看161UDP端口是否打开:
1 | netstat –antupl |
在另外任意一台机器上执行如下命令(请将commity换成您自己的字符串,tartget_ip换为被监控服务器的IP):
1 | snmpwalk -v2c –ccommity target_ip |
如果出现长串数字,则说明mib没有安装好。
V3版本检测
1 | snmpwalk -v 3 -u jiankongbao -a MD5 -A "snmp@jiankongbao" -l authNoPriv 127.0.0.1 sysDescr |
我们可以使用snmpwalk来检测snmp服务是否正常开启,命令如下:
1 | snmpwalk -v 3 -u jiankongbao -a MD5 -A "snmp@jiankongbao" -l authNoPriv 127.0.0.1 sysDescr |
如果一切正常,就会返回正常结果。
如果提示命令无效 使用
1 | yum install net-snmp-utils -y |
安装即可
snmp防火墙(iptables)设置
V2版
1 | iptables -L -n |
允许UDP的161端口
1 | iptables -I INPUT -p udp --dport 161 -j ACCEPT |
高级设置:以下防火墙规则限制为360和监控宝的snmp监控服务器IP,限定只有这些IP能获取信息
1 | iptables -I INPUT -p udp -s 60.195.252.107 --dport 161 -j ACCEPT;iptables -I INPUT -p udp -s 60.195.252.110 --dport 161 -j ACCEPT;iptables -I INPUT -p udp -s 127.0.0.1 --dport 161 -j ACCEPT;iptables -I INPUT -p udp -s 45.63.121.42 --dport 161 -j ACCEPT;iptables -A INPUT -i eth0 -p udp -s 101.199.100.150 --dport 161 -j ACCEPT;iptables -A INPUT -i eth0 -p udp -s 220.181.150.98 --dport 161 -j ACCEPT;iptables -A INPUT -i eth0 -p udp -s 180.153.229.230 --dport 161 -j ACCEPT;iptables -A INPUT -i eth0 -p udp -s 220.181.150.125 --dport 161 -j ACCEPT;iptables -A INPUT -i eth0 -p udp -s 103.28.11.237 --dport 161 -j ACCEPT;iptables -A INPUT -i eth0 -p udp -s 103.28.10.244 --dport 161 -j ACCEPT;iptables -A INPUT -i eth0 -p udp -s 103.28.10.245 --dport 161 -j ACCEPT |
—————————
8\
完善服务器备份
—————————
(1)使用coretab每天凌晨执行脚本,将本地磁盘/mnt目录增量备份到云磁盘(排除缓存目录,只备份数据库),覆盖,本地盘出问题,修改配置,然后使用云磁盘的备份
(2)使用云磁盘自动快照功能,每天凌晨自动对系统盘及数据盘进行快照(由于本地盘无法提供快照功能,而数据库又跑在上面,所以需要上一步的每天备份数据库至数据盘,要注意(1)(2)的时间配合好,先备份数据库到数据盘,再对数据盘进行快照)
(3)使用脚本每月自动打包备份数据库及网站文件(不含缓存)到远程FTP服务器或其他云提供的对象存储中,定期删除历史备份,保存时间30天
—————————
9\
优化网站
—————————
(1)网站动静完全分离 参考https://xiaohost.com/2473.html
(2)全站https 这个..实在没有难度,就不写出来了吧
—————-拓展:为什么用Nginx+php-fpm,不用Apache+MOD_PHP——————–
Nginx+PHP-FPM很容易实现动静分离,支持upstream配置PHP-FPM集群实现负载均衡以及故障转移
Nginx+PHP-FPM相对Nginx+Apache(libphp5.so)来说,PHP-FPM更灵活,
在php-fpm.conf里可以配置监听不同端口的多个pool
每个pool又可以自由配置PHP-FPM工人进程数pm.max_children
一个pool里的工人进程繁忙不会影响到另一个pool
而且一台服务器上可以运行多个版本的PHP-FPM,借助Nginx的upstream功能,PHP-FPM非常容易横向扩展。
Nginx返回502 Bad Gateway错误不是因为Nginx的问题,而是因为后端的问题.
比如后端PHP-FPM在处理一个请求时进程崩溃了,那么Nginx就会返回502错误.
可行的方法是:用fastcgi_next_upstream配置让Nginx把请求转移给另一个upstream处理.
1 | fastcgi_next_upstream error timeout invalid_header http_500 http_502 http_504; |
PHP-FPM配合Nginx还可以把I/O密集操作分离出来,减少阻塞对整个PHP应用的影响.
用户下载和curl请求是典型的I/O密集型操作,因为耗时主要发生在网络I/O和磁盘I/O.
需要PHP认证的下载操作可以委托为Nginx的AIO线程池:
header(“X-Accel-Redirect: $filepath”);
至于curl操作,比如可以建立一个监听9001端口的名为io的PHP-FPM进程池(pool),
专门负责处理curl操作(通过Nginx分发),避免curl操作阻塞到监听9000端口的www进程池.
这时io进程池多开点进程也无所谓:
nginx.conf配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ;访问io.php的请求都交给监听9001的PHP-FPM进程池处理 location = /io.php { include fastcgi_params; fastcgi_pass 127.0.0.1:9001; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } ;php-fpm正常脚本由静态www池处理,阻塞脚本由动态io池处理 [www] ;名为www的进程池监听9000端口,常驻进程数量为固定4个 listen = 127.0.0.1:9000 pm = static pm.max_children = 4 [io] ;名为io的进程池监听9001端口,进程数常驻4个,最大8个 listen = 127.0.0.1:9001 pm = dynamic pm.max_children = 8 pm.start_servers = 4 pm.min_spare_servers = 4 pm.max_spare_servers = 4 |
其中I/O密集这个进程池[io]采用动态的prefork进程,比如这里是繁忙时8个,空闲时4个.
利用PHP-FPM提供的池的隔离性,分离计算密集和I/O密集操作,可以减少阻塞对整个PHP应用的影响.