nginx 不懂 php,它可以把客户对 php 应用的请求转发给懂 php 的服务器,这台服务器会解释 php ,然后把处理好的内容再交给 nginx ,nginx 再把这些内容发送到客户那里去。这里,nginx 的作用就是一个代理服务器(Proxy Server),这个解释 php 用的服务器是上游服务器(Upstream Server),通常就是使用 FastCGI 类型的服务器,你可以把 php-fpm 想成是 php 版本的 FastCGI 服务器。
代理服务器,用现实生活的例子解释一下,它就像是房产中介,你打算租个房子,找到了房产中介,他会为你联系房主,把你的需求说一下,房主把他的意思转达给房产中介,房产中介又会从房主那里得来的消息转达给你。代理服务器就是,接到客户的请求以后,把请求转发给其它的服务器,它们处理好请求以后会把结果再交给代理服务器,然后由代理服务器把信息再传递给发出这个请求的客户那里。
在 nginx 的配置文件里,可以使用 fastcgi_pass 这个指令去指定 FastCGI 服务器。nginx 跟 FastCGI 服务器交流的方式用的是 FastCGI 协议,如果直接把客户的 http 请求转发给 FastCGI 服务器,它是不认识这些请求的,你需要用一种方法把 http 的请求解释成 FastCGI 能懂的请求,这个解释的工作就是去设置一些 FastCGI 参数,这些参数可以使用 nginx 的 fastcgi_param 指令去设置,它的值分成两部分,一部分是 FastCGI 参数,另一部分是对应的值。
在介绍 nginx 配置的时候,我们在 /etc/nginx/conf.d 这个目录下创建了一个叫 ninghao.dev.conf 的配置文件,现在它看起来是这样的:
server { listen 80; server_name ninghao.dev www.ninghao.dev; root /vagrant/main/public; }
下面去改造一下这个配置,在 server 配置区块的里面,添加一个 location 区块,在它里面,可以匹配用 .php 结尾的请求,然后指定一下 FastCGI 服务器的地址,再加上几个解释用的参数。
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
location 后面的 ~ \.php$ 表示请求里用 .php 结尾,fastcgi_pass 指令设置了把请求转发到的那个 FastCGI 服务器的地址是 127.0.0.1:9000 ,这个 FastCGI 服务器跟 nginx 服务器在同一台主机上。fastcgi_param 指令设置了两个解释,REQUEST_METHOD 是 FastCGI 的参数,它的值设置成了一个变量 $request_method,这个变量的值会包含客户用的 http 方法。SCRIPT_FILENAME,请求的脚本文件,它的值设置成了两个变量的组合,$document_root,这个变量就是 root 指令的值, $fastcgi_script_name 这个变量里面会包含请求的脚本文件的名字,也就是 php 文件的名字。
保存文件,先测试一下配置 nginx -t
,再重新加载 nginx ,service nginx reload
。 现在定义的这个 nginx 服务器就可以接受对 php 应用的请求了。注意也要确定你的 FastCGI 服务器已经运行了,用 service php-fpm status
看一下,没运行的话,可以用 service php-fpm start
启动它。下面去测试一下,在这个服务器的根目录下面,创建一个叫 phpinfo.php 的文件,这个文件里的内容是:<?php phpinfo(); ?>
,在浏览器打开这个 php 文件,一切正常,你会看到下面这样的页面:
FastCGI 还有很多可以设置的参数,你可以把这些设置单独放到一个文件里,nginx 默认会给我们一个这样的配置文件,就是 fastcgi.conf ,在配置里可以用 include 指令把这个文件直接包含进来,这个文件里包含之前我们手工设置的两个参数,所以,可以去掉它们,像这样:
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi.conf; }
下面,我们可以在 server 配置里面,再用一个 index 指令,去设置一下默认打开的文件,可以加上 index.php 。现在,整个服务器的配置看起来是这样的:
server { listen 80; server_name ninghao.dev www.ninghao.dev; root /vagrant/main/public; index index.php index.html index.htm; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi.conf; } }
[todo:需要技术审查]
路径 FastCGI php-fpm nginx
评论
php-fpm running
nginx也显示ok
在server中
server {
listen 80;
server_name miyogurt.com www.miyogurt.com;
root /vagrant/main/public;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
hosts文件也添加了,ping正常。
但是打开的时候
您访问的网页出错了!
(连接错误)
9 年 10 个月 以前
html静态文件是正常的
9 年 10 个月 以前
按文章里的最后一段的配置,在 location 里,用了一个 include fastcgi.conf 。记得重新加载 nginx,用 service nginx reload,
9 年 10 个月 以前
成功了,加上include,而且index.php忘记添加了,加上就正常了。
9 年 10 个月 以前
用http://ninghao.dev/phpinfo.php访问网页,显示网页不存在或已删除
9 年 10 个月 以前
原文:“下面去测试一下,在这个服务器的根目录下面,创建一个叫 phpinfo.php 的文件,这个文件里的内容是:<?php phpinfo(); ?> 。”应该是创建一个index.php,而不是phpinfo.php。
9 年 9 个月 以前
下面去测试一下,在这个服务器的根目录下面,创建一个叫 phpinfo.php 的文件,这个文件里的内容是:<?php phpinfo(); ?> 。应该是创建一个index.php,而不是phpinfo.php。
9 年 9 个月 以前
clear!
9 年 8 个月 以前
皓哥,报告错误,“An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.” 如何处理?
8 年 7 个月 以前
这里有一个完整版的 LEMP 搭建过程,您参考一下:http://ninghao.net/blog/3630
8 年 7 个月 以前
皓哥,跟着教程走完之后,显示403 forbidden
error.log内容是
2017/03/02 05:02:49 [error] 29107#0: *1 "/home/vagrant/www/index.php" is forbidden (13: Permission denied), client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "localhost:8080"
确定文件夹和文件都存在。
并且vagrant和www的权限都改为了755,这是咋回事呢。
▽
server {
listen 8080;
root /home/vagrant/www;
index index.php index.html;
7 年 9 个月 以前
server {
listen 8080;
root /home/vagrant/www;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
7 年 9 个月 以前
已经解决了。原因是因为没有关闭SELinux
7 年 9 个月 以前
收到。
7 年 8 个月 以前
处理 php 的地方是不是少了一行配置?忘记加载 fastcgi 参数文件了。
7 年 8 个月 以前