正向代理一般处于用户一边,代替用户访问原本访问不到的资源,而用户直接请求的仍然是Web服务器。
反向代理一般处于Web服务器一边,通常与Web服务器同处一个局域网内,代替一个或多个Web服务器接收用户请求,并将Web服务器的响应返回给用户。用户不知道反向代理服务器的存在,也不知道自己访问的其实是代理服务器。反向代理可以很好地隐藏Web服务器真实地址。
配置项 | 说明 |
---|---|
proxy_pass | 指定将请求转发到哪个后端服务器,格式为URL |
proxy_connect_timeout | Nginx从接收请求到连接上后端服务器的最长等待时间 |
proxy_read_timeout | 从后端服务器接收响应的最长等待时间 |
proxy_send_timeout | 向后端服务器发送请求数据的最长等待时间 |
proxy_http_version | HTTP协议版本,如HTTP/1.1 |
proxy_set_header | 先修改请求头的值,再将请求发送给后端服务器 |
proxy_buffering | 是否启用代理缓冲区(on/off)。如果禁用,代理一接收到内容就同步发送给客户端 |
proxy_max_temp_file_size | 在启用代理缓冲区时,如果数据内容超过缓冲区大小,可以将数据存放到硬盘上的大小。为0时,将禁止往硬盘上写数据 |
proxy_buffer_size | 设置缓冲区大小,用于缓冲后端服务器响应的头部信息。默认值是proxy_buffer_size 4k/8k |
proxy_buffers | 响应上游服务器的缓冲数量和大小。默认值是proxy_buffers 8 4k/8k |
proxy_busy_buffers_size | 分配给发送客户端响应的缓冲区大小。通常设置为proxy_buffer_size的2倍 |
gzip | 是否启用数据压缩(on/off) |
gzip_static | 预读gzip功能(on/off) |
gzip_comp_level | 数据压缩等级1~9 |
gzip_http_version | HTTP协议版本,如HTTP/1.1 |
gzip_types | 除了默认的text/html外,启用压缩的文件类型,在mime.types中对应查找 |
gzip_min_length | 超过这个值的数据才会被压缩 |
gzip_buffers | 压缩数据使用的缓冲数量和大小 |
实验环境中各服务器的角色:
IP地址 | 角色 |
---|---|
192.168.18.1 | Windows客户端 |
192.168.18.131 | 代理服务器 |
192.168.18.132 | Web服务器 |
在192.168.18.132上部署Nginx构建一个Web服务器,且仅允许代理服务器192.168.18.131访问,配置如下:
server {
listen 80;
server_name 192.168.18.132;
access_log /usr/local/nginx/logs/access.log main;
error_log /usr/local/nginx/logs/error.log;
location / {
root /usr/local/nginx/html/a;
index index.html index.htm;
allow 192.168.18.131;
deny all;
}
error_page 404 /40x.html;
location /40x.html {
return 404 "Not Found!";
}
}
编辑一个HTML文件,内容如下:
# cat /usr/local/nginx/html/a/index.html
Server: 192.168.18.132
在代理服务器192.168.18.131上访问测试:
# curl 192.168.18.132
Server: 192.168.18.132
在Windows上访问测试:
C:\Users\Administrator>curl 192.168.18.132 --head
HTTP/1.1 403 Forbidden
在192.168.18.131上部署正向代理服务,然后在Windows上指定通过代理服务器访问Web服务器。
正向代理服务配置:
server {
listen 80;
location / {
proxy_pass http://$host$request_uri;
}
}
在Windows上通过代理服务器再次访问Web服务器:
C:\Users\Administrator>curl -x 192.168.18.131:80 192.168.18.132
Server: 192.168.18.132
仍然使用192.168.18.132的Web服务器做测试。将192.168.18.131的正向代理改为反向代理,配置如下:
server {
listen 80;
server_name 192.168.18.131;
location / {
proxy_pass http://192.168.18.132;
}
}
在Windows上做访问测试:
C:\Users\Administrator>curl 192.168.18.131
Server: 192.168.18.132
在使用代理服务器时,由于客户端不是直接连接到Web服务器的,所以Web服务器一般不能从客户端直接获取信息。需要在代理服务器上做相应的配置向Web服务器传递客户端信息,如客户端的真实IP地址等。
在Nginx做代理服务器时,通常需要做如下配置:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这两行配置可以放在Nginx的http {}
配置段中,作为全局参数。也可以放在单独的location中作部分参数。Nginx做反向代理时的典型配置如下:
location / {
proxy_pass http://192.168.18.132:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}
如果用户直接访问Nginx或反向代理服务器,则X-Forwarded-For(XFF)记录用户真实IP。如果用户到Web服务器之间有一层或多层代理,并且代理没有使用XFF,那XFF列表的第一位记录离用户最近的代理IP,最后的Nginx反向代理将其上一级代理的IP追加到XFF列表末尾,自身的IP将被记录到remoteAddress中。XFF在请求头中可以被伪造,remoteAddress则无法伪造。
X-Real-IP是一个自定义头部字段,通常被代理用来记录与它产生TCP连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。