NGINX 反向代理

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

内容简介:假设网络上有三台机器:通常,你会直接访问需要的网络资源,此时路径是由你的电脑直接到网站 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 反向代理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Structure and Interpretation of Computer Programs - 2nd Edition

Structure and Interpretation of Computer Programs - 2nd Edition

Harold Abelson、Gerald Jay Sussman / The MIT Press / 1996-7-25 / USD 145.56

Structure and Interpretation of Computer Programs has had a dramatic impact on computer science curricula over the past decade. This long-awaited revision contains changes throughout the text. Ther......一起来看看 《Structure and Interpretation of Computer Programs - 2nd Edition 》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

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

RGB CMYK 互转工具