Nginx和fastcgi 的调用关系

什么是fastcgi

要了解什么是fastcgi,首先必须了解什么是cgi。那么什么是cgi呢?百度百科给的解释是:“CGI全称是通用网管接口(Common GateWay Interface),HTTP服务器与你或者其他机器上的程序进行交流的一种工具,其程序一般运行在网络服务器上。CGI可以用任何一种语言编写,只要这用语言具有标准输入、输出和环境变量。如:PHP,perl,tcl等等”。

说白了cgi就是一个中间人,它根据web服务器的请求去调用对用的程序,比如这个请求的带有.php,很显然,这个一个访问php文件的请求,什么都不做的情况下。服务器会将php文件或者PHP文件的内容返回给客户端,但是显然客户端不是来要这玩意的。显然我们的web服务器不能处理这种请求,但是有人能做的了啊,我们可以在我们的服务器上安装上对应的软件,比如php,java等等。
可是并不是装上对应的解析器就完事的,等对用的请求来到的时候,他并不知道有人要他工作(当然你说它自己监听端口我也没话说,咱们不考虑那个),这个时候就需要有人通知他:“你该干活了”。
cgi的作用就是这样,每当有一个请求来的时候,web服务器会告诉操作系统生成一个cgi的进程,cgi会调用对应的程序完成解析,然后退出内存。
这种模式在访问量比较小的时候是没问题的,但是当我们的访问量大起来之后,反复的创建和销毁cgi会占用大量的系统开销,这个时候有人发明了fastcgi这种东西。
	fastcgi在web服务器启动的时候就exec了,有活就干活,没活也不会注销,而是一直等到有活的时候,虽然会一定程度上占用内存,但是会很大程度上提高效率。

什么是nginx

nginx是一款轻量级的Web服务器/反向代理服务器/电子邮件服务器,我们的web请求就是由它截获,然后调用fastcgi的。

nignx的配置文件

nginx的配置文件中很多地方使用了正则表达式,几个基础的有

  1. ~ 区分大小匹配。
  2. ~* 不区分大小匹配。
  3. !和!* 区分大小写匹配和不区分大小袭不匹配。

文件以及目录匹配

  1. -f和!-f表示文件是否存在
  2. -d和!-d判断是否存在目录
  3. -e和!-e判断是否存在文件或目录
  4. -x和!-x判断文件是否可执行

**rewrite指令的最后一项参数为flag标记,flag标记有:

  1. last 表示rewrite

  2. break表示本条规则之后停止匹配

  3. redirect返回302临时重定向。浏览器地址会显示跳转后的地址

  4. permanent表示301永久重定向,浏览器地址会显示跳转后的地址。

     使用last和break实现URI重写,浏览器地址栏不变。
     使用alias指令必须用last标记;
     使用proxy_pass指令时,需要使用break标记。
     Last标记在本条rewrite规则执行完毕后,会对其所在server{......}标签重新发起请求
     break标记则在本条规则匹配完成后,终止匹配。
    

nginx中关于fastcgi的配置

一般nignx都会把fastcgi的配置在server下面的location块里,比如

location ~ \.php(.*)$ {
         fastcgi_pass   127.0.0.1:9000;
         fastcgi_index  index.php;
         fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
         fastcgi_param  PATH_INFO  $fastcgi_path_info;
         fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
         include        fastcgi_params;
   }

上面的意思是在我们的server遇到web来的请求的时候会将符合 ~ .php(.*)$这种正则匹配的请求执行location的代码,他们的意思是:
fastcgi_pass 127.0.0.1:9000; nginx会通过fastcgi_pass 将用户请求资源发送给127.0.0.1:9000进行解析。众所周知,127.0.0.1 代表本机,所以上面的例子中php解析器和nginx在一台服务器上。

fastcgi_param 是一个很重要的指令,它的功能是:“指令指定的参数,将被传递给FastCGI-server。” 也就是说他的作用就是告诉fastcgi要做什么,并且是给予fastcgi在做事情的时候需要用到的参数和资源。

参数基本如下:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;#脚本文件请求的路径
fastcgi_param  QUERY_STRING       $query_string; #请求的参数;如?app=123
fastcgi_param  REQUEST_METHOD     $request_method; #请求的动作(GET,POST)
fastcgi_param  CONTENT_TYPE       $content_type; #请求头中的Content-Type字段
fastcgi_param  CONTENT_LENGTH     $content_length; #请求头中的Content-length字段。
 
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name; #脚本名称 
fastcgi_param  REQUEST_URI        $request_uri; #请求的地址不带参数
fastcgi_param  DOCUMENT_URI       $document_uri; #与$uri相同。 
fastcgi_param  DOCUMENT_ROOT      $document_root; #网站的根目录。在server配置中root指令中指定的值 
fastcgi_param  SERVER_PROTOCOL    $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。  
 
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;#cgi 版本
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;#nginx 版本号,可修改、隐藏
 
fastcgi_param  REMOTE_ADDR        $remote_addr; #客户端IP
fastcgi_param  REMOTE_PORT        $remote_port; #客户端端口
fastcgi_param  SERVER_ADDR        $server_addr; #服务器IP地址
fastcgi_param  SERVER_PORT        $server_port; #服务器端口
fastcgi_param  SERVER_NAME        $server_name; #服务器名,域名在server配置中指定的server_name
 
#fastcgi_param  PATH_INFO           $path_info;#可自定义变量
 
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;
 
在php可打印出上面的服务环境变量
如:echo $_SERVER['REMOTE_ADDR']

当然关于fastcgi的指令还有很多,详情请看:http://www.nginx.cn/doc/standard/httpfcgi.html

最后介绍一下关于正则表达式 ~ .php(.*)的意思:
: 上文已经介绍了 是区分大小写。
\ : 是转义的意思,因为“.”在正则表达式里是一个特殊字符,代表“匹配除“\n”之外的任何单个字符”。但是我们这里就是单纯的想匹配“.php”这四个字符,所以使用“\”将“.”转义。
php : 不解释了。
() : 表示分组,意思就是括号内是一个整体.
* : 表示匹配前面的子表达式零次或多次。
(.*) : 意思就是匹配除“\n”之外的任何单个字符 多次。
$ : 匹配输入字符串的结束位置。
综上所述,这个正则表达式的意思就是匹配一个字符串,这个字符串必须含有.php并且区分大小写。然后匹配.php后面所有的不是“\n”的所有字符,直到结尾。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值