搜索
当前位置:首页 > 百科 > nginx php环境搭建

nginx php环境搭建

发表于 2026-10-17 06:02:42 来源:烟消火灭网

Nginx 配 PHP,环境最省事的搭建办法是直接用发行版包管理器装。Ubuntu 上一条 apt install nginx php-fpm 就完事,环境CentOS 换 yum 也一样。搭建但很多人装完打开浏览器看到一片空白,环境或者下载了个 index.php 文件,搭建问题基本都出在 Nginx 不知道怎么把 PHP 请求转给 PHP-FPM。环境

Nginx 本身不处理 PHP。搭建它把 .php 结尾的环境请求通过 FastCGI 协议丢给 PHP-FPM 进程,FPM 处理完再把结果返回。搭建所以配置的环境核心就一句话:告诉 Nginx 哪些请求该转,转到哪里去。搭建

先确认 PHP-FPM 在跑

装完 PHP-FPM 后它通常会自动启动。环境用 systemctl status php-fpm 或 systemctl status php8.1-fpm 看一眼,搭建具体服务名取决于 PHP 版本。环境Ubuntu 下一般是 php8.x-fpm,CentOS 下可能就叫 php-fpm。

FPM 监听的方式有两种:Unix socket 和 TCP 端口。默认配置里 Ubuntu 走 socket,路径类似 /run/php/php8.1-fpm.sock;CentOS 走 TCP,监听 127.0.0.1:9000。这个信息必须和 Nginx 配置里写的一致,否则就是 502 Bad Gateway。

Nginx 的 server 块怎么写

假设站点目录在 /var/www/html,一个能跑 PHP 的最小配置大概长这样:

server {  listen 80; server_name example.com; root /var/www/html; index index.php index.html; location / {  try_files $uri $uri/ =404; } location ~ \.php$ {  include fastcgi_params; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }

几个关键点。fastcgi_pass 的地址要和 FPM 实际监听的一致。如果你用的是 TCP,就写 fastcgi_pass 127.0.0.1:9000;。SCRIPT_FILENAME 这行必须加,不加的话 FPM 不知道要执行哪个文件,返回一个 “File not found”。include fastcgi_params 引入的是一堆标准 FastCGI 变量,发行版通常放在 /etc/nginx/fastcgi_params。

还有个容易踩的坑:location ~ \.php$ 这个正则匹配的是以 .php 结尾的 URI。如果请求的是 /js/app.php.js 这种,不会匹配到,没问题。但有些老教程写的是 location ~ .php$,少了个反斜杠,那 .php 里的点就变成了任意字符,/uploads/shell.phps 之类的也可能被拿去执行。别抄错。

安全上的一个细节

上面那个配置有个隐患:如果用户上传了一个伪装成图片的 PHP 文件到 /uploads/,而 location ~ \.php$ 没有做路径限制,这个文件就可能被当成 PHP 执行。加一段:

location ~* /uploads/.*\.php$ {  deny all; }

把上传目录里的 PHP 请求直接拒掉。这不是 Nginx 的 bug,是配置者需要主动考虑的事。

改完记得 reload

Nginx 改配置用 nginx -t 先测语法,通过了再 systemctl reload nginx。直接 restart 会断掉正在处理的连接,reload 更平滑。PHP-FPM 改配置同理,systemctl reload php8.1-fpm。

测试的时候别只放一个 <?php echo "ok"; ?>,再写一个 phpinfo() 页面看看 FPM 的配置有没有生效,比如 upload_max_filesize、memory_limit 这些。改完 FPM 的 php.ini 必须 reload FPM 才生效,改 Nginx 的 fastcgi_param 则 reload Nginx。

整套东西跑起来之后其实很稳。出问题的地方翻来覆去就那几个:socket 路径不对、SCRIPT_FILENAME 没设、文件权限不够(Nginx 的 www-data 用户读不了 PHP 文件)、SELinux 拦了(CentOS 上常见,setsebool -P httpd_can_network_connect on 能解决一部分)。挨个排查就行。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by nginx php环境搭建,烟消火灭网   sitemap

回顶部