前文我们聊了Nginx的防盗链、反向代理以及开启nginx代理缓存,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12417130.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去做代理,把用户的请求代理到后端服务器,让后端应用服务器把脚本执行完,然后把执行后的数据返回给代理,再由代理响应给客户端;如果是后端应用服务器需要某些数据,需要到数据库里去拿数据,很可能应用服务器此时还会扮演客户端角色,通过某种协议去数据库拿数据;我们可以看到最终我们用户看到的网页里的内容,它来自很多服务器,所以说一个动态网站上由很多台服务器共同完成一个处理请求的结果,我们可以理解成,每个服务器处理自己擅长的事务,分工合作,最后把处理好的数据由代理响应给客户端;
ngx_http_fastcgi_module:此模块实现了nginx允许将用户请求代理至fastcgi 服务器
1、fastcgi_pass address:设置fastcgi服务器的地址,此地址可以是IP加端口的形式,也可以是域名或者UNIX域套接字路径;此选项可用于location 和if in location 配置段中
示例
提示:以上配置意思是,通过fastcgi协议反代本机的9000端口上的服务响应;
提示:以上表示设置fastcgi地址是本机/tmp/fastcgi.socket文件;
2、fastcgi_index name;设置fastcgi的默认主页资源名称;此指令可用于http、server、location配置段中
3、fastcgi_param parameter value [if_not_empty]:设置一个参数,用于传递给后端fastcgi服务器,参数的值可以是文本,变量,或者二者的组合。
示例
提示:以上配置表示把SCRIPT_FILENAME等于/home/www/scripts/php$fastcgi_script_name传递给fastcgi服务器,$fastcgi_script_name表示用户请求的脚本名称;意思是告诉fastcgi服务器该把那个脚本执行了返回给客户端(这里的客户端通常指代理服务器)
提示:我们知道一个脚本传递不同的参数,执行的结果就会不同;以上配置表示把请求的脚本的参数通过QUERY_STRING变量保存,并传递给后端fastcgi服务器,让其运行某脚本时,把QUERY_STRING保存的值作为参数传递给脚本;当然我们向后端传递的东西很多,不便一一写出来,也不太可能一一写到配置文件中,在nginx的配置目录里有一个文件,专门存放nginx上的变量对应后端fastcgi服务器上的变量的一个配置文件fastcgi.conf 通常我们把这个配置文件用include指令来导入到我们需要定义nginx变量通过fastcgi变量传递给fastcgi服务器;
示例
提示:以上配置表示匹配用户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的能力了;
提示:在上面配置前需要先安装好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服务器执行并返回执行后的结果;
4、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表示指定磁盘上用于缓存路径的存放缓存的空间上限;
5、fastcgi_cache zone |off;调用指定的缓存空间来缓存数据;可用于http,server,location配置段中
6、fastcgi_cache_key string;定义用作缓存项的key的字符串;
7、fastcgi_cache_methods GET|HEAD|POST ……;定义那些请求方法使用缓存;默认是GET和HEAD
8、fastcgi_cache_min_uses number;定义缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认为活动的缓存项,不被清理;
9、fastcgi_cache_valid[code] tiem;设定不同的响应码各自缓存的时长;
10、fastcgi_keep_conn on | off;:设置是否保持连接,
示例
提示:在定义缓存空间时,必须要在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 说指定变量的值;我们查看缓存项里的内容很可能出现乱码,原因是缓存的内容有二进制,或者其他字符编码的内容;