C05S06-Nginx的内置变量和代理

一、常见内置变量

内置变量说明
$uri请求的URL,不包括主机和参数
$request_uri请求的URL,包括主机和参数
$host请求的主机名
$http_user_agent客户端信息,浏览器和操作系统
$remote_addr客户端IP地址
$remote_port客户端端口
$server_addr服务端IP地址
$server_port服务端端口
$request_method请求方式
$scheme请求协议
$request_filename请求的资源路径
$doucument_root请求的资源根目录
X-Real-IP客户端的真实IP地址
X-Forwarded-For客户端IP地址和代理IP地址

二、代理

代理是客户端和服务端的中间人,客户端通过代理访问服务端。代理又分为正向代理和反向代理。从网络参考模型的角度来看,正向代理属于七层代理,反向代理包括四层代理和七层代理。

四层代理和七层代理的区别:

  1. 四层代理是基于TCP的代理转发,基于IP地址和端口的形式实现代理。四层代理无法获取HTTP请求中的URL信息,只能进行数据转发。四层代理是由内核进行转发,速度更快。
  2. 七层代理是基于HTTP的代理转发,可以处理HTTP的请求和响应,收到HTTP请求后,会根据代理方式将HTTP请求转发到服务端。可以对HTTP请求进行分析、处理,对请求内容做路由、流量控制、内容过滤等。七层代理是基于应用层代、用户态处理,速度较慢,但是更加安全可靠。

目前能够同时进行四层代理和七层代理的应用只有Nginx、Haproxy。

1. 正向代理

正向代理需要对请求进行处理,属于七层代理。正向代理是面向客户端的,代理客户端、隐藏客户端。客户端想要访问网页,但是无法直接访问,可以通过正向代理访问。服务端只知道代理IP地址,不知道客户端IP地址;客户端知道代理和服务端的IP地址。

1.1 固定地址正向代理

  1. 新增一个Nginx的server模块,具体配置如下。

    server {
        listen 8888;
        server_name localhost;
        # 设置DNS解析地址
        resolver 218.2.135.1 valid=300 ipv6=off;
        # 设置解析服务超时时间
        resolver_timeout 3s;
        # 设置代理服务器读取数据超时时间
        proxy_read_timeout 30s;
        # 设置代理服务器发送数据超时时间
        proxy_send_timeout 30s;
        # 设置代理服务器连接服务端超时时间
        proxy_connect_timeout 30s;
    
        # 固定代理地址
        set $url "www.baidu.com";
        location / {
            # 请求转发
            proxy_pass http://$url;
            # 正向代理缓存配置
            # 设置缓冲区的个数和单个大小
            proxy_buffers 256 4k;
            # 不保存响应数据的临时文件,防止文件过多
            proxy_max_temp_file_size 0;
            # 状态码是200和302的缓存有效期是1分钟
            proxy_cache_valid 200 302 1m;
            # 状态码是301的缓存有效期是1小时
            proxy_cache_valid 301 1h;
            # 其他状态码的缓存有效期是1分钟
            proxy_cache_valid any 1m;
        }
    }
    
  2. 保存文件后,检查配置语法是否存在问题,重启Nginx服务。

    nginx -t
    systemctl restart nginx
    
  3. 在主机的浏览器中输入本机IP和端口,或者使用curl命令获取网页,查看是否实现正向代理。

    curl 192.168.1.128:8888
    

1.2 变化地址正向代理

  1. 新增一个Nginx的server模块,具体配置如下。

    server {
        listen 8889;
        resolver 218.2.135.1;
        resolver_timeout 3s;
        
        location / {
            # 自动设置代理的请求地址
            proxy_pass $scheme://$http_host$request_uri;
            # 在请求头中传递客户端的host信息
            proxy_set_header Host $http_host;
            # 设置客户端请求中包含真实IP地址
            proxy_set_header X-Real-IP $remote_addr;
            # 设置客户端经过的代理地址
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 传递客户端请求的协议信息
            proxy_set_header X-Forwarded-Proto $scheme;
            # 传递客户端的主机名
            proxy_set_header X-Forwarded-Host $host;
            # 传递客户端的请求端口
            proxy_set_header X-Forwarded-Port $server_port;
    
            proxy_buffers 256 4k;
            proxy_max_temp_file_size 0;
            proxy_cache_valid 200 302 1m;
            proxy_cache_valid 301 1h;
            proxy_cache_valid any 1m;
        }
    } 
    
  2. 保存文件后,检查配置语法是否存在问题,重启Nginx服务。

    nginx -t
    systemctl restart nginx
    
  3. 使用curl命令通过传参的方式获取网页,查看是否实现正向代理。

    # curl -x 代理URL 目标URL
    curl -x 192.168.1.128:8889 www.baidu.com
    

2. 反向代理

