一鍵部署腳本(生產環境建議逐步執行驗證)
#!/bin/bash
set -e
# 1. 系統更新與基礎工具
yum update -y
yum install -y wget curl vim net-tools unzip zip git
# 2. Nginx 官方源安裝
rpm -Uvh https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install -y nginx
systemctl enable nginx && systemctl start nginx
# 3. MySQL 官方源安裝
wget https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm
rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
yum install -y mysql-community-server
systemctl enable mysqld && systemctl start mysqld
# 4. 獲取 MySQL 臨時 root 密碼並修改
TEMP_PWD=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
NEW_PWD='YourStrongP@ssw0rd!'
mysql -uroot -p"$TEMP_PWD" --connect-expired-password -e "
ALTER USER 'root'@'localhost' IDENTIFIED BY '$NEW_PWD';
UNINSTALL COMPONENT 'file://component_validate_password';
CREATE USER 'admin'@'%' IDENTIFIED BY '$NEW_PWD';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
"
# 5. PHP 7.4 (Remi 源)
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php74
yum install -y php php-fpm php-mysqlnd php-gd php-mbstring php-xml php-json php-opcache php-pdo php-pecl-redis php-pecl-mcrypt
# 6. PHP-FPM 配置
sed -i 's/user = apache/user = nginx/' /etc/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/' /etc/php-fpm.d/www.conf
sed -i 's/;date.timezone =/date.timezone = Asia\/Shanghai/' /etc/php.ini
systemctl enable php-fpm && systemctl start php-fpm
# 7. Nginx 虛擬主機配置
cat > /etc/nginx/conf.d/default.conf <<'EOF'
server {
listen 80;
server_name _;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
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 ~ /\.ht { deny all; }
}
EOF
nginx -t && systemctl reload nginx
# 8. phpMyAdmin
cd /var/www/html
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
unzip phpMyAdmin-5.2.1-all-languages.zip
mv phpMyAdmin-5.2.1-all-languages phpmyadmin
chown -R nginx:nginx /var/www/html/phpmyadmin
chmod -R 755 /var/www/html/phpmyadmin
# Session 目錄權限
chown -R nginx:nginx /var/lib/php/session
echo "=== LNMP 安裝完成 ==="
echo "Nginx: https://$(hostname -I | awk '{print $1}')"
echo "phpMyAdmin: https://$(hostname -I | awk '{print $1}')/phpmyadmin"
echo "MySQL root 密碼: $NEW_PWD"
關鍵配置驗證清單
| 組件 | 驗證命令 | 預期結果 |
| Nginx | curl -I https://localhost | HTTP/1.1 200 OK |
| PHP-FPM | php -v | PHP 7.4.x (cli) |
| MySQL | mysql -uadmin -p -e "SELECT VERSION()" | 8.0.x |
| PHP-MySQL | php -r "new PDO('mysql:host=127.0.0.1', 'admin', 'pwd'); echo 'OK';" | OK |
| phpMyAdmin | curl -I https://localhost/phpmyadmin | 200 OK |
安全加固建議
- 修改 SSH 端口,禁用 root 登錄,啟用金鑰認證。
- Firewall:
firewall-cmd --permanent --add-service={http,https} --add-port=3306/tcp(MySQL 僅內網開放)。
- Nginx 隱藏版本號:
server_tokens off;。
- PHP 禁用危險函數:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source。
- 定期備份:
mysqldump --single-transaction --routines --triggers -uadmin -p db > backup.sql。
常見問題排查
# Nginx 502 Bad Gateway
systemctl status php-fpm # 確認 php-fpm 運行
netstat -tlnp | grep :9000 # 確認 9000 端口監聽
tail -f /var/log/nginx/error.log # 查看具體錯誤
# MySQL 連不上
systemctl status mysqld
cat /var/log/mysqld.log
# 檢查 bind-address = 0.0.0.0 (在 /etc/my.cnf)
# phpMyAdmin 登錄 2002/2003 錯誤
# config.inc.php 中 $cfg['Servers'][$i]['host'] = '127.0.0.1'; (不要用 localhost)