在本节,你将学会:

--如何根据不同的协议,将请求转发到后端服务器;

--修改发送到后端服务器的请求头;

--以及配置是否buffering从后端服务器返回来的响应。

1. 将请求转发给后端服务器

当nginx代理一个请求时,它会将请求转发给一个指定的后端服务器,然后从后端服务器获取相应,最后将响应返回给用户。

可以将请求代理给一个HTTP服务器(nginx服务器或者apache服务器或者lighttpd服务器),也可以代理给一个非HTTP服务器(这个服务器运行着一个应用程序,该应用程序可能

是由PHP开发的,也可能是由Python开发的),这个非HTTP服务器可能使用的是一种特殊的协议。特殊的协议指的是:FastCGI,uwsgi,SCGI,或者是memcached。

将请求转发给后端的HTTP服务器:

location /some/path/ {
proxy_pass http://www.example.com/link/;
}
location ~ \.php {
proxy_pass http://127.0.0.1:8000;
}

注意第一个例子中的意思:假如我的URI是/some/path/page.html,那么转发之后,实际请求的是http://www.example.com/link/page.html。

如果http://www.example.com后面没有跟/link/,或者说无法决定要替换URI中的哪个部分,那么请求中的整个URI会原样的转发给后端服务器。

将请求转发给后端的非HTTP服务器:

fastcgi_pass    将请求转发给一个fastcgi服务器

uwsgi_pass     将请求转发给一个uwsgi服务器

scgi_pass      将请求转发给一个scgi服务器

memcached_pass  将请求转发给一个memcached服务器

注意:在这些指令后面,指定后端服务器的格式不一样,携带的参数也不一样,所以需要注意。

请查看详细文档:http://nginx.org/en/docs/?_ga=1.239185987.1593816507.1472003628

2.转发请求头

默认的,nginx会修改被转发请求中的2个头字段,一个是"Host",一个是"Connection"。并消除字段值为空字符串的字段。

"Host"的值会设置为$proxy_host变量的值,"Connection"的值会设置为close。

可以在http块中,server块中,location块中修改头字段:

location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}

如果不想让请求中的某个字段转发到后端服务器上,可以将其设置为空字符串:

location /some/path/ {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:8000;
}

3.设置buffers

默认情况下,nginx会将后端服务器发过来的响应先缓冲在本地的buffers中,等到整个响应接收完毕后,才发送给用户。

对于接收很慢的用户,我的nginx不可能为了满足你而放慢脚步。你一次只能接受1字节,我就传1字节。这样我的nginx就完全拖慢了。

所以nginx会先将后端服务器发过来的响应缓冲起来,等到整个请求接收完毕后,再发给用户。你用户慢慢去接收,我还要服务别的用户。

如果后端服务器每发送部分响应,nginx都直接返回给用户,这叫做同步操作。

开启或关闭buffering,由proxy_buffering控制,默认值是on。

proxy_buffers

proxy_buffer_size

后端服务器返回来的响应,它的第一部分存储在一个单独的buffer中,它的大小由proxy_buffer_size来设置。

location /some/path/ {
proxy_buffers 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}

上面的设置中,buffer的数量为16,比默认的数量多,每个buffer的大小4K。

我们为响应中第一部分设置的单个buffer的大小是2K,比默认的小。

如果关闭buffering,那么对于快速交互用户是有好处的,因为用户能快速接收响应。

关闭某个location的buffering功能:

location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}

4. 选择一个出口IP(用哪个网卡去连接后端服务器)

location /app1/ {
proxy_bind 127.0.0.1;
proxy_pass http://example.com/app1/;
} location /app2/ {
proxy_bind 127.0.0.2;
proxy_pass http://example.com/app2/;
}
location /app3/ {
proxy_bind $server_addr;
proxy_pass http://example.com/app3/;
}

上面的$server_addr变量代表的是:接收请求的网卡,nginx从这个网卡接收的请求,就从这个网卡去连接后端服务器。

