上周更新 php7.3 的時候順手執行了下 yum update 導致無法進入系統,在客服的幫助下複製出了數據,然後自己重裝了系統,記錄下。本文主要參考了G. T. Wang的CentOS 7 安裝 Nginx、MySQL/MariaDB、PHP7,架設 LEMP 網頁伺服器筆記,非常感謝!
安全設置
阻止內核升級
#在 /etc/yum.conf 中加入
exclude=kernel*
上次進不了系統比較懷疑是升級內核後grub沒更新導致的,但是也不確定,為了系統穩定性最好還是禁用內核升級。不過禁止了內核升級也就不能安裝 kernel 相關庫,需要的時候臨時打開就行。
新建 sudo 用戶
# 新增使用者
adduser USERNAME
# 設定密碼
passwd USERNAME
# 將 USERNAME 加入 wheel 群組
usermod -aG wheel USERNAME
設定時區
# 使用 timedatectl 列出可選擇的時區:
timedatectl list-timezones
# 設定時區為亞洲的台北:
sudo timedatectl set-timezone Asia/Shanghai
# 其他常用時區
sudo timedatectl set-timezone Asia/Hong_Kong
sudo timedatectl set-timezone Asia/Taipei
# 查看本機時間
date
防火牆
參考:CentOS Linux 7 以 firewalld 指令設定防火牆規則教學。我這裡只記錄下我的操作。
# 檢查 firewalld 服務狀態
systemctl status firewalld
#啟動 firewalld 服務,默認是有開啟22端口的,
#如果你的 SSH 端口已經更改,啟用防火牆可能會導致 SSH 連不上
systemctl start firewalld
# 停止 firewalld 服務
systemctl stop firewalld
# 重新啟動 firewalld 服務
service firewalld restart
# 設定開機自動啟動 firewalld 服務
systemctl enable firewalld
# 列出預設區域
firewall-cmd --get-default-zone
#一般是public
# 將 http 服務新增至 public 區域中
sudo firewall-cmd --zone=public --add-service=http
# 永久將 http 服務新增至 public 區域中
sudo firewall-cmd --zone=public --permanent --add-service=http
# 開啟 tcp 的 8080 連接埠
sudo firewall-cmd --zone=public --add-port=8080/tcp
# 永久開啟 tcp 的 8080 連接埠
sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp
# 若欲將 ssh 端口改為 20222
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp --dport 20222 -m state --state NEW -m recent --set
# 增加30秒4次的登錄頻率限制
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 1 -p tcp --dport 20222 -m state --state NEW -m recent --update --seconds 30 --hitcount 4 -j REJECT --reject-with tcp-reset
# 列出 public 區域永久的服務設定值
sudo firewall-cmd --zone=public --permanent --list-services
# 將 http 服務從 public 區域中移除
sudo firewall-cmd --zone=public --remove-service=http
# 永久將 http 服務從 public 區域中移除
sudo firewall-cmd --zone=public --permanent --remove-service=http
SSH加固
#如果本機沒有~/.ssh/id_rsa.pub
#則應該先生成密鑰對
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen
#問題默認即可
#複製本機 id_rsa.pub 到服務器
ssh-copy-id -i ~/.ssh/id_rsa.pub USER@HOST
#然後嘗試直接密鑰登錄
ssh USER@HOST
#修改 sshd 配置文件 /etc/ssh/sshd_config
#關閉密碼登錄
PasswordAuthentication no
#如果已新建用戶,可以禁止 root 遠程登錄
PermitRootLogin no
#避免無操作時自動斷開
ClientAliveInterval 20
ClientAliveCountMax 30
#修改端口,注意防火牆應開啟對應端口
Port 42222
#重啟 sshd 服務
sudo systemctl restart sshd
安裝LNMP服務
更新系統套件
#更新下系統套件
sudo yum upgrade
#啟用 EPEL
sudo yum install epel-release
sudo yum update
安裝 Nginx
sudo yum install nginx
#啟動 Nginx 服務
sudo systemctl start nginx
#開機自動啟動 Nginx 服務
sudo systemctl enable nginx
安裝 MariaDB
yum install mariadb-server mariadb
#啟動 MariaDB 服務,並設定開機自動啟動
sudo systemctl start mariadb
sudo systemctl enable mariadb
#強化 MySQL/MariaDB 資料庫設定的安全性
sudo mysql_secure_installation
#修改 /etc/my.cnf 綁定本機 IP
[mysqld]
bind-address = 127.0.0.1
新建數據庫用戶和導入備份的數據可以參考mysql tricks。
安裝 PHP 7.3
#開啟 Remi repository
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
#安裝 yum-utils
sudo yum install yum-utils
#開啟 php 7.3的軟件源
sudo yum-config-manager --enable remi-php73
#或者開啟其他版本 php 的軟件源
sudo yum-config-manager --enable remi-php72
sudo yum-config-manager --enable remi-php71
#安裝常用的 php 庫
sudo yum install php php-mcrypt php-cli php-fpm php-gd php-curl php-mysql php-ldap php-zip php-fileinfo php-xml php-mbstring
#修改 /etc/php-fpm.d/www.conf
listen = 127.0.0.1:9000
user = nginx
group = nginx
#修改 /etc/php.ini
cgi.fix_pathinfo=0
upload_max_filesize = 32M
post_max_size = 32M
max_file_uploads = 50
#啟動 php-fpm 服務,並設定開機自動啟動
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
我的服務器只有1核 CPU 和 512 MB內存,默認的php配置會耗光服務器資源,可以通過修改下面這些值來使服務器穩定。如果有更好的配置方案歡迎留言。
#修改 /etc/php-fpm.d/www.conf
listen.allowed_clients = 127.0.0.1
pm = dynamic
# Total number of processes allowed
pm.max_children = 5
# The number of child processes created on startup
pm.start_servers = 2
# The minimum number of idle processes
pm.min_spare_servers = 1
# The maximum number of idle processes
pm.max_spare_servers = 2
# The number of seconds an idle process will be alive
pm.process_idle_timeout = 10
# The execution time of each child process and is used to curb memory leaks
pm.max_requests = 200
配置 nginx
#修改 /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 40M;
gzip on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
#新增 /etc/nginx/nginx.d/ft.wupo.info.conf
server {
listen 443 ssl;
listen [::]:443;
server_name ft.wupo.info ;
root /usr/share/nginx/html/ft.wupo.info;
index index.php index.html index.htm;
ssl on;
ssl_certificate /etc/letsencrypt/live/ft.wupo.info/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ft.wupo.info/privkey.pem;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
}
server {
listen 80;
server_name ft.wupo.info;
return 301 https://$server_name$request_uri;
}
#https://certbot.eff.org/lets-encrypt/centosrhel7-nginx
#啟用 certbot 的源
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
#安裝 certbot
sudo yum install certbot python2-certbot-nginx
#生成證書
certbot -d ft.wupo.info --nginx certonly
如果是首次獲取生成證書,nginx 應該會報錯,因為證書找不到。可以先只打開 80 端口,待證書獲取成功後再打開 443。
本文更新於 2024/09/29。