nginx正确运行php项目的关键是建立稳定、安全、高效的nginx与php-fpm通信链路,并精准路由请求:一要安装并启用nginx和php-fpm服务,验证监听方式;二需配置server块,用location ~ .php$匹配并正确设置fastcgi_pass与script_filename;三针对thinkphp等框架调整root路径和重写规则;四须落实权限控制、信息隐藏、gzip压缩及日志排查。

让Nginx正确运行PHP项目,关键不是“装上就行”,而是建立Nginx与PHP-FPM之间稳定、安全、高效的通信链路,并确保请求能准确路由到PHP入口。下面分四块讲清楚实操要点。
安装并确认基础服务就绪
先确保Nginx和PHP-FPM都已安装且正在运行:
- Ubuntu/Debian:运行
sudo apt install nginx php-fpm php-mysql php-curl php-gd php-mbstring,然后sudo systemctl enable --now nginx php-fpm - CentOS/RHEL:用
sudo yum install nginx php-fpm php-mysqlnd php-xml php-json,再启用服务 - 验证PHP-FPM状态:
systemctl status php-fpm,注意监听方式(unix:/run/php/php8.1-fpm.sock或127.0.0.1:9000),后续Nginx配置需严格匹配 - 临时测试PHP是否可执行:在网站根目录放一个
info.php,内容为<?php phpinfo(); ?>,访问看能否输出
编写精准的Nginx站点配置
核心是两件事:静态文件直出 + PHP请求交由PHP-FPM处理。以标准PHP项目为例(非框架):
- 在
/etc/nginx/sites-available/your-site中写入: server {-
listen 80; -
server_name example.com; -
root /var/www/your-project; -
index index.php index.html; -
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;(按实际版本和路径调整) -
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; -
} -
location ~ /\.ht { deny all; } }
启用后运行 sudo ln -sf /etc/nginx/sites-available/your-site /etc/nginx/sites-enabled/,再执行 sudo nginx -t && sudo systemctl reload nginx。
针对ThinkPHP等框架的特殊处理
ThinkPHP、Laravel等现代框架通常要求所有请求统一走 public/index.php,并隐藏 index.php:
- 将
root指向框架的public/目录,例如root /var/www/thinkphp/public; - 重写规则改为(放在
location /块内): -
if (!-e $request_filename) { -
rewrite ^/(.*)$ /index.php/$1 last; -
} - 同时禁止访问敏感路径:
location ~ ^/(app|config|runtime|vendor)/ { deny all; } - 禁用 .env、.git 等文件:
location ~ /\.(env|git|log|ini)$ { deny all; }
安全与性能必须做的收尾动作
生产环境不能跳过这些细节:
-
权限控制:网站根目录属主设为
www-data:www-data(Ubuntu)或nginx:nginx(CentOS),PHP文件不用777,644足够;上传目录可设755,但禁止执行:location ~* \.(php|php5|phtml)$ { deny all; }放在上传目录location块里 -
关闭信息泄露:在
php.ini中设expose_php = Off,并在Nginx中加fastcgi_hide_header X-Powered-By; -
开启基础优化:Nginx启用Gzip(
gzip on;)、静态资源缓存(location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; }) -
日志与排错:首次部署后查
/var/log/nginx/error.log和/var/log/php8.1-fpm.log,常见502错误多因socket路径不一致或PHP-FPM未启动
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











