CentOS 8.0 LEMP环境的性能与安全优化指南2022版
在上一篇文章《从零部署Linux服务器完全指南2022版(CentOS 8+Nginx+PHP)》的基础上,我们完成了LEMP环境的部署,接下去为了提高网站运行的稳定性,我们将对其进行进一步的性能与安全优化。
整体步骤分为下面的八个:
(一)Mariadb和Nginx服务断开后自动重启
(二)PHP配置修改
(三)启用GZIP压缩
(四)创建交换空间swap space
(五)进一步优化Mariadb
(六)静态文件缓存和PHP缓存
(七)配置Redis缓存mysql数据
(八)学会检查内存占用的程序
(可选)配置DNS到cloudflare提高性能和安全性
这一部分操作顺序不一定要由上至下,但是建议您按照由上至下的顺序循序渐进。
(一)Mariadb和Nginx服务断开后自动重启
推荐使用SH脚本执行
也可以编辑.sh脚本,并保存,记录.sh文件所在路径【一定确保.sh脚本可用,可以尝试在编辑完成.sh文件后,直接./tomcat.sh 执行脚本文件,查看是否可以正常执行】
mkdir /usr/share/nginx/sh sudo vi /usr/share/nginx/sh/test.sh
测试脚本:
#!/bin/bash if [[ "$(systemctl status nginx.service)" =~ "active" ]] then echo "process is running" else echo "process is not running" fi
给予权限和执行
chmod +x /usr/share/nginx/sh/test.sh /usr/share/nginx/sh/test.sh
然后删除
rm -rf /usr/share/nginx/sh/test.sh
先查看服务器的时间,根据其时间推断中国区域的时间
date
或
timedatectl
始终确保使用 crontab -e 编辑您的 crontab。检测cron定时服务是否自启用
systemctl is-enabled crond.service
如果未启用,则开启cron自启用
systemctl enable crond.service
如果已经启用,想要cron关闭自启动
systemctl disable crond.service
查看cron服务的启动状态[只有cron的状态是active running的,才表示cron服务是启动的]
systemctl status crond.service
查看增加的定时脚本
crontab -l
直接编辑定时脚本
crontab -e
添加自动重启mariadb服务
新增一个sh脚本,当数据库服务出问题时自动启动mariadb服务
sudo vi /usr/share/nginx/sh/mysql-check.sh脚本如下:
#!/bin/bash if [[ ! "$(systemctl is-active mariadb.service )" =~ "active" ]] then systemctl start mariadb.service fi保存文件后,修改其权限
chmod u+r+x /usr/share/nginx/sh/mysql-check.sh直接运行,检测是否能执行(不报Permission denied错即可)
/usr/share/nginx/sh/mysql-check.sh添加到自动任务列表,每 15 分钟运行一次命令,
crontab -e脚本如下:
*/15 * * * * /usr/share/nginx/sh/mysql-check.sh
添加自动重启nginx服务
为了更好地解决信号量过载造成的http连接无法建立,导致服务无法启动这问题,增加一个自动清除信号量的脚本:
新增一个sh脚本,当数据库服务出问题时自动启动mariadb服务
sudo vi /usr/share/nginx/sh/server-check.sh脚本如下:
#!/bin/bash if [[ ! "$(systemctl status nginx.service)" =~ "active" ]] then ipcrm -a systemctl restart nginx.service fi保存文件后,修改其权限
chmod u+r+x /usr/share/nginx/sh/server-check.sh直接运行,检测是否能执行(不报Permission denied错即可)
/usr/share/nginx/sh/server-check.sh添加到自动任务列表,每 30 分钟运行一次命令,
crontab -e脚本如下:
*/30 * * * * /usr/share/nginx/sh/server-check.sh
查看脚本
crontab -l
重启
systemctl restart crond.service
(二) PHP配置修改
Step1:配置php.ini
先备份一个原配置:
cp /etc/php.ini /etc/php.ini.bak
修改配置(使用/和n查询字段)
vi /etc/php.ini
支持php短标签(如果配置里没有或者被注释了就增加)
short_open_tag = On #原数值Off
修改上传文件限制为100M(方便上传较大的还原数据)
upload_max_filesize = 100M #原数值2M
下面这两行要修改一下(如果配置里没有或者被注释了就增加),否则WP一直是8M
post_max_size = 200M #原数值8M max_execution_time = 300 #原数值30
重启
systemctl restart php-fpm nginx
注意:Nginx中设置过server { client_max_body_size 100M; } 属性才能生效
Step2:配置 php-fpm
配置php-fpm的session权限,否则会影响WordPress的功能
vi /etc/php-fpm.d/www.conf
查找php_value[session.save_path]字符,找到它储存session的位置为 /var/lib/php/session
chmod -R 777 /var/lib/php/session chmod -R 777 /var/lib/php/opcache chmod -R 777 /var/lib/php/wsdlcache
重启
systemctl restart php-fpm nginx
(三)启用GZIP压缩
修改Nginx配置,让https支持php等常用配置,代码如下,修改443端口(非www部分)
vi /etc/nginx/conf.d/default.conf
加入以下代码:
# Gzip Compression gzip on; gzip_vary on; gzip_min_length 1000; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
重启
systemctl restart nginx
(四)创建交换空间swap space
首先使用df -h和free -m命令查看内存使用情况和swap的大小
创建Swap文件(这里创建了4G的交换空间)
sudo fallocate -l 4G /swapfile
检查是否创建OK
ls -lh /swapfile
启用Swap文件
sudo chmod 600 /swapfile ls -lh /swapfile
既然我们的交换文件更安全,我们可以通过输入以下内容告诉我们的系统设置交换空间以供使用:
sudo mkswap /swapfile sudo swapon /swapfile
为了验证程序是否成功,我们可以检查我们的系统现在是否报告交换空间:
swapon -s free -m
使交换文件永久化
sudo vi /etc/fstab
最底部添加下面代码让系统使用并自动挂载
/swapfile swap swap defaults 0 0
重新查看
free -m
(可选,目前未设置)
调整 Swappiness 值。Swappiness 是一个 Linux 内核属性,它定义了系统使用交换的频率空间。 Swappiness 可以有一个介于 0 和 100 之间的值。低值将使内核尽量避免交换,而较高的值将使内核更积极地使用交换空间。CentOS 8 上的默认 swappiness 值为 30。您可以查看当前的 swappiness
cat /proc/sys/vm/swappiness虽然 30 的 swappiness 值对于桌面和开发机器是可以的,但对于生产服务器,您可能需要设置一个较低的值。更改参数,要使此参数在重新启动后保持不变:
vi /etc/sysctl.conf vm.swappiness=10
(可选,目前未设置)
要停用和删除交换文件,请按照下列步骤操作:
通过键入以下内容停用交换空间:
sudo swapoff -v /swapfile从 /etc/fstab 中删除交换条目 /swapfile swap swap defaults 0 0
删除文件
sudo rm /swapfile
(五)进一步优化Mariadb
模拟和解决可能遇见的问题如下:
(1) Error establishing a database connection
(2) Warning: mysqli_real_connect(): (HY000/2002): Connection refused in
(3) Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in …
(4) Warning: mysql_connect(): Connection refused…
Step1: 修改最大连接数
避免mysqli_real_connect():Connection refused in类似错误,可能是由于连接数超过了被拒绝
检查mariadb的版本信息
rpm -qa | grep mariadb
查看mariadb的最大连接数为默认151(输入密码)
rpm -qa | grep mariadb
检查mysql版本
rpm -qa |grep mysql
先备份一个配置文件,修改配置文件,增加最大连接数
sudo cp /etc/my.cnf /etc/my.cnf.bak vi /etc/my.cnf
在调整为 MySQL 分配多少内存时,只需要更新分配给innodb_buffer_pool_size的值。 不要更新其他参数,添加3行代码:
①对于具有小型 RAM (<= 1GB) 的系统,最好使用 MySQL 默认配置值 128MB 作为 InnoDB 缓冲池大小。
②适用于具有中型 RAM (1GB – 32GB) 的系统,我们可以使用以下粗略的启发式方法计算操作系统需求:256MB + 256 * log2(以 GB 为单位的 RAM 大小)
[mysqld] max_connections=1000 innodb_buffer_pool_size = 128M
重启mariadb服务,再次查看mariadb数据库最大连接数,可以看到最大连接数是214,并非我们设置的1000。这是由于mariadb有默认打开文件数限制。可以通过配置/usr/lib/systemd/system/mariadb.service来调大打开文件数目。
systemctl restart mariadb.service
先备份一个原配置:
cp /usr/lib/systemd/system/mariadb.service /usr/lib/systemd/system/mariadb.service.bak
配置文件
vi /usr/lib/systemd/system/mariadb.service
[Service]新添加两行如下参数:
LimitNOFILE=10000 LimitNPROC=10000
重新加载系统服务,并重启mariadb服务, 再次查看mariadb数据库最大连接数,可以看到最大连接数已经是1000
systemctl --system daemon-reload systemctl restart mariadb.service
再次查看mariadb的最大连接数
mysqladmin -uroot -p variables |grep max_connections
查看mysql的建立的连接数
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
进入mysql终端,此时输入密码
mysql -u root -p进入mysql终端后的命令
select version(); #查看当前mysql版本 show status like 'Threads%'; #查看当前mysql连接数 show variables like '%max_connections%'; #查看当前mysql最大连接数 show variables like 'log_%'; #是否启用错误日志 show master status; #当前日志是否存在 QUIT; #退出
Step2: Mariadb关闭后自动重连接
查看mariadb的日志
tail /var/log/mariadb/mariadb.log
崩溃后自动重启
vi /etc/systemd/system/multi-user.target.wants/mariadb.service
在[Service]下面加入以下行(如果已经存在则修改值,默认值为on-abort中止)
Restart=always
重新加载系统守护程序
sudo systemctl daemon-reload sudo systemctl restart mariadb.service
重启服务器,稍等十几秒后恢复
sudo reboot
模拟数据库崩溃的效果,查找进程看到类似ID后可以kill掉
ps -ef | grep mysql
强制终止进程(如果/etc/systemd/system/multi-user.target.wants/mariadb.service文件修改成功,择数据库被kill后,会立刻重启恢复)
sudo kill -9 1179
Step3: Mysql进程崩溃后自动重启
需要配置/etc/inittab文件,首先备份一个,编辑此文件一定要非常小心
sudo cp /etc/inittab /etc/inittab.bak vi /etc/inittab
结尾处增加一行,在/ etc / inittab文件中放置一个命令,以在mysqld_safe进程崩溃时重新生成mysqld_safe进程。 它有四个字段,每个字段与冒号(:)分隔开
ms:2345:respawn:/bin/sh /usr/bin/mysqld_safe
保存后重启服务
systemctl restart mariadb.service
重启服务器,稍等十几秒后恢复
sudo reboot
查看服务状态
sudo service mariadb status
(六)静态文件缓存和PHP缓存
特别注意:不要使用 /usr/share/nginx/目录作为缓存文件夹,因为如果不执行sudo setenforce 0,系统将无法自己创建缓存文件,绕过SELinux是很危险的,使用/var/lib/nginx/文件夹,默认被SELinux允许
Step1: PHP缓存设置
先配置nginx的根文件,配置PHP的缓存
vi /etc/nginx/nginx.conf
在http { ... } 中加入代码,使用/var/lib/nginx/cache作为php的缓存文件夹
# Enable PHP cache fastcgi_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m max_size=40m; fastcgi_cache_key "$scheme$request_method$host$request_uri";
接着修改server配置文件
vi /etc/nginx/conf.d/default.conf
server { location ~ \.php$ { ... } }中加入代码配置PHP缓存,60m是60分钟:
# Enable PHP cache fastcgi_cache MYAPP; fastcgi_cache_valid 200 301 302 60m; fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503; fastcgi_cache_min_uses 1; fastcgi_cache_lock on; add_header X-FastCGI-Cache $upstream_cache_status;
生成缓存文件夹,给权限
mkdir /var/lib/nginx/cache
必须给予权限才能从客户端访问缓存:
sudo chown -R myftp1:www-data /var/lib/nginx/cache
重启
systemctl restart nginx php-fpm
新建一个PHP缓存测试文件
vi /usr/share/nginx/html/wordpress/time.php
脚本如下:
<?php echo time(); ?>
测试缓存效果:
curl -I https://yoursite.com/time.php
x-fastcgi-cache 的值出现HIT表示生效,而且time.php的时间数值不会变动
清除缓存:
rm -rf /var/lib/nginx/cache/*
Step2: Nginx静态文件缓存设置
先配置nginx的根文件,配置静态文件缓存的Expires map
vi /etc/nginx/nginx.conf
在http { ... } 中加入代码(缓存某些目录下的文件30天,HTML文件不会被缓存)
# Expires map map $sent_http_content_type $expires { default off; text/html epoch; text/css 30d; application/javascript 30d; ~image/ 30d; ~images/ 30d; ~videos/ 30d; ~models/ 30d; ~fonts/ 30d; ~font/ 30d; ~wp-content/uploads/ 30d; }
接着修改server配置文件
vi /etc/nginx/conf.d/default.conf
server { ... }中加入代码配置静态文件缓存:
# Expires static files expires $expires;
重启
systemctl restart nginx
测试缓存效果【注意:此缓存是储存在客户端(浏览器)上的配置,不是直接从服务端读取】:
curl -I /static-remote/files/xxxxxxxxx-yoursitecomxxxxxxxxxjpg.jpg
(七)配置Redis缓存mysql数据
安装redis(目前版本5.0.3)
dnf install redis -y
启动
systemctl start redis systemctl enable redis
查看状态
systemctl status redis
检查端口
ss -ant | grep 6379 或者 semanage port -l | grep "redis"
测试redis连接
redis-cli
输入:ping
输入:INFO server
配置redis,先备份一个
cp /etc/redis.conf /etc/redis.conf.bak
配置
vi /etc/redis.conf
结尾处添加:
maxmemory 128mb maxmemory-policy allkeys-lru
(可选)
默认情况下,redis-cli 允许您在 Raedis shell 中运行任何命令。 因此,使用密码保护 Redis shell 是一个好主意。 您可以启用密码验证:
找到下面这行:
# requirepass foobared
改成密码即可:
requirepass yourpassword
重启
systemctl restart redis
WordPress安装插件来启用和检查redis使用情况
Redis Object Cache用来启用redis
Query Monitor用来检测mysql链接情况,出现下图表示存在缓存(OK后卸载即可,使用一个插件就行)
可以使用终端检查
redis-cli monitor
刷新网站出现
注意:SELinux安全策略 (sudo setenforce 1)启动后redis连接将会失效,未来保障安全,我们不能关闭安全策略,所以暂时禁用redis。
(八)学会检查内存占用的程序
可以简单实用top命令,然后访问网站,就会动态出现内存占用的程序,学会分析他们
(可选) 配置DNS到cloudflare提高性能和安全性
首先注册Cloudflare账号,然后添加一个域名,登录你的域名注册商的后台,把DNS修改为dax.ns.cloudflare.com 和sue.ns.cloudflare.com即可,具体的设置可以参看Cloudflare官网
注意:Cloudflare不支持特殊端口号,如果网站使用了其它端口号挂载资源,需要使用Cloudflare Spectrum来支持其它端口号(付费服务)
结语
看到这了,差不多完整的一整套部署已经可以正常稳定(相对稳定,并不代表不会被攻击,或者使用的后台有漏洞,这些需要自己去注意)使用了。目前CentOS 8的生命周期已经结束,我们也可以在此基础上,继续升级到CentOS Stream 9,整体的搭建思路其实差不多,主要注意一些命令、安全机制的差异,之后如果我自己的某些站点启用了CentOS Stream 9的话,也会实战一下从零部署并发布相关文章,希望本文对你有帮助,感兴趣可以继续关注我,会不定期分享一些东西。:)
本文出自没位道 - Chuckie Chang个人网站,转载请保留出处,谢谢!
文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
文章评论