反向代理包含四层代理和七层代理,代理服务端、隐藏服务端。客户端向代理发起请求,代理根据一定的策略(负载)将请求发送到服务端。客户端不知道请求的服务端具体IP,代理服务器隐藏了服务端具体的IP地址。

负载均衡是一种流量分发机制,根据算法将流量分发到不同的后端服务器,以实现服务端的高可用,也就是备灾。

负载均衡的常见算法:

  • 轮询:负载均衡默认算法,会将请求轮流分发给后端服务器,适用于后端服务器处理能力相近时。
  • 加权轮询:根据后端服务器的处理能力赋予不同的权重,处理能力高的服务器权重高,处理能力低的服务器权重低。流量高峰时期可以实现流量分发优化,适用于后端服务器处理能力差异大时。
  • IP Hash:请求后端服务器,会使用Hash算法计算出IP地址的Hash值,然后再把请求发送到对应的后端服务器。如果客户端IP地址一致,下一次的请求会再次发送到对应的服务端,保证会话的稳定。因此要实现会话保持可以使用ip Hash算法。
  • 最小链接数:将请求发送到当前连接较少的后端服务器,这种算法适用于后端服务器处理任务耗时不同的情况,可以有效避免请求集中在处理能力更强的后端服务器。
  • URL Hash:根据URL路径来计算Hash值,请求的URL路径相同,客户端的请求会被发送到同一台服务器上。

负载均衡的特点:

  1. 根据算法将流量分发给不同的后端服务器。
  2. 客户端访问的是代理地址,响应也是来自代理服务器。
  3. 客户端不了解后端服务器情况,不知道具体的IP地址。
  4. 提高了安全性,后端服务器是隐藏的。
  5. 负载均衡是有缓存的,可以直接访问缓存,提高响应速度。

2.1 七层反向代理

七层反向代理使用upstream语法,配置在http模块中,进行请求中的HTTP处理。

  1. 轮询基本配置。

    在http模块中定义一个upstream模块,然后在location模块调用。轮询是负载均衡的默认策略,可以不用进行设置。

    upstream backend {
        server 192.168.1.129;
        server 192.168.1.130;
    }
    
    location / {
        root   html;
        index  index.html index.htm;
        proxy_pass  http://backend;
    }
    
  2. 加权轮询基本配置。

    在http模块中定义一个upstream模块,然后在location模块调用。通过weight设置权重。

    upstream backend {
        server 192.168.1.129 weight=3;
        server 192.168.1.130 weight=1;
    }
    
    location / {
        root   html;
        index  index.html index.htm;
        proxy_pass  http://backend;
    }
    
  3. IP Hash基本配置。

    在http模块中定义一个upstream模块,然后在location模块调用。使用ip_hash开启IP Hash策略。

    upstream backend {
        ip_hash;
        server 192.168.1.129;
        server 192.168.1.130;
    }
    
    location / {
        root   html;
        index  index.html index.htm;
        proxy_pass  http://backend;
    }
    
  4. 最小连接数基本配置。

    在http模块中定义一个upstream模块,然后在location模块调用。使用least_conn开启最小连接数策略,通常还会和权重weight搭配使用。

    upstream backend {
        least_conn;
        server 192.168.1.129 weight=3;
        server 192.168.1.130 weight=2;
    }
    
    location / {
        root   html;
        index  index.html index.htm;
        proxy_pass  http://backend;
    }
    
  5. URL Hash基本配置。

    在http模块中定义一个upstream模块,然后在location模块调用。使用hash设置根据URL路径计算hash值。

    upstream backend {
        hash $request_uri;
        server 192.168.1.129;
        server 192.168.1.130;
    }
    
    location / {
        root   html;
        index  index.html index.htm;
        proxy_pass  http://backend;
    }
    

2.2 四层反向代理

四层反向代理使用stream语法,配置全局模块中。用于流量的转发,不涉及请求的处理,所以只允许轮询、加权轮询和最小连接数等策略。

在配置文件的全局模块中新增一个stream模块,其中包括upstream模块和server模块。需要注意的是端口号不能够和http模块中的server模块设置的端口号相同,否则会产生端口占用,导致Nginx服务无法正常启动。

  1. 轮询基本配置。

    stream {
        upstream backend {
            server 192.168.1.129:80;
            server 192.168.1.130:80;
        }
        
        server {
            listen 81;
            proxy_pass backend;
        }
    }
    
  2. 加权轮询基本配置。

    stream {
        upstream backend {
            server 192.168.1.129:80 weight=3;
            server 192.168.1.130:80 weight=1;
        }
        
        server {
            listen 81;
            proxy_pass backend;
        }
    }
    
  3. 最小连接数基本配置。

    stream {
        upstream backend {
        	least_conn;
            server 192.168.1.129:80;
            server 192.168.1.130:80;
        }
        
        server {
            listen 81;
            proxy_pass backend;
        }
    }
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值