如何正确配置Nginx + PHP
其实没多复杂
1. 将nginx和php都装好了
2. 然后配置nginx,将php请求分发给php-fpm处理
linux下的配置文件一般在/usr/local/nginx/conf/nginx.conf
找到下面字样,并取消注释,且注意这个$document_root这个地方(原本应为$script***的,改成$document_root)
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
3.启动nginx和php-fpm,然后写个phpinfo脚本测试下成功与否就可以了
直接贴上代码逐行进行讲解,此处贴出一个能正常启动php脚本的最简nginx vhost配置:
[plain] view plain copy
server {
listen 8011;
server_name test.cn;
location ~ \.php?.*$ {
root /share/test;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
1、第一个大括号 server{ }:不必多说,代表一个独立的server,
2、listen 8011:代表该server监听8011端口
3、location ~ \.php?.*${
}:代表一个能匹配对应uri的location,用于匹配一类uri,并对所匹配的uri请求做自定义的逻辑、配置。这里的location,匹配了所有带.php的uri请求,例如:http://192.168.244.128:8011/test.php/asdasd
http://192.168.244.128:8011/index.php等
4、root /share/test:请求资源根目录,告诉匹配到该location下的uri到/share/teset文件夹下去寻找同名资源。
5、fastcgi_pass 127.0.0.1:9000:这行开始是本文的重点:这行代码的意思是,将进入到该location内的uri请求看做是cgi程序,并将请求发送到9000端口,交由php-fpm处理。
6、fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
:这行配置意思是:动态添加了一行fastcgi配置,配置内容为SCRIPT_FILENAME,告知管理进程,cgi脚本名称。由于我的nginx中只有fastcgi_params文件,没有fastcgi.conf文件,所以要使php-fpm知道SCRIPT_FILENAME的具体值,就必须要动态的添加这行配置。
7、include fastcgi_params; 引入fastcgi配置文件
以上就是最简洁版的nginx启动php脚本的最简配置,当重启nginx之后,在/share/test目录下创建一个xx.php文件,输入<?php
echo "hello world"; ?>保存,然后在浏览器中访问localhost:8011/xx.php
就可以在网页上显示hello world了。
假设我们用PHP实现了一个前端控制器,或者直白点说就是统一入口:把PHP请求都发送到同一个文件上,然后在此文件里通过解析「REQUEST_URI」实现路由。
此时很多教程会教大家这样配置Nginx+PHP:
server {
listen 80;
server_name foo.com;
root /path;
location / {
index index.html index.htm index.php;
if (!-e $request_filename) {
rewrite . /index.php last;
}
}
location ~ .php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /path$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
这里面有很多错误,或者说至少是坏味道的地方,大家看看能发现几个。
…
我们有必要先了解一下Nginx配置文件里指令的继承关系:Nginx配置文件分为好多块,常见的从外到内依次是「http」、「server」、「location」等等,缺省的继承关系是从外到内,也就是说内层块会自动获取外层块的值作为缺省值(有例外,详见参考)。
参考:UNDERSTANDING THE NGINX CONFIGURATION INHERITANCE MODEL
…
让我们先从「index」指令入手吧,在问题配置中它是在「location」中定义的:
location / {
index index.html index.htm index.php;
}
一旦未来需要加入新的「location」,必然会出现重复定义的「index」指令,这是因为多个「location」是平级的关系,不存在继承,此时应该在「server」里定义「index」,借助继承关系,「index」指令在所有的「location」中都能生效。
参考:Nginx Pitfalls
…
接下来看看「if」指令,说它是大家误解最深的Nginx指令毫不为过:
if (!-e $request_filename) {
rewrite . /index.php last;
}
很多人喜欢用「if」指令做一系列的检查,不过这实际上是「try_files」指令的职责:
try_files $uri $uri/ /index.php;
除此以外,初学者往往会认为「if」指令是内核级的指令,但是实际上它是rewrite模块的一部分,加上Nginx配置实际上是声明式的,而非过程式的,所以当其和非rewrite模块的指令混用时,结果可能会非你所愿。
参考:IfIsEvil and How nginx “location if” works
…
下面看看「fastcgi_params」配置文件:
include fastcgi_params;
Nginx有两份fastcgi配置文件,分别是「fastcgi_params」和「fastcgi.conf」,它们没有太大的差异,唯一的区别是后者比前者多了一行「SCRIPT_FILENAME」的定义:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
注意:$document_root 和 $fastcgi_script_name 之间没有 /。
原本Nginx只有「fastcgi_params」,后来发现很多人在定义「SCRIPT_FILENAME」时使用了硬编码的方式,于是为了规范用法便引入了「fastcgi.conf」。
不过这样的话就产生一个疑问:为什么一定要引入一个新的配置文件,而不是修改旧的配置文件?这是因为「fastcgi_param」指令是数组型的,和普通指令相同的是:内层替换外层;和普通指令不同的是:当在同级多次使用的时候,是新增而不是替换。换句话说,如果在同级定义两次「SCRIPT_FILENAME」,那么它们都会被发送到后端,这可能会导致一些潜在的问题,为了避免此类情况,便引入了一个新的配置文件。
参考:FASTCGI_PARAMS VERSUS FASTCGI.CONF – NGINX CONFIG HISTORY
此外,我们还需要考虑一个安全问题:在PHP开启「cgi.fix_pathinfo」的情况下,PHP可能会把错误的文件类型当作PHP文件来解析。如果Nginx和PHP安装在同一台服务器上的话,那么最简单的解决方法是用「try_files」指令做一次过滤:
try_files $uri =404;
参考:Nginx文件类型错误解析漏洞
…
依照前面的分析,给出一份改良后的版本,是不是比开始的版本清爽了很多:
server {
listen 80
server_name foo.com;
root /path;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php;
}
location ~ .php$ {
try_files $uri =404;
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
实际上还有一些瑕疵,主要是「try_files」和「fastcgi_split_path_info」不够兼容,虽然能够解决,但方案比较丑陋,具体就不多说了,有兴趣的可以参考问题描述。
补充:因为「location」已经做了限定,所以「fastcgi_index」其实也没有必要.
安装护卫神.nginx大师吧,一键安装nginx+php+mysql+ftp,支持7个版本的PHP同时使用。
归常经舒: php用php-fpm启动,然后nginx location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } 这样就可以了
博白县14732339933: 如何在linux下配置nginx支持php - ?
归常经舒: 需要.如果是nginx+php配置,也可以通过查找php执行路径 ps aux | grep php 如,路径为 /usr/local/nginx/sbin/php-fpm 然后执行以下命令/usr/local/nginx/sbin/php-fpm -i | grep “Loaded Configuration File” 即可看到php加载的配置文件
博白县14732339933: 如何配置NGINX+多个版本PHP么 - ?
归常经舒: 思路:1. 配置不同版本的 php-fpm 分别监听在不同的端口, 例如,9001, 9002, 9003...2. 分别启动这几个版本的php-fpm3. 配置 nginx 不同的server调用不同端口的php-fpm
博白县14732339933: window8怎么配置nginx - ?
归常经舒: 工具原料:电脑+win8+php环境 window8配置nginx方法如下: 1、首先需要准备的应用程序包. nginx:nginx/Windows-1.0.4php:php-5.2.16-nts-Win32-VC6-x86.zip (nginx下php是以FastCGI的方式运行,所以我们下载非线程安全也就是nts的php...
博白县14732339933: windows下配置nginx的PHP环境 - ?
归常经舒: 你别在用户目录里直接运行,这样他会把当前目录看错是用户目录了 D:(先换到D盘) cd wnmp/nginx(切换到NGINX的根目录) nginx(执行nginx.exe) 话说windows下不是可以直接双击nginx.exe的么
博白县14732339933: 怎么正确配置Nginx+PHP及正确的nginx URL重写 - ?
归常经舒: PropertyPlaceholderConfigurer" p:locations-ref="locations" p:order="1" />
博白县14732339933: windows怎么搭建php开发环境配置 - ?
归常经舒: 下载必要的软件工具.nginx请到nginx.org下载,php7请到windows.php.net下载. 下载到本地磁盘,放在同一个文件夹下,将上面两个文件解压,注意解压PHP7之后重命名一下(我这里取的是php7,官方的压缩包命名有特殊字符,以防运行出...
博白县14732339933: Linux下Nginx+PHP+MySQL如何配置 - ?
归常经舒: 进入php源程序目录中的ext目录中,这里存放着各个扩展模块的源代码,选择你需要的模块,比如curl模块:cd curl 执行phpize生成编译文件,phpize在PHP安装目录的bin目录下 /usr/local/php5/bin/phpize 运行时,可能会报错:Cannot find ...
博白县14732339933: linux服务器怎么配置nginx+php+mysql环境 - ?
归常经舒: 一、简介 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 ...
博白县14732339933: windows环境下使用nginx,如何支持php? - ?
归常经舒: 使用nginx+php集成包phpfind或phpstudy即可一键安装好环境.还支持php版本一键切换,带控制面板的,纯中文绿色解压即可,完全符合国人使用习惯,你试试吧