1. 环境准备与基础配置
在Debian系统上搭建Nginx+PHP+MySQL环境前,需要先确保系统处于最新状态。我通常会先执行以下命令更新软件源和已安装的包:
bash复制sudo apt update && sudo apt upgrade -y
这个组合命令不仅更新软件包列表,还会自动升级所有可更新的包。对于生产环境,建议在升级前先检查哪些包会被更新,可以使用apt list --upgradable查看具体升级内容。
注意:如果系统内核有更新,需要重启服务器才能使新内核生效。建议在维护窗口期进行这类操作。
1.1 系统用户与权限设置
为安全起见,应该创建一个专用用户来运行web服务。我习惯使用webadmin这个用户名:
bash复制sudo adduser webadmin --system --no-create-home --group
参数说明:
--system:创建系统用户--no-create-home:不创建家目录--group:同时创建同名用户组
2. Nginx安装与优化配置
2.1 安装Nginx最新稳定版
Debian默认源中的Nginx版本可能较旧,我们可以添加官方源来获取最新版本:
bash复制sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
echo "deb http://nginx.org/packages/debian `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/nginx.gpg
sudo apt update
sudo apt install nginx
安装完成后,验证Nginx版本和运行状态:
bash复制nginx -v
sudo systemctl status nginx
2.2 性能优化配置
修改/etc/nginx/nginx.conf中的核心参数:
nginx复制worker_processes auto; # 自动匹配CPU核心数
worker_rlimit_nofile 100000; # 每个worker能打开的文件描述符数量
events {
worker_connections 4096; # 每个worker的最大连接数
multi_accept on; # 同时接受多个新连接
use epoll; # 使用epoll事件模型
}
http {
sendfile on; # 启用零拷贝传输
tcp_nopush on; # 仅在sendfile开启时有效
tcp_nodelay on; # 禁用Nagle算法
keepalive_timeout 30; # 保持连接超时时间
keepalive_requests 1000; # 单个连接最大请求数
# 其他配置...
}
提示:修改配置后记得用
sudo nginx -t测试配置语法,然后用sudo systemctl reload nginx重载配置。
3. MySQL/MariaDB安装与安全加固
3.1 安装数据库服务
Debian 11默认使用MariaDB 10.5,这是MySQL的一个兼容分支:
bash复制sudo apt install mariadb-server mariadb-client
安装完成后启动服务并设置开机自启:
bash复制sudo systemctl enable --now mariadb
3.2 安全加固与性能调优
运行安全脚本进行基础加固:
bash复制sudo mysql_secure_installation
这个脚本会引导你完成以下操作:
- 设置root密码
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重新加载权限表
对于生产环境,还需要调整InnoDB缓冲池等参数。编辑/etc/mysql/mariadb.conf.d/50-server.cnf:
ini复制[mysqld]
innodb_buffer_pool_size = 1G # 建议为物理内存的50-70%
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2 # 平衡性能与可靠性
innodb_flush_method = O_DIRECT
query_cache_type = 0 # 禁用查询缓存
max_connections = 200 # 根据实际情况调整
修改配置后重启MySQL服务:
bash复制sudo systemctl restart mariadb
4. PHP安装与FPM配置
4.1 安装PHP及相关扩展
Debian 11默认提供PHP 7.4,但许多现代应用需要PHP 8.0+。我们可以添加第三方源安装新版PHP:
bash复制sudo apt install apt-transport-https lsb-release ca-certificates
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update
sudo apt install php8.2 php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring php8.2-xml php8.2-zip
验证PHP版本:
bash复制php -v
4.2 PHP-FPM性能优化
编辑/etc/php/8.2/fpm/pool.d/www.conf调整进程管理参数:
ini复制pm = dynamic
pm.max_children = 50 # 最大子进程数
pm.start_servers = 5 # 启动时的进程数
pm.min_spare_servers = 5 # 最小空闲进程数
pm.max_spare_servers = 10 # 最大空闲进程数
pm.max_requests = 500 # 每个进程处理多少请求后重启
php_admin_value[memory_limit] = 128M
php_admin_value[post_max_size] = 64M
php_admin_value[upload_max_filesize] = 64M
重启PHP-FPM使配置生效:
bash复制sudo systemctl restart php8.2-fpm
5. Nginx与PHP-FPM集成配置
5.1 创建虚拟主机配置
在/etc/nginx/sites-available/下创建新的配置文件,例如example.com.conf:
nginx复制server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.php index.html index.htm;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
启用站点配置:
bash复制sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
5.2 测试PHP处理
创建测试文件/var/www/example.com/public/info.php:
php复制<?php
phpinfo();
?>
访问http://example.com/info.php应该能看到PHP信息页面。测试完成后务必删除此文件:
bash复制sudo rm /var/www/example.com/public/info.php
6. 安全加固措施
6.1 防火墙配置
如果使用UFW防火墙,需要放行HTTP/HTTPS端口:
bash复制sudo ufw allow 'Nginx Full'
sudo ufw enable
6.2 文件权限设置
合理的文件权限能有效防止安全漏洞:
bash复制sudo chown -R webadmin:www-data /var/www/example.com
sudo find /var/www/example.com -type d -exec chmod 750 {} \;
sudo find /var/www/example.com -type f -exec chmod 640 {} \;
6.3 MySQL远程访问限制
编辑/etc/mysql/mariadb.conf.d/50-server.cnf:
ini复制[mysqld]
bind-address = 127.0.0.1
skip-networking = 1 # 禁用TCP/IP连接
7. 常见问题排查
7.1 502 Bad Gateway错误
这通常表示Nginx无法连接到PHP-FPM。检查:
- PHP-FPM是否运行:
sudo systemctl status php8.2-fpm - socket路径是否正确:
ls /run/php/php8.2-fpm.sock - Nginx配置中的fastcgi_pass参数
7.2 PHP扩展未加载
如果某些PHP函数不可用,可能是缺少对应扩展。例如,安装GD库:
bash复制sudo apt install php8.2-gd
sudo systemctl restart php8.2-fpm
7.3 MySQL连接问题
检查MySQL用户权限:
sql复制CREATE USER 'webuser'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON `dbname`.* TO 'webuser'@'localhost';
FLUSH PRIVILEGES;
在PHP中使用PDO连接MySQL的示例:
php复制try {
$pdo = new PDO('mysql:host=localhost;dbname=dbname', 'webuser', '强密码');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}
8. 性能监控与维护
8.1 监控PHP-FPM状态
启用PHP-FPM状态页:
ini复制pm.status_path = /status
然后在Nginx配置中添加:
nginx复制location ~ ^/(status|ping)$ {
access_log off;
allow 127.0.0.1;
deny all;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
访问http://example.com/status可以查看FPM进程状态。
8.2 日志分析设置
配置Nginx日志格式:
nginx复制log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
使用goaccess工具分析访问日志:
bash复制sudo apt install goaccess
goaccess /var/log/nginx/access.log -o /var/www/example.com/report.html --log-format=COMBINED
9. 备份与恢复策略
9.1 数据库定期备份
创建备份脚本/usr/local/bin/mysql_backup.sh:
bash复制#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/mysql"
MYSQL_USER="backupuser"
MYSQL_PASS="备份密码"
mkdir -p $BACKUP_DIR/$DATE
databases=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)")
for db in $databases; do
mysqldump -u$MYSQL_USER -p$MYSQL_PASS --routines --triggers $db | gzip > "$BACKUP_DIR/$DATE/$db.sql.gz"
done
# 删除7天前的备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;
设置定时任务:
bash复制sudo chmod +x /usr/local/bin/mysql_backup.sh
sudo crontab -e
# 添加以下内容
0 3 * * * /usr/local/bin/mysql_backup.sh
9.2 网站文件备份
使用rsync进行增量备份:
bash复制rsync -az --delete /var/www/example.com backupuser@backup-server:/path/to/backup/
10. 进阶配置建议
10.1 启用OPcache加速PHP
编辑/etc/php/8.2/fpm/php.ini:
ini复制[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
10.2 配置HTTP/2和SSL
使用Let's Encrypt免费证书:
bash复制sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
Nginx会自动配置HTTP/2和SSL。建议在/etc/nginx/nginx.conf中添加以下SSL优化参数:
nginx复制ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';
ssl_stapling on;
ssl_stapling_verify on;
10.3 数据库主从复制
对于高流量网站,可以设置MySQL主从复制:
- 主服务器配置
/etc/mysql/mariadb.conf.d/50-server.cnf:
ini复制[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
binlog_row_image = FULL
expire_logs_days = 10
- 从服务器配置:
ini复制[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
read_only = 1
- 在主服务器创建复制用户:
sql复制CREATE USER 'replica'@'%' IDENTIFIED BY '密码';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
- 在从服务器配置复制:
sql复制CHANGE MASTER TO
MASTER_HOST='主服务器IP',
MASTER_USER='replica',
MASTER_PASSWORD='密码',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=位置;
START SLAVE;
