使用Nginx实现正向代理和反向代理

一、正向代理和反向代理的区别

1.1、正向代理

使用Nginx实现正向代理和反向代理_第1张图片
正向代理一般处于用户一边,代替用户访问原本访问不到的资源,而用户直接请求的仍然是Web服务器。

1.2、反向代理

使用Nginx实现正向代理和反向代理_第2张图片
反向代理一般处于Web服务器一边,通常与Web服务器同处一个局域网内,代替一个或多个Web服务器接收用户请求,并将Web服务器的响应返回给用户。用户不知道反向代理服务器的存在,也不知道自己访问的其实是代理服务器。反向代理可以很好地隐藏Web服务器真实地址。

二、Nginx代理相关配置

配置项 说明
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 压缩数据使用的缓冲数量和大小

三、使用Nginx实现正向代理

实验环境中各服务器的角色:

IP地址 角色
192.168.18.1 Windows客户端
192.168.18.131 代理服务器
192.168.18.132 Web服务器

3.1、构建一个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

3.2、部署正向代理

在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

四、Nginx做反向代理

仍然使用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

五、传递客户端真实IP

在使用代理服务器时,由于客户端不是直接连接到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,这个设备可能是其他代理,也可能是真正的请求端。

你可能感兴趣的:(Nginx实践,nginx)