ngin和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的配置文件中很多地方使用了正则表达式,几个基础的有:
- ~ 区分大小匹配。
- ~* 不区分大小匹配。
- !和!* 区分大小写匹配和不区分大小袭不匹配。
文件以及目录匹配:
- -f和!-f表示文件是否存在
- -d和!-d判断是否存在目录
- -e和!-e判断是否存在文件或目录
- -x和!-x判断文件是否可执行
**rewrite指令的最后一项参数为flag标记,flag标记有:
-
last 表示rewrite
-
break表示本条规则之后停止匹配
-
redirect返回302临时重定向。浏览器地址会显示跳转后的地址
-
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”的所有字符,直到结尾。