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 https://yoursite.com/xxxxxxxxx.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的話,也會實戰一下從零部署併發布相關文章,希望本文對你有幫助,感興趣可以繼續關注我,會不定期分享一些東西。:)你可以從這裏直接瀏覽我的博客原文 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章