Nginx 反向代理解析
1. 代理
在 Java 设计模式中, 代理模式是这样定义的: 给某个对象提供一个代理对象, 并由代理对象控制原对象的引用.
Nginx 主要能够代理如下几种协议, 其中用到的最多的就是做 Http 代理服务器.
1.1 正向代理
若国内电脑的对外公网 IP 地址能变成美国的 IP 地址, 就可以访问 Google. 而 VPN 就由此而生. 国内电脑在访问 Google 时, 先连上 VPN 服务器将国内电脑的 IP 地址变成美国的 IP 地址, 然后就可以顺利访问.
- VPN 运用就是做正向代理. 正向代理服务器位于客户端和服务器之间, 为了向服务器获取数据, 客户端要向代理服务器发送一个请求, 并指定目标服务器, 代理服务器将目标服务器返回的数据转交给客户端. 这里客户端是要进行一些正向代理的设置的.
- VPN 通俗的讲就是一种中转服务, 当国内电脑接入 VPN 后, 我们对外国 IP 地址就会变成 VPN 服务器的公网 IP, 请求或接受任何数据都会通过这个 VPN 服务器然后传入到国内本机.
正向代理的典型用途是为在防火墙内的局域网客户端提供访问 Internet 的途径. 正向代理还可以使用缓冲特性 (由 mod_cache 提供) 减少网络使用率.
1.2 反向代理
反向代理, 客户端对代理是无感知的, 客户端不需要任何配置就可以访问, 只需要将请求发送到反向代理服务器, 由反向代理服务器去选择目标服务器获取数据后, 在返回给客户端, 此时反向代理服务器和目标服务器对外就是一个服务器, 暴露的是代理服务器地址, 隐藏了真实服务器 IP 地址.
反向代理服务器通常可用来作为 Web 加速, 即使用反向代理作为 Web 服务器的前置机来降低网络和服务器的负载, 提高访问效率.
优点:
1. 提高了内部服务器的安全.
2. 加快了对内部服务器的访问速度.
3. 节约了有限的IP资源.
2. Nginx 反向代理
此模块默认是启动状态.
禁止该模块: 需要在安装 Nginx 时加上配置参数--without-http_proxy_module
.
指令:
1. proxy_pass: 代理后端的服务器.
2. proxy_buffering: 是否打开缓存区.
3. proxy_buffer_size: 设置缓存区大小.
4. 其他指令.
2.1 proxy_pass
module: ngx_http_proxy_module;
Syntax: proxy_pass URL;
Default: -
Context: location, if in location, limit except;
URL:
为被代理服务器的地址, 可以包含传输协议, 主机名称或 IP 地址加端口号, URI 等.
基本用于隐藏端口号.
2.2 proxy_buffering
module: ngx_http_proxy_module;
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location;
proxy_buffering on;
状态下, Nginx 会把返回的内容数据缓存. 边缓存边传到客户端, 而不是全部接受到再传到客户端中.
2.3 proxy_buffer_size
module: ngx_http_proxy_module;
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k | 8k;
Context: http, server, location;
2.4 其他指令
proxy_redirect default; # 默认重定向.
proxy_connect_timeout 30; # 设置长连接时间.
proxy_send_timeout 60; # 设置派送连接时间.
proxy_read_timeout 60; # 默认读取连接时间.
proxy_set_header Host $host:$server_port; # 避免 HTTP 请求中丢失 Host 头部的情况下 Host 不被重写的失误.
proxy_set_header X-Real-IP $remote_addr; # 获取客户端真实 IP.
proxy_set_header REMOTE-HOST $remote_addr; # 获取客户端浏览器的主机名.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 获取代理者的真实 IP.
proxy_buffers 4 128k; # 设置缓冲区的大小和数量. 默认 proxy_buffers 8 4k/8k;
proxy_busy_buffers_size 256k; # 设置忙碌时, 缓冲区的值. 默认为 proxy_buffer_size 的 2 倍;
proxy_max_temp_file_size 256k; # 设置临时文件缓冲的最大值.
2.5 例子
......
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
......
location /proxy {
......
proxy_pass http://xx.xx.xx.xx:8080/proxy;
......
proxy_redirect default;
......
}