Nginx详解 五:反向代理

文章目录

  • [1. 正向代理和反向代理](#1. 正向代理和反向代理)
    • [1.1 正向代理概述](#1.1 正向代理概述)
      • [1.1.1 什么是正向代理](#1.1.1 什么是正向代理)
      • [1.1.2 正向代理的作用](#1.1.2 正向代理的作用)
      • [1.1.3 正向代理的基本格式](#1.1.3 正向代理的基本格式)
    • [1.2 反向代理概述](#1.2 反向代理概述)
      • [1.2.1 什么是反向代理](#1.2.1 什么是反向代理)
      • [1.2.2 反向代理可实现的功能](#1.2.2 反向代理可实现的功能)
      • [1.2.3 反向代理的可用模块](#1.2.3 反向代理的可用模块)
  • [2. 配置反向代理](#2. 配置反向代理)
    • [2.1 反向代理配置参数](#2.1 反向代理配置参数)
      • [2.1.1 proxy_pass](#2.1.1 proxy_pass)
      • [2.1.2 其他参数](#2.1.2 其他参数)
  • [3. 示例](#3. 示例)
    • [3.1 反向代理单台web服务器](#3.1 反向代理单台web服务器)
    • [3.2 指定主机实现反向代理动静分离](#3.2 指定主机实现反向代理动静分离)
    • [3.3 缓存功能](#3.3 缓存功能)
    • [3.4 实现反向代理客户端IP透传](#3.4 实现反向代理客户端IP透传)
      • [3.4.1 基本原理](#3.4.1 基本原理)
      • [3.4.2 一级代理](#3.4.2 一级代理)
      • [3.4.3 多级代理](#3.4.3 多级代理)
    • [3.5 实现反向代理负载均衡](#3.5 实现反向代理负载均衡)
      • [3.5.1 基本原理](#3.5.1 基本原理)
      • [3.5.2 常见配置参数](#3.5.2 常见配置参数)
      • [3.5.2 调度算法](#3.5.2 调度算法)
        • [3.5.2.1 轮询(Round Robin)](#3.5.2.1 轮询(Round Robin))
        • [3.5.2.2 轮询权值(Weighted Round Robin)](#3.5.2.2 轮询权值(Weighted Round Robin))
        • [3.5.2.3 ip_hash](#3.5.2.3 ip_hash)
        • [3.5.2.4 fair(第三方)](#3.5.2.4 fair(第三方))
        • [3.5.2.5 url_hash(第三方)](#3.5.2.5 url_hash(第三方))
        • [3.5.2.6 least_conn(最小连接数)](#3.5.2.6 least_conn(最小连接数))
        • [3.5.2.7 最少响应时间(Least Time)](#3.5.2.7 最少响应时间(Least Time))
    • [3.6 示例](#3.6 示例)
      • [3.6.1 使用轮询算法实现负载均衡](#3.6.1 使用轮询算法实现负载均衡)
      • [3.6.2 使用加权轮询算法实现负载均衡](#3.6.2 使用加权轮询算法实现负载均衡)

1. 正向代理和反向代理

1.1 正向代理概述

1.1.1 什么是正向代理

正向代理代理的是客户端

正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端

1.1.2 正向代理的作用

  • 为在防火墙内的局域网客户端提供访问Internet的途径
  • 可以使用缓冲特性减少网络使用率
  • 访问受地理位置限制的网络
  • 使用代理后会隐藏真实的IP地址

1.1.3 正向代理的基本格式

bash 复制代码
server {
    listen 192.168.67.100:80;
    server_name ....;#客户端访问的域名

    location / {
      proxy_pass http://目标服务器地址;
    }
  }

1.2 反向代理概述

1.2.1 什么是反向代理

反向代理代理的是服务端

反向代理:(reverse proxy),指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式

客户端不直接与后端服务器进行通信,而是与反向代理服务器进行通信,隐藏了后端服务器的 IP 地址

1.2.2 反向代理可实现的功能

反向代理的主要作用是提供负载均衡和高可用性。

负载均衡:Nginx可以将传入的请求分发给多个后端服务器,以平衡服务器的负载,提高系统性能和可靠性。

缓存功能:Nginx可以缓存静态文件或动态页面,减轻服务器的负载,提高响应速度。

动静分离:将动态生成的内容(如 PHP、Python、Node.js 等)和静态资源(如 HTML、CSS、JavaScript、图片、视频等)分别存放在不同的服务器或路径上。

多站点代理:Nginx可以代理多个域名或虚拟主机,将不同的请求转发到不同的后端服务器上,实现多个站点的共享端口。

1.2.3 反向代理的可用模块

bash 复制代码
ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理

ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组

ngx_stream_proxy_module:#将客户端的请求以tcp协议转发至指定服务器处理

ngx_http_fastcgi_module:#将客户端对php的请求以fastcgi协议转发至指定服务器助理

ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

2. 配置反向代理

bash 复制代码
#官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 

2.1 反向代理配置参数

2.1.1 proxy_pass

bash 复制代码
proxy_pass 地址:端口的方式 ;  
#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP
#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
bash 复制代码
proxy_pass http://10.0.0.18:8080; 
#8080后面无uri,即无 / 符号,需要将location后面url 附加到proxy_pass指定的url后面,此行为类似于root
#proxy_pass指定的uri不带斜线将访问的/web,等于访问后端服务器

proxy_pass http://10.0.0.18:8080/;   
#8080后面有uri,即有 / 符号,相当于置换,即访问/web时实际返回proxy_pass后面uri内容.此行为类似于alias 
#proxy_pass指定的uri带斜线,等于访问后端服务器的http://10.0.0.18:8080/index.html 内容返回给客户端
bash 复制代码
#如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~),则proxy_pass之后必须不能使用uri; 即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后

2.1.2 其他参数

bash 复制代码
proxy_hide_header field;
#用于nginx作为反向代理的时候,在返回给客户端http响应时,隐藏后端服务器相应头部的信息,可以设置proxy_hide_header field;

proxy_pass_header field;
#默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数,如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端

#field 首部字段大小不敏感
#示例:透传后端服务器的Server和Date首部给客户端,同时不再响应报中显示前端服务器的Server字段
proxy_pass_header Server;
proxy_pass_header Date;


proxy_pass_request_body on | off; 
#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启


proxy_pass_request_headers on | off; 
#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启

3. 示例

3.1 反向代理单台web服务器

所需配置

bash 复制代码
#代理服务器
vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件
server{
        listen 192.168.67.100:80;
        server_name  www.pc.com;
        root    /apps/nginx/html/pc;
     location  / {
        proxy_pass http://192.168.67.101;
}

}
nginx -t
nginx -s reload
#重新加载
bash 复制代码
#真实服务端
yum  install   httpd  -y #安装服务

cd  /var/www/html
echo   "Hi~"  > index.html #主页内容

systemctl start httpd #开启服务

vim /etc/hosts
#添加地址映射

192.168.67.100 www.pc.com
bash 复制代码
#客户机

vim  /etc/hosts
192.168.67.100  www.pc.com

测试

客户机访问代理服务器

bash 复制代码
 curl 192.168.67.100

3.2 指定主机实现反向代理动静分离

因为nginx无法处理动态资源,所以要动静分离。

所需配置

bash 复制代码
#代理服务器

vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件

  location  /api {
        proxy_pass http://192.168.67.101;
}

     location  /static {
        proxy_pass http://192.168.67.103;
}
nginx -t
nginx -s reload
#重新加载
bash 复制代码
#动态资源服务器

#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0

#安装nginx服务
yum install -y epel-release
yum install nginx -y 
bash 复制代码
systemctl start nginx 

#创建动态资源目录
cd /usr/share/nginx/html

mkdir api
echo this is api > ./api/index.html
bash 复制代码
#静态资源服务器

#关闭防火墙和selinux
systemctl stop firewalld 
setenforce 0

#安装服务
yum install -y epel-release 
yum install nginx -y 
systemctl start nginx 

#创建静态资源目录
cd /usr/share/nginx/html
mkdir static
echo this is static > ./static/index.html

测试

bash 复制代码
#客户机
#关闭防火墙和selinux
systemctl stop firewalld 
setenforce 0

#动态资源
curl 192.168.67.100/api -L

#静态资源
curl 192.168.67.100/static -L

3.3 缓存功能

反向代理可以缓存静态资源。

当客户端再次请求访问相同资源时,反向代理可以直接返回缓存中的响应,无需二次请求,减少对后端服务器的请求压力,并加快响应速度。

bash 复制代码
proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
bash 复制代码
proxy_cache_key string;
#缓存中用于"键"的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;
bash 复制代码
proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中
 示例:
 proxy_cache_valid 200 302 10m;
 proxy_cache_valid 404 1m;
 
bash 复制代码
 
proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http   必须放在http语句中
proxy_cache_path path [levels=levels] [use_temp_path=on|off] 
keys_zone=zone_name:size [inactive=time] [max_size=size] [manager_files=number] 
[manager_sleep=time] [manager_threshold=time] [loader_files=number] 
[loader_sleep=time] [loader_threshold=time] [purger=on|off] 
[purger_files=number] [purger_sleep=time] [purger_threshold=time];


#示例:在http配置定义缓存信息
   proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
   levels=1:2:2 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
   keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的key
   inactive=120s  #缓存有效时间  
   max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
   
   
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存


proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

#示例
proxy_cache_use_stale error http_502 http_503;


proxy_cache_methods GET | HEAD | POST ...;
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
bash 复制代码
proxy_cache_path /data/nginx/proyxcache   levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;


http  语句
1:1:1  16个二进制     2^16/2^16/2^16       2^48


server {
   listen 80;
   proxy_cache proxycache;
   proxy_cache_key $request_uri;
   #proxy_cache_key $host$uri$is_args$args;
   proxy_cache_valid 200 302 301 10m;
   proxy_cache_valid any 5m;
   server_name www.kgc.com;
   root /data/nginx/pc;
  location / {
  root /data/nginx/pc;
  }
  location /api {
  proxy_pass http://192.168.91.101:9527;
  }
  location ~* \.(jpg|png|gif|html)$ {
  proxy_pass http://192.168.91.102;
  }

}

清理缓存

bash 复制代码
方法1: rm -rf 缓存目录
方法2: 第三方扩展模块ngx_cache_purge

3.4 实现反向代理客户端IP透传

3.4.1 基本原理

反向代理客户端IP透传是指在使用反向代理服务器时,将客户端的真实IP地址传递给后端服务器。

这可以通过一些特定的 如X-Forwarded-For 等HTTP 头字段来实现 头字段。

当请求经过反向代理服务器时,代理服务器会将客户端的真实IP地址添加到 XFF 头字段中,然后转发给后端服务器。

3.4.2 一级代理

所需配置

bash 复制代码
#代理服务器

vim /apps/nginx/conf.d/pc.conf
#编辑子配置文件
server{
        listen 192.168.67.100:80;
        server_name  www.pc.com;
        root    /apps/nginx/html/pc;
     location  / {
        proxy_pass http://192.168.67.101;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

######
`$proxy_add_x_forwarded_for` 是一个 nginx 变量,用于获取客户端的真实 IP 地址并将其添加到请求中的 `X-Forwarded-For` 头字段中,后端服务器可以通过检查该头字段来获取请求的真实客户端 IP 地址。
bash 复制代码
#后端服务器

#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0

#安装服务
yum install -y epel-release #依赖
yum install nginx -y 
systemctl start nginx 

测试

bash 复制代码
#客户端
curl 192.168.67.100
bash 复制代码
#后端服务器
cat /var/log/nginx/access.log |tail -f -n2

3.4.3 多级代理

所需配置

bash 复制代码
#一级代理服务器

#编辑子配置文件
vim /apps/nginx/conf.d/pc.conf
#反向代理指向二级代理服务器的IP

nginx -t
nginx -s reload
#重新加载
bash 复制代码
#yum安装nginx
yum install -y epel-release 
yum install nginx -y 

systemctl start nginx 

vi /etc/nginx/nginx.conf
#编辑主配置文件

server {
location / {
proxy_pass http://192.168.67.102;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

systemctl restart nginx
#重新加载
bash 复制代码
#后端服务器

#关闭防火墙和selinux
systemctl stop firewalld
setenforce 0

#安装nginx服务
yum install -y epel-release 
yum install nginx -y 
systemctl start nginx 

测试

bash 复制代码
#客户端,访问代理服务器
curl 192.168.2.100
bash 复制代码
#后端服务器,查看日志
cat /var/log/nginx/access.log | tail -n -1

3.5 实现反向代理负载均衡

Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能

bash 复制代码
#官方文档:
https://nginx.org/en/docs/http/ngx_http_up

3.5.1 基本原理

NGINX的负载均衡原理是基于反向代理和事件驱动的机制。

当客户端发送请求时,NGINX作为反向代理服务器接收请求,并根据配置的负载均衡算法将请求转发到后端的多个服务器上,实现负载均衡。

3.5.2 常见配置参数

bash 复制代码
server address [parameters];
#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。
#server支持的parameters如下:

weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等

max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制

max_fails=number  #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测

fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒

sorry server   #自己不能转自己
down    #标记为down状态
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
bash 复制代码
backup  #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器

upstream backend {
    server backend1.example.com;
    server backend2.example.com backup;
    server backend3.example.com;
}

3.5.2 调度算法

3.5.2.1 轮询(Round Robin)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

bash 复制代码
#示例
upstream bakend {  
    server 192.168.67.1;    
    server 192.168.67.2;  
}

3.5.2.2 轮询权值(Weighted Round Robin)

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

bash 复制代码
#示例
upstream bakend {  
    server 192.168.67.1 weight=10;  
    server 192.168.67.2 weight=20;  
}

3.5.2.3 ip_hash

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

bash 复制代码
#示例
upstream bakend {  
    ip_hash;  
    server 192.168.67.1:88;  
    server 192.168.67.2:80;  
} 

3.5.2.4 fair(第三方)

比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。
Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

bash 复制代码
upstream backend {  
    server 192.168.0.67:88;  
    server 192.168.0.67:80;  
    fair;  
}

3.5.2.5 url_hash(第三方)

按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。
Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

bash 复制代码
upstream backend {  
    server 192.168.67.1:88;  
    server 192.168.67.2:80;  
    hash $request_uri;  
    hash_method crc32;  
}



#注:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

3.5.2.6 least_conn(最小连接数)

根据后端服务器的连接状况进行分配客户请求,连接最少的服务器将被有限分配客户端请求。

bash 复制代码
#示例
 upstream backend {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
    }

3.5.2.7 最少响应时间(Least Time)

根据服务器的响应时间进行选择,将请求分配给响应时间最短的服务器。

3.6 示例

要启用负载均衡,需要在Nginx主配置文件中添加一个upstream块来定义后端服务器的列表。

然后,在相应的location块中使用proxy_pass指令指定负载均衡的上游服务器。

3.6.1 使用轮询算法实现负载均衡

所需配置

bash 复制代码
#代理服务器

vim /apps/nginx/conf/nginx.conf
#编辑主配置文件

upstream group1{
    server 192.168.67.102;
    server 192.168.67.103;
    }
bash 复制代码
vim /apps/nginx/conf.d/pc.com
#修改子配置文件
#修改location部分,加入
    pass_proxy http://group1;

nginx -t
nginx -s reload
#重新加载

测试

bash 复制代码
#修改102、103主页文件
vi /usr/share/nginx/html/index.html


bash 复制代码
#转到客户端
curl 192.168.67.100   #x2

3.6.2 使用加权轮询算法实现负载均衡

所需配置

bash 复制代码
#代理服务器

#修改主配置文件
vim /apps/nginx/conf/nginx.conf

upstream group1{
    server 192.168.67.102 weight=2;
    server 192.168.67.103 weight=3;
}
bash 复制代码
nginx -t
nginx -s reload
#重新加载

测试

bash 复制代码
#转到客户端
curl 192.168.67.100   #x2
相关推荐
Linux运维技术栈1 小时前
Ansible(自动化运维)环境搭建及ansible-vault加密配置
运维·自动化·ansible
Bessssss2 小时前
centos权限大集合,覆盖多种权限类型,解惑权限后有“. + t s”问题!
linux·运维·centos
苹果醋33 小时前
Golang的文件加密工具
运维·vue.js·spring boot·nginx·课程设计
jwensh3 小时前
【Jenkins】Declarative和Scripted两种脚本模式有什么具体的区别
运维·前端·jenkins
大熊程序猿4 小时前
xxl-job docker 安装
运维·docker·容器
董健正4 小时前
centos制作离线安装包
linux·运维·centos
咏颜5 小时前
Ubuntu离线安装Docker容器
linux·运维·服务器·经验分享·ubuntu·docker
DexterLien6 小时前
Debian 12 安装配置 fail2ban 保护 SSH 访问
运维·debian·ssh·fail2ban
娶不到胡一菲的汪大东6 小时前
Shell脚本
linux·运维·ubuntu
xserver26 小时前
ensp 基于静态NAT发布公司网站服务器,
运维·服务器