Nginx+php配置文件及原理解析


Posted in PHP onDecember 09, 2020

采用nginx+PHP作为webserver的架构模式,在现如今运用相当广泛。然而第一步需要实现的是如何让nginx正确的调用php。由于nginx调用php并不是如同调用一个静态文件那么直接简单,是需要动态执行php脚本。所以涉及到了对nginx.conf文件的配置。这一步对新手而言一般需要网上查资料,对于一般的熟手而言,也有不少同学并没有搞透彻为何要如此这般配置。本文的主要内容为如何在nginx server中正确配置php调用方法,以及配置的基本原理。

一、nginx+php运行原理:

首先简单的讲一讲原理,目前主流的nginx+php的运行原理如下:

1、nginx的worker进程直接管理每一个请求到nginx的网络请求。

2、对于php而言,由于在整个网络请求的过程中php是一个cgi程序的角色,所以采用名为php-fpm的进程管理程序来对这些被请求的php程序进行管理。php-fpm程序也如同nginx一样,需要监听端口,并且有master和worker进程。worker进程直接管理每一个php进程。

3、关于fastcgi:fastcgi是一种进程管理器,管理cgi进程。市面上有多种实现了fastcgi功能的进程管理器,php-fpm就是其中的一种。再提一点,php-fpm作为一种fast-cgi进程管理服务,会监听端口,一般默认监听9000端口,并且是监听本机,也就是只接收来自本机的端口请求,所以我们通常输入命令 netstat -nlpt|grep php-fpm 会得到:

tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1057/php-fpm

这里的127.0.0.1:9000 就是监听本机9000端口的意思。

4、关于fastcgi的配置文件,目前fastcgi的配置文件一般放在nginx.conf同级目录下,配置文件形式,一般有两种:fastcgi.conf 和 fastcgi_params。不同的nginx版本会有不同的配置文件,这两个配置文件有一个非常重要的区别:fastcgi_parames文件中缺少下列配置:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

我们可以打开fastcgi_parames文件加上上述行,也可以在要使用配置的地方动态添加。使得该配置生效。

5、当需要处理php请求时,nginx的worker进程会将请求移交给php-fpm的worker进程进行处理,也就是最开头所说的nginx调用了php,其实严格得讲是nginx间接调用php。
了解了上面的这五个简单原理,在nginx中配置php调用方法就变得易如反掌。

二、配置文件:

直接贴上代码逐行进行讲解,此处贴出一个能正常启动php脚本的最简nginx vhost配置:

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这类cgi脚本程序,只要理解了我开头提到的5点原理,然后结合5-7行配置讲解,完全可以较清晰的明白为什么需要这样配置了。对于新手而言,往往被fastcgi,php-fpm cgi程序搞得一头雾水,胡乱配置已通,跑通上线,也不去深究其原理。所以希望写在这里的东西能对读者带来一点点的帮助。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php zip文件解压类代码
Dec 02 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
ThinkPHP之N方法实例详解
Jun 20 PHP
php+mysql查询优化简单实例
Jan 13 PHP
php session 写入数据库
Feb 13 PHP
Laravel手动分页实现方法详解
Oct 09 PHP
php解析base64数据生成图片的方法
Dec 06 PHP
PHP创建自己的Composer包方法
Apr 09 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
Apr 20 PHP
Swoole源码中如何查询Websocket的连接问题详解
Aug 30 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 #PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 #PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 #PHP
PHP大文件分割分片上传实现代码
Dec 09 #PHP
PHP rsa加密解密算法原理解析
Dec 09 #PHP
PHP如何解决微信文章图片防盗链
Dec 09 #PHP
PHP sdk文档处理常用代码示例解析
Dec 09 #PHP
You might like
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
php 魔术方法详解
2014/11/11 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
PHP 8新特性简介
2020/08/18 PHP
js压缩利器
2007/02/20 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
python脚本实现统计日志文件中的ip访问次数代码分享
2014/08/06 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
python数据处理实战(必看篇)
2017/06/11 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
《姥姥的剪纸》教学反思
2014/02/25 职场文书
借款协议书
2014/04/12 职场文书
房产公证委托书范本
2014/09/20 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
违纪检讨书范文
2015/01/27 职场文书
如何写辞职书
2015/02/26 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL