NGINX 反向代理

栏目: 服务器 · Nginx · 发布时间: 6年前

内容简介:假设网络上有三台机器:通常,你会直接访问需要的网络资源,此时路径是由你的电脑直接到网站 X->Z。但某些情况下,X 并不能直接访问到 Z。原因可能是两方面的,

代理与反向代理

假设网络上有三台机器:

  • X:你的电脑
  • Y:代理服务器
  • Z:网站

通常,你会直接访问需要的网络资源,此时路径是由你的电脑直接到网站 X->Z。

代理(Proxy)

但某些情况下,X 并不能直接访问到 Z。原因可能是两方面的,

  • X 所在的网络将 Z 进行了屏蔽封锁,比如公司内网禁用一些娱乐性质的网站,防止员工工作时间娱乐。
  • Z 将 X 进行了屏蔽。比如 Z 发现来自 X 的请求异常,怀疑是恶意攻击,所以将 X 的 IP 封掉。

此时 Y 在中间可充当 X 的代理,将 X 的请求转发到 Z,拿到内容后再返回给 X。此时路径为 X->Y->Z。

也就是说,代理是 X 端主动配置和发起的,X 明确知道 Y 并不是返回内容的服务器。

反向代理 (Reverse Proxy)

某些情况下,Z 不想让 X 直接访问,所以配置一个 Y 在前面充当代理提供服务。

此时,作为用户访问的是 Y,并不知道 Z 才是真正提供服务的机器,用户 代理了,相比前面,所以这里是 反向 代理。

反向代理下,Z 在后台对外不公开只内网可访问,而作为反向代理的 Y 对外公开可通过公网访问。

反向代理的场景:

  • 比如 Z 是个大型网站,请求量巨大,单台机器是无法满足所有请求的,所以同样的网站内容部署在了多台机器上。然后配置一台反向代理的机器,将请求再就近转发到某台机器。比如 CDN。
  • 负载均衡。将请求平均分配到各机器,以至于不会让某些机器过载,同时将挂掉的机器其请求转发到还在正常运行的机器上。

NGINX 中反向代理的配置

请求转发

通过 proxy_pass 可将请求直接转发。

location /some/path/ {
    proxy_pass http://www.example.com/link/;
}

目标地址中的 path 部分会替换掉 location 参数中对应位置中的 path。比如这里 /some/path/page.html 会被转发到 http://www.example.com/link/page.html

其中目标地址可以是 IP,或带端口,

location ~ \.php {
    proxy_pass http://127.0.0.1:8000;
}

除了转发到 HTTP 服务器,还支持其他类型协议的转发,相应的指令为:

请求头的转发

默认情况下 NGINX 为代理的请求设置上了两个请求头, Host 设置成 $proxy_host 变量的值, Connection 设置为 close 。其他值为空的请求头会去掉。通过 proxy_set_header 指令可修改代理时的请求头。

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;
}

Buffer 的设置

作为代理,在拿到完整响应前将结果暂存在内部的 buffer 数据中,拿到完整响应后再将结果返回到客户端。这种将响应暂存的方式可提高代理的效率,而同步的方式会浪费代理服务器的资源。

默认 buffer 模式为开启状态,可通过 proxy_buffering 进行开关。

proxy_buffers 控制单个请求为其分配的 buffer 大小和数量。

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

关闭某些 location 下的 buffer 设置:

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

出口地址

通过 proxy_bind 指令可配置代理服务器的出口地址,然后配置内部机器只接收来自该出口地址的请求。

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/;
}

IP 地址也可指定为变量,比如 $server_addr 为接收请求机器的 IP。

location /app3/ {
    proxy_bind $server_addr;
    proxy_pass http://example.com/app3/;
}

以上所述就是小编给大家介绍的《NGINX 反向代理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning Apache Struts

Beginning Apache Struts

Arnold Doray / Apress / 2006-02-20 / USD 44.99

Beginning Apache Struts will provide you a working knowledge of Apache Struts 1.2. This book is ideal for you Java programmers who have some JSP familiarity, but little or no prior experience with Ser......一起来看看 《Beginning Apache Struts》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具