前文我们聊了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_pass localhost:9000

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

fastcgi_pass Unix:/tmp/fastcgi.socket;

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

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

  3、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服务器执行并返回执行后的结果;

  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;:设置是否保持连接,默认情况下,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变量对应的配置指令文件;对于缓存,两者没有什么区别;

Nginx之反向代理配置(二)的更多相关文章

  1. nginx 反向代理配置(二)

    上一篇文章主要是对 nginx 各个模块做了一个介绍,以及对什么是反向代理在文章开头做了一个简单介绍,这篇文章我们主要来看下如何进行 nginx 反向代理的配置 proxy 模块      nginx ...

  2. nginx实现反向代理 配置多域名以及多端口号

    多个服务部署在同一个服务器,使用不同的端口. 一.思考过程 如果不想带上端口号,就只能访问 80 或 443 端口. 可以用过二级目录区分服务,通过反向代理转发到不同的 Server. 可以用过子域名 ...

  3. linux 安装 nginx 及反向代理配置

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,以下为Linux centos平台下安装nginx并配置反向代理的过程(采用源码安装的方式) 一:安装 ...

  4. Nginx之反向代理配置(一)

    前文我们聊了下Nginx作为web服务器配置https.日志模块的常用配置.rewrite模块重写用户请求的url,回顾请参考https://www.cnblogs.com/qiuhom-1874/p ...

  5. nginx反向代理配置两个不同服务器

    1.什么是反向代理通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Inter ...

  6. docker配置nginx做反向代理管理tomcat应用

    由于业务开始复杂,单一tomcat已经不足以满足业务需求,多tomcat部署起来不方便而且面临域名解析问题,因此开始增加反向代理,由于docker的易用性,便使用docker管理各个应用. docke ...

  7. nginx之旅(第三篇):代理、正向代理、反向代理、代理的原理、nginx反向代理场景、nginx反向代理配置、nginx反向代理语法

    一.代理服务与反向代理 什么是代理服务 代理-代理办理(代理理财.代理收货.代理购物等等). 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forw ...

  8. nginx的反向代理和配置

    最近有打算研读nginx源代码,看到网上介绍nginx可以作为一个反向代理服务器完成负载均衡.所以搜罗了一些关于反向代理服务器的内容,整理综合. 一  概述 反向代理(Reverse Proxy)方式 ...

  9. Nginx 安装以及反向代理配置(windows)

    安装 windows 下 Nginx 安装非常简单,下载地址 http://nginx.org/en/download.html. 选择红框这个,下载下来是个 zip 文件,解压.这时我们双击根目录的 ...

随机推荐

  1. Codeforces Round #576 (Div. 2) D. Welfare State

    http://codeforces.com/contest/1199/problem/D Examples input1 output1 input2 output2 Note In the firs ...

  2. 52)PHP,加了单例模式的数据库代码

    <?php class db { public $host ;//= "localhost";//定义默认连接方式 public $User;//= "root&q ...

  3. 头次接触wamp服务器、xampp,初次单独使用tomcat部署

    刚刚经过了近两天的接触wamp.xampp.tomcat的时光,真的爽 导师有个网站打不开了,就让我去弄,还有一个网站的后台密码忘了,让我帮忙找回来.我第一感觉就是第一个活不简单,第二个还不简单吗?打 ...

  4. 吴裕雄--天生自然 R语言开发学习:基础知识

    1.基础数据结构 1.1 向量 # 创建向量a a <- c(1,2,3) print(a) 1.2 矩阵 #创建矩阵 mymat <- matrix(c(1:10), nrow=2, n ...

  5. 吴裕雄--天生自然 Hadoop大数据分布式处理:关闭CenterOS 7防火墙

    使用命令:systemctl status firewalld.service 查看防火墙状态 执行后可以看到绿色字样标注的“active(running)”,说明防火墙是开启状态 使用命令:syst ...

  6. The Pomodoro Technique

    目录 简介 What to solve How to use Some applications 自我总结 结束语 简介 番茄工作法是简单易行的时间管理方法,是由弗朗西斯科·西里洛于1992年创立的一 ...

  7. android高仿抖音、点餐界面、天气项目、自定义view指示、爬取美女图片等源码

    Android精选源码 一个爬取美女图片的app Android高仿抖音 android一个可以上拉下滑的Ui效果 android用shape方式实现样式源码 一款Android上的新浪微博第三方轻量 ...

  8. echart封装,前端简单路由,图表设置自动化

    https://github.com/cclient/EhartDemoSetByAngular 后端node.js 前端插件 echart,jquery,jqueryui,datapicker,an ...

  9. 吴裕雄--天生自然python学习笔记:Python3 输入和输出

    输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数. 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用. 如果你希望输出的 ...

  10. Python---12函数式编程------12.2返回函数

    返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ...