Nginx代理服务1--正反向代理及缓冲

  代理服务是Nginx的核心所在,早期在没有代理的时候,客户端直接和服务端进行交互,如下图所示:



  当有了代理之后,客户端和服务端直接的交互方式有了改变,代理负责对请求和响应进行转发。代理可以过滤请求也可以对响应做相应的改变,让服务端发挥的空间更大


有代理

代理的分类:

-正向代理

  正向代理可以帮助客户端访问无法直接访问的资源,当用户想访问国外无法直接访问的资源时,可以先去访问代理,然后由代理去帮忙寻找资源,然后返回给客户端,所以它和客户端的关系好~~如下图所示:


正向代理

-反向代理

  反向代理是为服务端服务的,当用户通过域名去访问某个资源的时候,代理会自动的寻找服务端的某台机器上的资源,这些都是对客户端透明的,客户端感知就只有一个服务端机器。


反向代理

正向代理和反向代理的区别:

  正向代理和反向代理在形式上服务的对象不一样。正向代理代理的对象是客户端,为客户端服务,反向代理的对象是服务端,为服务端服务。

Nginx可支持的代理协议

  Nginx支持的代理协议很多,有HTTP、Websocket、GRPC等等,我们会对常用的HTTP、Websocket、GRPC、HTTPS协议。我们可以通过下图看到目前Nginx支持的代理协议:


Nginx可支持的代理协议

  常见的Nginx作为反向代理支持协议有HTTP、HTTPS、WS、GRPC,Nginx支持这些协议所使用的模块如下图所示:




总结下来反向代理模式对应的Nginx配置模块可以用一个表格表示成这样:
反向代理模式 Nginx配置模块
http、websocket、https ngx_http_proxy_module
fastcgi ngx_http_fastcgi_module
uwsgi ngx_http_uwsgi_module
grpc ngx_http_v2_module

Nginx作为反向代理支持的协议很多,但是它作为正向代理支持的常见协议很少,往往是HTTP协议,不能支持HTTPS协议,如下图所示:


Nginx作为正向代理支持的协议

反向代理实战篇

语法:proxy_pass URL;可以在location,if in location ,limit_except中配置,URL可以配置成:http://localhost:8000/uri/ https://ip:port/uri http://unix:/tmp/backend.socket:/uri/
测试:我们在其中一台服务器的nginx.conf配置文件中配置:

    location ~ /indexzzm.html$ {
        proxy_pass http://123.206.36.54;
    }

凡是以indexzzm.html结尾的访问都到123.206.36.54上面去访问。
我们在47.100.199.15上对indexzzm.html的访问发生了跳转,说明我们的反向代理配置成功。


结果

正向代理实战篇

现在我们有两台服务器,一台服务器的IP是http://47.100.199.15,另外一台是http://123.206.36.54,现在我们希望只能通过123.206.36.54作为代理的机器才能访问47.100.199.15中的页面。下面我们通过Nginx来完成这个步骤:
步骤1:配置47.100.199.15的配置文件,只允许123.206.36.54才能访问。

location / {
        if ( $remote_addr !~* "^123\.206\.36\.54") {
            return 403;
        }
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

步骤2:验证配置是否成功。我们在自己本机的电脑上去访问http://47.100.199.15,会出现以下结果:


被禁止

步骤3:在123.206.36.54上配置代理

    location / {
        proxy_pass http://$http_host$request_uri;
    }

步骤4:在google中配置代理:


配置代理

步骤5:访问


访问结果

Nginx缓冲使用

  如果禁止缓冲,那么当Nginx一收到后端的反馈就同时传给客户端。nginx不会从被代理的服务器读取整个反馈信息
proxy_buffering
语法: proxy_buffering on|off
默认值: proxy_buffering on
上下文: http, server, location

这个参数用来控制是否打开后端响应内容的缓冲区,如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。 但是无论proxy_buffering是否开启,对proxy_buffer_size都是生效的。

proxy_buffering开启的情况下,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端(边收边传,不是全部接收完再传给客户端)。 临时文件由proxy_max_temp_file_size和proxy_temp_file_write_size这两个指令决定的。如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上。

如果proxy_buffering关闭,那么nginx会立即把从后端收到的响应内容传送给客户端,每次取的大小为proxy_buffer_size的大小,这样效率肯定会比较低。
nginx不尝试计算被代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令proxy_buffer_size指定的.
proxy_buffers
语法: proxy_buffers the_number is_size;
默认值: proxy_buffers 8 4k/8k;
上下文: http, server, location该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。
proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size。
若某些请求的响应过大,则超过_buffers的部分将被缓冲到硬盘(缓冲目录由_temp_path指令指定), 当然这将会使读取响应的速度减慢, 影响用户体验。
proxy_busy_buffers_size
语法: proxy_busy_buffers_size size;
默认值: proxy_busy_buffers_size proxy_buffer_size * 2;
上下文: http, server, location, if
proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,建议为proxy_buffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。

Nginx跳转重定向

语法:proxy_redirect redirect replacement;可以用在http,server,location中

Nginx头信息

语法:proxy_set_header field value;
  经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过remote_addr变量拿到的将是反向代理服务器的ip地址”。这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取remote_addr),取得的是nginx的地址,即remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的,但是,nginx是可以获得用户的真实ip的,也就是说nginx使用remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下:
proxy_set_header X-real-ip $remote_addr;
其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:
request.getAttribute("X-real-ip")

Nginx超时设置

语法:proxy_connect_timeout time;
默认:proxy_connect_timeout 60s;
上下文:http,server,location
此配置意思是,每个从Nginx分发的请求,连接到后台(tomcat X)的连接如果超过60秒,则视为连接失败
proxy_read_timeout
nginx接收upstream server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭
proxy_send_timeout
nginx发送数据至upstream server超时, 默认60s, 如果连续的60s内没有发送1个字节, 连接关闭
附一个Nginx中对上述语法的配置:


常见配置
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容