我们将以目前最主流的 Nginx + PHP-FPM 组合为例进行讲解,因为它比传统的 Apache + mod_php 在性能和资源利用上更具优势,我也会简要提及 Apache 的配置方法。

目录
- 准备工作
- 安装 Nginx Web 服务器
- 安装 PHP 和 PHP-FPM
- 配置 Nginx 与 PHP-FPM 协同工作
- 配置 PHP (php.ini)
- 配置 PHP-FPM (www.conf)
- 启动服务并测试
- 生产环境优化建议
- 常见问题与排查
准备工作
你需要一台已经安装好 Linux 发行版的服务器,这里我们以 Ubuntu 22.04 为例,CentOS/Rocky Linux 的命令会有所不同(主要包管理器是 yum 或 dnf)。
更新系统包列表:
sudo apt update sudo apt upgrade -y
安装一些基础工具:
sudo apt install -y curl wget gnupg2 software-properties-common lsb-release ca-certificates
安装 Nginx Web 服务器
Nginx 是一个高性能的 HTTP 和反向代理服务器。

sudo apt install -y nginx
启动 Nginx 并设置为开机自启:
sudo systemctl start nginx sudo systemctl enable nginx
检查 Nginx 状态:
sudo systemctl status nginx
你应该看到 active (running) 的状态。
测试 Nginx:
在浏览器中访问你的服务器 IP 地址,http://your_server_ip,如果看到 "Welcome to nginx!" 页面,说明 Nginx 安装成功。

