• Comments
  • Comments
  • Comments
  • Comments
  • Comments
  • Comments
  • Comments

CentOS 8.0 LEMP环境的性能与安全优化指南2022版

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 -hfree -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.comsue.ns.cloudflare.com即可,具体的设置可以参看Cloudflare官网

注意:Cloudflare不支持特殊端口号,如果网站使用了其它端口号挂载资源,需要使用Cloudflare Spectrum来支持其它端口号(付费服务)

结语

看到这了,差不多完整的一整套部署已经可以正常稳定(相对稳定,并不代表不会被攻击,或者使用的后台有漏洞,这些需要自己去注意)使用了。目前CentOS 8的生命周期已经结束,我们也可以在此基础上,继续升级到CentOS Stream 9,整体的搭建思路其实差不多,主要注意一些命令、安全机制的差异,之后如果我自己的某些站点启用了CentOS Stream 9的话,也会实战一下从零部署并发布相关文章,希望本文对你有帮助,感兴趣可以继续关注我,会不定期分享一些东西。:)

本文出自没位道 - Chuckie Chang个人网站,转载请保留出处,谢谢!
文章采用 CC-BY-4.0 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。


返回列表  分享

分享给朋友!

微信
微博
文章评论