Nginx之反向代理配置(二)

  前文咱们聊了Nginx的防盗链、反向代理以及开启nginx代理缓存,回顾请参考http://www.javashuo.com/article/p-cdnpatub-p.html;今天咱们继续说nginx的反向代理,上一篇主要就说了下nginx反向代理http协议的使用,被代理RUL包含和不包含RUI的处理逻辑;咱们能够把这种先后端都用一样的协议理解为同构代理,就是说前端用户访问nginx是http或https协议,代理服务器访问后端的真正提供服务的服务器也是基于http协议,这种先后端都是使用同一种协议,咱们就说这是同构;同理有同构就有异构,异构就是先后端使用的协议不一样,好比前端用户使用http或https协议,代理和后端服务器使用fastcgi协议,这种就叫异构;互联网上绝大部分网站都不是纯html静态网页,不少网站都是有本身的应用服务器,好比,咱们用户访问的数据是须要一段脚本,或者某一程序执行后的数据,那么咱们就把后面须要执行脚本的服务器叫应用服务器;nginx做为web服务器它虽然有不少功能,可是它本身没有执行某些脚本的能力好比php脚本,通俗的讲,nginx只能够处理静态文本,不能本身执行php脚本(需借助其余应用服务器),它和httpd相似,httpd还能够动态的加载php模块,让其拥有执行php脚本的能力,nginx没有,为了实现这样的功能,nginx就支持经过fastcgi协议向后端代理客户端请求一个本身不能处理的资源;固然相似的协议还有不少好比,scgi、uwsgi等等;像这种异构的架构上,它的原理是这样的,客户端请求某一脚本资源,好比,index.php这个文件,若是咱们不把用户的请求代理到后端应用服务器上,客户端看到的数据是index.php里的脚本内容,这显然是不合情理的;那怎么办呢?一般状况咱们须要在nginx服务器上配置,用户访问某某.php结尾的URL时,咱们就让它干吗干吗,经过这种匹配用户的URL去作代理,把用户的请求代理到后端服务器,让后端应用服务器把脚本执行完,而后把执行后的数据返回给代理,再由代理响应给客户端;若是是后端应用服务器须要某些数据,须要到数据库里去拿数据,极可能应用服务器此时还会扮演客户端角色,经过某种协议去数据库拿数据;咱们能够看到最终咱们用户看到的网页里的内容,它来自不少服务器,因此说一个动态网站上由不少台服务器共同完成一个处理请求的结果,咱们能够理解成,每一个服务器处理本身擅长的事务,分工合做,最后把处理好的数据由代理响应给客户端;php

  ngx_http_fastcgi_module:此模块实现了nginx容许将用户请求代理至fastcgi 服务器html

    一、fastcgi_pass address:设置fastcgi服务器的地址,此地址能够是IP加端口的形式,也能够是域名或者UNIX域套接字路径;此选项可用于location 和if in location 配置段中前端

  示例nginx

fastcgi_pass localhost:9000

  提示:以上配置意思是,经过fastcgi协议反代本机的9000端口上的服务响应;web

fastcgi_pass Unix:/tmp/fastcgi.socket;

  提示:以上表示设置fastcgi地址是本机/tmp/fastcgi.socket文件;数据库

  二、fastcgi_index name;设置fastcgi的默认主页资源名称;此指令可用于http、server、location配置段中vim

  三、fastcgi_param parameter value [if_not_empty]:设置一个参数,用于传递给后端fastcgi服务器,参数的值能够是文本,变量,或者两者的组合。后端

  示例浏览器

fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;

  提示:以上配置表示把SCRIPT_FILENAME等于/home/www/scripts/php$fastcgi_script_name传递给fastcgi服务器,$fastcgi_script_name表示用户请求的脚本名称;意思是告诉fastcgi服务器该把那个脚本执行了返回给客户端(这里的客户端一般指代理服务器)缓存

fastcgi_param QUERY_STRING $query_string;

  提示:咱们知道一个脚本传递不一样的参数,执行的结果就会不一样;以上配置表示把请求的脚本的参数经过QUERY_STRING变量保存,并传递给后端fastcgi服务器,让其运行某脚本时,把QUERY_STRING保存的值做为参数传递给脚本;固然咱们向后端传递的东西不少,不便一一写出来,也不太可能一一写到配置文件中,在nginx的配置目录里有一个文件,专门存放nginx上的变量对应后端fastcgi服务器上的变量的一个配置文件fastcgi.conf  一般咱们把这个配置文件用include指令来导入到咱们须要定义nginx变量经过fastcgi变量传递给fastcgi服务器;

  示例

location ~* \.php$ {
	root           /usr/share/nginx/html;
	fastcgi_pass   127.0.0.1:9000;
	fastcgi_index  index.php;
	fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
	include        fastcgi_params;
}

  提示:以上配置表示匹配用户URI,若是用户URI是以.php结尾的,就经过fastcgi协议代理至本机的127.0.0.1:9000端口进行处理(执行),fastcgi服务器默认主页资源名叫index.php,并告诉fastcgi服务器到/usr/share/nginx/html/下去找用户请求的资源脚本,若是还有其余参数和指令要传递,就使用/etc/nginx/fastcgi_params中的定义来把nginx的变量保存的值传递给后端fastcgi服务器,以上是反代动态php网页的配置示例,有了以上配置 nginx就能够做为代理服务器响应客户端请求动态脚本php的能力了;

