正向代理
这里先说下什么是代理(正向代理),一个点外卖的例子,用户通过外卖平台在商家点菜下单的场景,这里的外卖平台就是属于一个代理。还有在使用谷歌搜素的时候不得不科学一下,这里的科学就是一个代理;还比如吃鸡时用的网路加速器。正向代理 时客户端发送对目标服务器的请求,代理服务器在中间将请求转发给目标服务器,并将结果返回给客户端。
场景:
- 访问原来无法访问的资源
- 加速访问资源
- 对客户端访问授权,上网进行认证
- 代理可以记录用户访问记录(上网行为管理)
- 隐藏客户端身份
反向代理
由于单机服务器处理请求的能力有限,处理大量客户端请求时压力很大,甚至出现问题,所以在增加目标服务器的同时,在这些 目标服务器和客户端之间增加代理服务器负责接收客户端请求,并分发给目标服务器,然后在把目标服务器的响应结果返回给客户端。类似于拨打客服热线时,热线电话是固定的,但是会分配不同客服人员接听来解决问题。
场景:
- 保护和隐藏原始资源服务器,防止攻击,通常将反向代理作为公网访问地址,Web服务器是内网
- 负载均衡,通过反向代理来进行服务器资源的优化处理
- 加密和 SSL 加速
- 缓存静态内容
- 压缩、减速上传、安全、外网发布等
这两者的主要区别就是 正向代理的代理对象是客户端,反向代理的代理对象是服务端。
Nginx 反向代理的实现
要实现 Nginx 反向代理,这里就要提到它的 http_proxy_module
模块,它允许将请求传递给另一个服务器。
测试:
简单使用 NodeJS 编写一个 HTTP 服务器:
1 | const http = require('http'); |
1 | HTTP/1.1 200 OK |
Nginx 配置代理:
1 | server { |
1 | HTTP/1.1 200 OK |
常用配置项
proxy_pass
监听代理服务器的端口或套接字,以及将被反射到的URI的位置。端口可以用主机名或地址和端口的名称来表示
1
2
3proxy_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