Nginx 反向代理

正向代理

这里先说下什么是代理(正向代理),一个点外卖的例子,用户通过外卖平台在商家点菜下单的场景,这里的外卖平台就是属于一个代理。还有在使用谷歌搜素的时候不得不科学一下,这里的科学就是一个代理;还比如吃鸡时用的网路加速器。正向代理 时客户端发送对目标服务器的请求,代理服务器在中间将请求转发给目标服务器,并将结果返回给客户端。
正向代理

场景:

  • 访问原来无法访问的资源
  • 加速访问资源
  • 对客户端访问授权,上网进行认证
  • 代理可以记录用户访问记录(上网行为管理)
  • 隐藏客户端身份

反向代理

由于单机服务器处理请求的能力有限,处理大量客户端请求时压力很大,甚至出现问题,所以在增加目标服务器的同时,在这些 目标服务器和客户端之间增加代理服务器负责接收客户端请求,并分发给目标服务器,然后在把目标服务器的响应结果返回给客户端。类似于拨打客服热线时,热线电话是固定的,但是会分配不同客服人员接听来解决问题。
反向代理

场景:

  • 保护和隐藏原始资源服务器,防止攻击,通常将反向代理作为公网访问地址,Web服务器是内网
  • 负载均衡,通过反向代理来进行服务器资源的优化处理
  • 加密和 SSL 加速
  • 缓存静态内容
  • 压缩、减速上传、安全、外网发布等

这两者的主要区别就是 正向代理的代理对象是客户端,反向代理的代理对象是服务端。

Nginx 反向代理的实现

要实现 Nginx 反向代理,这里就要提到它的 http_proxy_module 模块,它允许将请求传递给另一个服务器。

测试:

简单使用 NodeJS 编写一个 HTTP 服务器:

1
2
3
4
5
6
7
const http = require('http');

const server = http.createServer(function (req, res) {
if (req.url == '/') {
res.end('Hello world');
}
}).listen('888', 'localhost');

访问 http://localhost:888
img_4.png

1
2
3
4
HTTP/1.1 200 OK
Date: Wed, 29 Dec 2021 07:32:49 GMT
Connection: keep-alive
Content-Length: 11

Nginx 配置代理:

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name my_proxy.test

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

访问 http://my_proxy.test
img_3.png

1
2
3
4
5
HTTP/1.1 200 OK
server: nginx/1.11.5
date: Wed, 29 Dec 2021 07:32:22 GMT
transfer-encoding: chunked
connection: keep-alive

常用配置项

  • proxy_pass

    监听代理服务器的端口或套接字,以及将被反射到的URI的位置。端口可以用主机名或地址和端口的名称来表示

    1
    2
    3
    proxy_pass http://localhost:8000/uri/;
    // 或者
    proxy_pass http://unix:/tmp/backend.socket:/uri/;
  • proxy_set_header

    重定义或添加一些请求头行,这些请求头行将被传输到代理服务器。作为值,可以使用文本、变量及其组合。

  • proxy_read_timeout

    定义从代理服务器读取响应的超时。超时时间只设置在两个连续的读操作之间,而不是整个响应的传输。如果代理服务器在此时间内没有传输任何内容,则连接将被关闭。默认 60s

  • proxy_send_timeout

    设置将请求传输到代理服务器的超时时间。超时时间只设置在两个连续的写操作之间,而不是整个请求的传输。如果代理服务器在此时间内没有接收到任何信息,则连接将被关闭。默认 60s

  • proxy_connect_timeout

    定义与代理服务器建立连接的超时时间。应该注意的是,这个超时通常不能超过75秒。默认 60s

  • proxy_http_version

    设置代理使用的 HTTP 协议版本。默认情况下,使用 1.0版本。对于 keepalive 连接和 NTLM 身份验证,建议使用 1.1版本。

详细配置见:http://nginx.org/en/docs/http/ngx_http_proxy_module.html