(可选)配置防火墙 如果你的服务器启用了 UFW (Uncomplicated Firewall),需要允许 HTTP 和 HTTPS 流量。
sudo ufw allow 'Nginx Full' sudo ufw reload
安装 PHP 和 PHP-FPM
PHP-FPM (FastCGI Process Manager) 是一个 PHP 的 FastCGI 实现,它被设计用来处理高负载的网站,并能更有效地管理资源。
添加 Ondřej Surý 的 PPA (Personal Package Archive) 这是 Ubuntu 上安装最新稳定版 PHP 最推荐的方式。
# 添加仓库 sudo add-apt-repository ppa:ondrej/php -y # 更新包列表 sudo apt update
安装 PHP 和必要的扩展 我们将安装 PHP 8.2(当前 LTS 版本)和一些最常用的扩展,请根据你的项目需求增减扩展。
# 安装 PHP 8.2 和 FPM sudo apt install -y php8.2 php8.2-fpm # 安装常用扩展 sudo apt install -y php8.2-cli php8.2-mysql php8.2-xml php8.2-curl php8.2-gd php8.2-mbstring php8.2-zip php8.2-intl php8.2-bcmath
检查 PHP 版本
php -v
你应该能看到 PHP 8.2 的版本信息。
检查 PHP-FPM 状态
sudo systemctl status php8.2-fpm
确保状态为 active (running)。
配置 Nginx 与 PHP-FPM 协同工作
现在我们需要告诉 Nginx 如何将 PHP 请求转发给 PHP-FPM 处理。
创建一个新的 Nginx 配置文件
我们为你的网站创建一个独立的配置文件,而不是修改默认的 default 配置。
sudo nano /etc/nginx/sites-available/my_project
粘贴到文件中:**
server {
listen 80;
server_name your_domain.com; # 替换成你的域名或 IP
root /var/www/my_project; # 替换成你的网站根目录
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 将所有 .php 文件的请求转发给 PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# 这一行会根据你安装的 PHP 版本自动指向正确的 socket
# 如果手动指定,通常是 /var/run/php/php8.2-fpm.sock
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
}
# 禁止访问 .htaccess 文件
location ~ /\.ht {
deny all;
}
}
配置说明:
server_name: 你的域名或服务器 IP。root: 你的网站代码存放的目录,这个目录需要你手动创建。index: 默认的首页文件,index.php被放在第一位。try_files: 这是 Nginx 的一个重要指令,它会按顺序尝试查找文件或目录,如果找不到,它会将请求重写到/index.php,这对于框架(如 Laravel, WordPress)至关重要。location ~ \.php$: 这个块匹配所有以.php结尾的 URI。include snippets/fastcgi-php.conf: 这个文件包含了与 PHP-FPM 通信所需的基本配置。fastcgi_pass: 将请求转发给 PHP-FPM,我们使用 Unix socket,因为它比 TCP/IP 环回接口更快,路径/var/run/php/php8.2-fpm.sock是 Ubuntu 上的标准路径,如果你的 PHP 版本不同,请相应修改。
启用新的网站配置
# 创建网站根目录 sudo mkdir -p /var/www/my_project # 给目录设置合适的权限 sudo chown -R www-data:www-data /var/www/my_project sudo chmod -R 755 /var/www/my_project # 启用配置(创建符号链接到 sites-enabled) sudo ln -s /etc/nginx/sites-available/my_project /etc/nginx/sites-enabled/ # 删除默认配置(可选) sudo rm /etc/nginx/sites-enabled/default # 测试 Nginx 配置语法 sudo nginx -t
如果看到 syntax is ok 和 test is successful,说明配置正确。
重新加载 Nginx
sudo systemctl reload nginx
配置 PHP (php.ini)
php.ini 是 PHP 的主配置文件,用于调整 PHP 的各种行为。
找到 php.ini 的位置
# 对于 CLI (命令行) php --ini # 对于 FPM ls /etc/php/8.2/fpm/php.ini
FPM 的配置文件在 /etc/php/8.2/fpm/php.ini。
编辑 php.ini
sudo nano /etc/php/8.2/fpm/php.ini
一些重要的配置项:
upload_max_filesize = 32M: 上传文件的最大大小。post_max_size = 32M: POST 数据的最大大小,通常应该等于或大于upload_max_filesize。memory_limit = 256M: 单个 PHP 脚本可以使用的最大内存。max_execution_time = 30: 脚本最大执行时间(秒)。date.timezone = "Asia/Shanghai": 设置时区,非常重要!display_errors = Off: 生产环境务必设置为 Off,避免敏感信息泄露,开发环境可以设置为On。error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT: 设置错误报告级别。
修改后,需要重启 PHP-FPM 使配置生效
sudo systemctl restart php8.2-fpm
配置 PHP-FPM (www.conf)
www.conf 用于配置 PHP-FPM 的工作进程池。
编辑 www.conf
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
一些重要的配置项:
listen = /var/run/php/php8.2-fpm.sock: 确保listen指令与 Nginx 配置中的fastcgi_pass路径一致。listen.owner = www-datalisten.group = www-datalisten.mode = 0660: 确保 Nginx 用户 (www-data) 对 socket 文件有读写权限。pm = dynamic: 进程管理方式,dynamic是推荐的方式,它会根据负载动态创建和销毁进程。pm.max_children = 50: 最大子进程数。pm.start_servers = 2: 启动时创建的进程数。pm.min_spare_servers = 1: 最小空闲进程数。pm.max_spare_servers = 3: 最大空闲进程数。pm.max_requests = 500: 每个子进程处理 500 个请求后会被重新启动,可以防止内存泄漏。
修改后,需要重启 PHP-FPM
sudo systemctl restart php8.2-fpm
启动服务并测试
创建一个测试文件
在网站根目录下创建一个 info.php 文件。
sudo nano /var/www/my_project/info.php ```如下: ```php <?php phpinfo(); ?>
保存并退出。
在浏览器中访问
在浏览器中访问 http://your_domain_or_ip/info.php。
你应该能看到一个详细的 PHP 信息页面,这证明了 Nginx 和 PHP-FPM 已经成功协同工作。
安全建议
测试完成后,立即删除 info.php 文件,因为它会暴露你的 PHP 环境配置信息,带来安全风险。
sudo rm /var/www/my_project/info.php
生产环境优化建议
-
使用 PHP OPcache: OPcache 是一个内置的缓存器,用于存储预编译的脚本字节码,能极大地提升 PHP 的性能。
- 安装扩展:
sudo apt install php8.2-opcache - 编辑
php.ini,取消并修改以下配置:opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.revalidate_freq=2 opcache.fast_shutdown=1
- 重启 PHP-FPM:
sudo systemctl restart php8.2-fpm
- 安装扩展:
-
配置 HTTPS: 使用 Let's Encrypt 免费证书为你的域名配置 HTTPS,这是现代网站的标配。
- 安装 Certbot:
sudo apt install certbot python3-certbot-nginx - 获取证书:
sudo certbot --nginx -d your_domain.com
- 安装 Certbot:
-
监控和日志: 定期检查 Nginx 和 PHP-FPM 的错误日志。
- Nginx 错误日志:
/var/log/nginx/error.log - PHP-FPM 错误日志: 在
www.conf中配置error_log = /var/log/php8.2-fpm.log
- Nginx 错误日志:
常见问题与排查
-
问题 1: 403 Forbidden 错误
- 原因: Nginx 没有权限访问网站目录下的文件。
- 解决: 检查目录和文件的所有者是否为
www-data,权限是否正确,使用sudo chown -R www-data:www-www /var/www/my_project和sudo chmod -R 755 /var/www/my_project修复。
-
问题 2: 502 Bad Gateway 错误
- 原因: Nginx 无法连接到 PHP-FPM,通常是
fastcgi_pass的路径不正确,或者 PHP-FPM 服务没有运行。 - 解决:
- 检查 PHP-FPM 状态:
sudo systemctl status php8.2-fpm。 - 检查 Nginx 配置中的
fastcgi_pass路径是否与www.conf中的listen路径完全一致。 - 检查 PHP-FPM 的错误日志,看是否有报错。
- 检查 PHP-FPM 状态:
- 原因: Nginx 无法连接到 PHP-FPM,通常是
-
问题 3: PHP 文件直接下载,而不是执行
- 原因: Nginx 没有将
.php文件正确地转发给 PHP-FPM。 - 解决: 仔细检查 Nginx 配置文件中的
location ~ \.php$块,确保配置正确无误,使用sudo nginx -t测试语法。
- 原因: Nginx 没有将
-
问题 4: White Screen of Death (WSOD)
- 原因: PHP 代码有致命错误,但
display_errors被设置为Off,所以你看不到任何错误信息。 - 解决:
- 临时解决: 将
php.ini中的display_errors设置为On,然后刷新页面查看具体错误。 - 根本解决: 修复代码中的错误,然后将
display_errors设置回Off。 - 查看错误日志:
tail -f /var/log/php8.2-fpm.log。
- 临时解决: 将
- 原因: PHP 代码有致命错误,但
这个指南涵盖了从零开始配置一个功能完整的 PHP 生产环境的所有关键步骤,希望对你有帮助!
