在上一篇文章《從零部署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 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.com 和sue.ns.cloudflare.com即可,具體的設置可以參看Cloudflare官網
注意:Cloudflare不支持特殊端口號,如果網站使用了其它端口號掛載資源,需要使用Cloudflare Spectrum來支持其它端口號(付費服務)
結語
看到這了,差不多完整的一整套部署已經可以正常穩定(相對穩定,並不代表不會被攻擊,或者使用的後臺有漏洞,這些需要自己去注意)使用了。目前CentOS 8的生命週期已經結束,我們也可以在此基礎上,繼續升級到CentOS Stream 9,整體的搭建思路其實差不多,主要注意一些命令、安全機制的差異,之後如果我自己的某些站點啓用了CentOS Stream 9的話,也會實戰一下從零部署併發布相關文章,希望本文對你有幫助,感興趣可以繼續關注我,會不定期分享一些東西。:)你可以從這裏直接瀏覽我的博客原文