搭建一个基于Nginx和PHP的服务器是现代Web开发中常见的需求,Nginx以其高性能、低内存占用和反向代理能力著称,而PHP作为流行的服务器端脚本语言,两者结合能够高效地处理动态网页请求,以下将详细介绍从环境准备到配置完成的完整过程,包括安装、配置、测试及常见问题处理。

环境准备与安装
在开始之前,确保你的系统是Linux发行版(如Ubuntu、CentOS等),并以root或具有sudo权限的用户身份操作,以Ubuntu为例,首先更新系统包列表并安装必要的依赖项:
sudo apt update sudo apt install -y nginx php-fpm php-mysql php-mbstring php-xml php-curl php-gd php-zip
这里安装了Nginx、PHP-FPM(FastCGI Process Manager,用于处理PHP请求)以及常用的PHP扩展,对于CentOS系统,可以使用yum或dnf命令,并启用EPEL仓库:
sudo yum install -y epel-release sudo yum install -y nginx php-fpm php-mysqlnd php-mbstring php-xml php-curl php-gd php-zip
安装完成后,启动并启用Nginx和PHP-FPM服务:
sudo systemctl start nginx sudo systemctl enable nginx sudo systemctl start php-fpm sudo systemctl enable php-fpm
Nginx配置
Nginx的配置文件通常位于/etc/nginx/nginx.conf,但虚拟主机配置建议放在/etc/nginx/sites-available/目录下,创建一个新的配置文件,例如default(或修改默认配置),内容如下:

server {
listen 80;
server_name your_domain_or_ip; # 替换为你的域名或IP地址
root /var/www/html; # 网站根目录
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 根据PHP版本调整路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
关键配置说明:
listen 80:监听HTTP请求,如需HTTPS可配置443端口并添加SSL证书。root:指定网站文件存放目录,需确保Nginx用户(如www-data)对该目录有读取权限。location ~ \.php$:将PHP文件请求传递给PHP-FPM处理,fastcgi_pass指向PHP-FPM的监听socket(CentOS中可能为/var/run/php-fpm/www.sock)。try_files:尝试按顺序查找文件或目录,若不存在则重定向到index.php,实现URL重写。
配置完成后,检查Nginx配置语法是否正确:
sudo nginx -t
若提示syntax is ok和test is successful,则启用该配置(对于Ubuntu,需创建软链接到sites-enabled目录):
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/ sudo systemctl reload nginx
PHP测试
在网站根目录(如/var/www/html)创建一个PHP测试文件info.php:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
设置正确的文件权限:
sudo chown -R www-data:www-data /var/www/html sudo chmod -R 755 /var/www/html
在浏览器中访问http://your_domain_or_ip/info.php,若看到PHP配置信息页面,说明Nginx与PHP-FPM已成功通信,测试完成后建议删除info.php以避免信息泄露。
安全优化
- 禁用PHP错误显示:编辑
php.ini(通常位于/etc/php/X.Y/fpm/php.ini,X.Y为PHP版本),设置display_errors = Off,并调整error_reporting级别。 - 限制访问权限:通过
.htaccess或Nginx配置限制敏感文件(如.env、config.php)的访问:location ~* \.(env|log|conf)$ { deny all; } - 使用防火墙:启用UFW(Ubuntu)或firewalld(CentOS)仅允许必要端口:
sudo ufw allow 'Nginx Full' sudo ufw enable
常见问题排查
- 502 Bad Gateway:通常因PHP-FPM未启动或
fastcgi_pass路径错误导致,检查PHP-FPM服务状态及socket文件是否存在。 - 文件权限问题:确保网站目录权限正确,Nginx用户(
www-data或apache)对文件有读写权限。
相关问答FAQs
Q1: 如何在Nginx中配置多站点?
A1: 在/etc/nginx/sites-available/目录下为每个站点创建独立的配置文件(如site1.conf、site2.conf),配置不同的server_name和root目录,然后通过sudo ln -s启用到sites-enabled目录,最后sudo systemctl reload nginx重新加载配置即可。
Q2: PHP-FPM进程数如何优化?
A2: 编辑PHP-FPM配置文件(如/etc/php/X.Y/fpm/pool.d/www.conf),调整pm(进程管理器模式,建议dynamic)、pm.max_children(最大子进程数)、pm.start_servers(启动时进程数)、pm.min_spare_servers和pm.max_spare_servers(最小/最大空闲进程数),根据服务器内存和并发需求计算,例如每进程约占用20-30MB内存,8GB内存服务器可设置max_children=200,并通过压力测试(如ab工具)观察性能表现。
