如何正确配置 Nginx 和 PHP

作者&投稿:宇文杭 (若有异议请与网页底部的电邮联系)
如何正确配置 Nginx 和 PHP~

直接贴上代码逐行进行讲解,此处贴出一个能正常启动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-fpm启动,然后nginx
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
这样就可以了

配置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」其实也没有必要。


平谷区17788681878: 如何在Windows上配置并运行Nginx -
富使迪克: 步骤1从nginx官网下载相应的安装包2建议下载 下载稳定版3解压到相应的目录,比如我是e盘 然后修改目录名字为nginx 进入nginx目录双击nginx.exe 来启动nginx4此时 直接在浏览器地址栏输入:localhost便能看到 欢迎页面,说明你虚拟主机已经搭建好了5但是有时候 我们需要配置路径 在默认情况下 他的root是 nginx目录下的html文件夹 如若修改则打开conf目录下的nginx.conf6找到server 选项 修改咯location 中的root 选项.7比如我修改到D:/webroot

平谷区17788681878: php和nginx安装后怎么配置 -
富使迪克: 先安装编译依赖的一些组件 复制代码 代码如下:yum install pcre pcre-devel openssl openssl-devel -y1、解压程序包 复制代码 代码如下:tar xf nginx-1.10.0.tar.gz cd nginx-1.10.02、预编译配置参数 复制代码 代码如下:./configure --user=www \--...

平谷区17788681878: 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...

平谷区17788681878: nginx thinkphp怎么配置 -
富使迪克: 让nginx支持pathinfo,支持thinkphp 1 我们打开nginx的配置文件,如果是想某个站点支持,请打开对应站点的配置文件 2 我们注释掉配置文件中那些被我圈出来的语句(location ~ \.php$ {……}这一段里面的),我们将对这部分进行重写

平谷区17788681878: 如何配置nginx 1.11.1 -
富使迪克: 配置nginx服务器只需要修改nginx.conf文件即可 修改完后进行保存,然后使用nginx -s reload重启即可 nginx.conf文件一般位于/etc/nginx/nginx.conf,找到你自己nginx配置文件位置后修改即可

平谷区17788681878: 如何使用Nginx配置文件
富使迪克: 编译Nginx时,configure脚本的--prefix选项可以设置Nginx的运行路径,比如:./configure –prefix=/home/Nginx,此时,安装后的Nginx将会放在/home/Nginx目录,而配置文件就会在/home/Nginx/conf目录下.如果你没有显式的指--prefix选项,默...

平谷区17788681878: 如何安装nginx -
富使迪克: 方法/步骤 1安装nginx前,我们首先要确保系统安装了g++、gcc、openssl-devel、pcre-devel和zlib-devel软件,可通过如图所示命令进行检测,如果以安装我们可以通过图二所示卸载2 我们一般安装linux软件都会在/usr/local目录下,然后进行解...

平谷区17788681878: 部署jar后怎么配置nginx -
富使迪克: Nginx配置如下:XML/HTML code?server { listen 80; server_name 这里写外网访问的域名; access_log 这里写访问日志文件路径; location / { proxy_pass 这里很重要,见下面注释; index index.jsp index index.html; } } Nginx是反向代理,proxy_pass 要指定Tomcat配置的访问方式,如果Tomcat是默认方式访问,就:proxy_pass http /localhost:8080 配的域名方式访问就把localhost改为域名.

平谷区17788681878: 如何正确配置 Nginx 和 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; } 这样就可以了

平谷区17788681878: lnmp安装中怎么配置nginx -
富使迪克: LNMP一键安装包安装好后,相应的Mysql,Nginx及PHP都会安装配置完成.由于某些特殊情况的需要,如何更换Nginx的版本呢?nginx升级脚本可以完成. 1、 手动编译方法:/usr/local/nginx删了再重新进入./lnmp0.8-full/nginx/1.0.10进行make...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网