[root@www nginx]# vim /etc/nginx/conf.d/proxy.conf 
  


server {

        server_name www.test.com;

        proxy_cache proxy_cache;
#       proxy_cache_key $request_uri;
#       proxy_cache_methods GET HEAD;
        proxy_cache_valid 200 302 15m;
        proxy_cache_valid 404 1m;
#       proxy_cache_use_stale http_500 http_502;
        location  /en/docs/ {
                proxy_pass http://nginx.org;
        }
        location ~* /(.*).php$ {
                root /app/php_scripts;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /app/php_scripts$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }
}
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
"conf.d/proxy.conf" 23L, 500C written
[root@www nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@www nginx]# mkdir /app/php_scripts -p
[root@www nginx]# cat >> /app/php_scripts/test.php 
<?php
        phpinfo();
?>
^C
[root@www nginx]# cat /app/php_scripts/test.php 
<?php
        phpinfo();
?>
[root@www nginx]# nginx -s reload
[root@www nginx]# 

  提示:在上面配置前须要先安装好php-fpm,安装好后须要更改/etc/php-fpm.d/www.conf里的user 和group,一般状况要看前端代理是用那个用户启动的,咱们后端就用那个用户启动便可,咱们前端代理商nginx,这里须要更改为nginx便可,这样修改后,保存配置,而后启动php-fpm,而后在本机就能够看到127.0.0.1:9000就处于监听状态了;以上配置表示用户请求.php结尾的资源都反代至127.0.01:9000进行处理;而且明确说明了后端fastcgi主页资源名称为index.php,后端应用服务器的根路径为/app/php_scripts;fastcgi_param  SCRIPT_FILENAME /app/php_scripts$fastcgi_script_name同nginx里的root alias指令的做用相同,指定用户访问的URI对应磁盘上的路径,至关于指定后端fastcgi服务器的工做目录吧;

  提示:能够看到咱们访问test.php是可以被php-fpm服务器执行并返回执行后的结果;

  四、fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];此指令同proxy_cache_path同样,做用定义fastcgi的代理缓存;其中levels表示定义缓存目录的级别,最多3级,每级最多2个字符;keys_zone=name:size表示k/v映射的内存空间的名称及大小;inactive=time表示非活动时长;max_size=size表示指定磁盘上用于缓存路径的存放缓存的空间上限;

  五、fastcgi_cache zone |off;调用指定的缓存空间来缓存数据;可用于http,server,location配置段中

  六、fastcgi_cache_key string;定义用做缓存项的key的字符串;

  七、fastcgi_cache_methods GET|HEAD|POST ……;定义那些请求方法使用缓存;默认是GET和HEAD

  八、fastcgi_cache_min_uses number;定义缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认为活动的缓存项,不被清理;

  九、fastcgi_cache_valid[code] tiem;设定不一样的响应码各自缓存的时长;

  十、fastcgi_keep_conn on | off;:设置是否保持链接,默认状况下,FastCGI服务器将在发送响应后当即关闭链接。可是,当这个指令被设置为值on时,nginx将指示FastCGI服务器保持链接打开。

  示例

   提示:在定义缓存空间时,必需要在http配置段定义,以上表示定义一个fastcgi的缓存空间,其名称为php_cache,在内存中使用10m的空间,在物理磁盘上的路径为/cache/proxy/php-fpm/目录下,最大空间为2g;

   提示:以上配置表示使用fastcgi的缓存空间php_cache,缓存key为$request_uri,就是把用户请求的uri hash做为缓存路由,什么意思呢,就是nginx查找缓存是经过hash什么来查找缓存的,上面的配置就是定义nginx把用户请求的URI做为hash对象;对用户请求用的方法是GET 或HEAD方法时,使用缓存;缓存最小命中次数为3次,也就说在非活动时长内,该缓存项命中次数小于3次就会被认为该缓存是无效的,在下次检查缓存的有效性,就会被清理;对响应码是200 或302的资源缓存15分钟,对404响应码的资源缓存1分钟;开启和后端的fastcgi服务器的长链接;

  提示:能够看到咱们访问test.php页面时,在咱们定义的缓存空间里生成了缓存,可是咱们访问了test.php这一个页面,为何会缓存三项呢?其实咱们能够打开浏览器的web开发者模式,查看它请求和响应的状况

   提示:能够看到咱们访问test.php这个页面,其背后是3次请求,因此咱们在缓存空间里看到有三条缓存项,其实缓存空间里的缓存项每个缓存项就表明一个缓存资源,咱们是能够经过cat命令查看缓存项里的内容的;以下

   提示:咱们能够看到里面的缓存项纪录的信息,其中有一项KEY 就是咱们指定的fastcgi_cache_key 说指定变量的值;咱们查看缓存项里的内容极可能出现乱码,缘由是缓存的内容有二进制,或者其余字符编码的内容;

  以上就是nginx做为反向代理服务器代理动态资源的介绍,总结一点,nginx代理动态资源和代理http资源的思想是相似的,只是使用的指令不同;尤为对于缓存,二者的思想几乎彻底一致,只是使用的模块和指令不一样而已;对于动态资源咱们除了要指定被代理的地址外,还须要指定被代理端资源路径,导入nginx变量与fastcgi变量对应的配置指令文件;对于缓存,二者没有什么区别;

相关文章
相关标签/搜索