nginx学习之反向代理篇(六)的更多相关文章

  1. Nginx设置Https反向代理,指向Docker Gitlab11.3.9 Https服务

    目录 目录 1.GitLab11.3.9的安装 2.域名在阿里云托管,申请免费的1年证书 3.Gitlab 的 https 配置 4.Nginx 配置 https,反向代理指向 Gitlab 配置 目 ...

  2. Nginx学习笔记之应用篇

    Nginx服务器的安装请参考Nginx学习笔记之安装篇 关于Nginx配置文档的API在这里就不一一列出,现在我们来配置第一个Nginx架构实现负载均衡的网站. 1.打开IIS,配置如下站点 重复上述 ...

  3. nginx二级域名反向代理

    nginx二级域名反向代理 添加两个开发测试的域名 test.xxx.com :8088 testmobile.xxx.com: 8089 内网地址:127.0.0.1 外网地址:127.0.0.1 ...

  4. Nginx 七层反向代理

    目录 1.代理 2.正向代理 3.反向代理 4.Nginx 反向代理 5.Nginx 反向代理相关指令介绍 ①.listen ②.server_name ③.location ④.proxy_pass ...

  5. 【转】Nginx服务器的反向代理proxy_pass配置方法讲解

    [转]Nginx服务器的反向代理proxy_pass配置方法讲解 转自:http://www.jb51.net/article/78746.htm 就普通的反向代理来讲Nginx的配置还是比较简单的, ...

  6. nginx是一个反向代理的软件

    nginx只是一个反向代理的软件,和语言无关,理论上支持任何Web平台,当然http://Asp.net也不例外,http://51aspx.com就是http://Asp.net开发的,前端暴漏的是 ...

  7. Nginx+Tomcat实现反向代理及动静分离

    Nginx+Tomcat实现反向代理及动静分离 时间 2014-07-07 15:18:35  51CTO推荐博文 原文  http://yijiu.blog.51cto.com/433846/143 ...

  8. Nginx 之六: Nginx服务器的反向代理功能

    一:Nginx作为正向代理服务器: 1.正向代理:代理(proxy)服务也可以称为是正向代理,指的是将服务器部署在公司的网关,代理公司内部员工上外网的请求,可以起到一定的安全作用和管理限制作用,正向代 ...

  9. 五、Nginx多Server反向代理配置

    Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活,如果你要做多用户博客,那么每个用户拥有自己的二级域名也就很容易实现了. server_name的匹配顺序 Nginx中的s ...

随机推荐

  1. Web项目中用mybatis配置多个数据库

    需要在项目中配置多个数据库(比如一个mysql,一个oracle)的时候,可按照如下方式配置 首先是第一个数据库的配置 <bean name="transactionManager&q ...

  2. 倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 88怎么办

    请确认在TWINCAT在线模式下,把Drive的Modes of operation改为8       更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com ...

  3. vue-router 导航守卫

    记住参数或查询的改变并不会触发进入/离开的导航守卫.你可以通过观察 $route 对象来应对这些变化,或使用 beforeRouteUpdate 的组件内守卫. 1.全局守卫 const router ...

  4. 测试代码覆盖率工具学习(Android Emma)

    博客分类: 工具分享 eclipseeclemmaemmatestng       关于eclemma的历史和怎么安装,请参考http://www.ibm.com/developerworks/cn/ ...

  5. .net 定时服务

    namespace MvcApplication1 { public class MvcApplication : System.Web.HttpApplication { protected voi ...

  6. 阿里CI/CD、DevOps、分层自动化技术

    原文地址:http://www.infoq.com/cn/news/2017/01/alibaba-yunxiao-cicd-devops 在互联网时代,产品快速迭代的重要性不言而喻.不管是传统企业还 ...

  7. 约瑟夫环用php实现

    百度百科的解释:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数 ...

  8. Input 银行卡验证

    $("#card_num").keyup(function(){ var op=""; var t=$("#card_num").val() ...

  9. 【Linux 驱动】设备驱动程序再理解

    学习设备驱动编程也有一段时间了,也写过了几个驱动程序,因此有对设备驱动程序有了一些新的理解和认识,总结一下.学习设备驱动编程也有一段时间了,也写过了几个驱动程序.因此有对设备驱动程序有了一些新的理解和 ...

  10. 从头认识Spring-1.15 对SpEl的值的操作(1)-数值运算

    这一章节我们来讨论一下对SpEl的值的运算. 1.domain 烤炉类:(不变) package com.raylee.my_new_spring.my_new_spring.ch01.topic_1 ...