nginx正向代理与反向代理

一、正向代理与反向代理

正向代理

正向代理代理的是客户端

客户端设备要访问局域网以外的 Internet 时,需在客户端浏览器中配置代理服务器,然后通过代理服 务器来进行访问,将访问到的局域网以外的 Internet 网站内容返回给客户端,而不是通过局域网中的客 户端设备直接访问。

正向代理的用途

访问原来无法访问的资源

可做缓存,加速访问资源;

对客户端访问授权,上网进行认证;

代理可以记录用户访问记录等,且对外隐藏用户信息

server {
    listen 80;
    server_name ....;#客户端访问的域名或IP地址

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

 反向代理:

nginx正向代理与反向代理_第1张图片

反向代理代理的是服务端。

在使用反向代理时,客户端向一个服务器发送请求,而实际上该请求会被转发到后端的多个真实服务器(也称为上游服务器),然后由反向代理服务器来处理请求并将结果返回给客户端。

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

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

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

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

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

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

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协议转发至指定服务器处理

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

四层代理是基于tcp/ip协议层的代理转发方式,只是基于ip+端口号的形式实现代理。四层代理无法获取http请求中的url信息,只是对数据包进行转发。

四层转发数据包,是由内核进行转发,速度更快。
七层代理是通过http协议进行代理转发的方式

处理http的请求和响应,当收到http请求之后,根据代理的方式,把http请求转发到指定的服务器。

可以对http请求进行深入的分析和处理的。可以对请求内容做路由,流量控制,可以内容过滤等等。

七层代理是由应用层处理,用户态来处理,速度相对较慢,但是更安全,更可靠

同时能做四层代理和七层代理的:nginx、Haproxy

LVS:只能做四层转发

nginx内置变量

$uri:可以获取客户端请求的地址,不包含主机和查询的参数

$request_uri:获取客户端的请求地址,包含主机和查询参数

$host:请求的主机名,客户端----发送请求的url地址

$http_user_agent:获取客户端请求的浏览器和操作系统

$remote_addr:客户端的ip地址(可以隐藏)

$remote_port:客户端请求的端口

$server_addr:可以查询到服务端的ip地址

$server_port:服务端的端口号

$request_method:获取客户端的请求方式,get/post

$scheme:获取请求的协议 http协议 https

$request_filename:获取客户端请求的文件名

$document_root:当前请求的根目录

nginx在配置location匹配时,会使用两个获取头部的内置变量:

X-Real-IP:直接向服务端发送客户端访问的真实ip地址

proxy_set_header X-Real-IP $remote_addr;

X-Forwarded-For:传递完整的代理链,只要数据包经过代理,都会被传送nginx,记录所有的代理地址和客户端的真实ip。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

查看nginx内置变量

location / {
    root html;
    index index.html index.htm;
    default_type text/plain;
    return 200 "test1:$uri\ntest2:$request_uri\ntest3:$host\ntest4:$http_user_agent\ntest5:$remote_addr\ntest6:$remote_port\ntest7:$server_addr\ntest8:$server_port\ntest9:$request_method\ntest10:$scheme\ntest11:$request_filename\ntest12:$document_root";
}

反向代理

负载均衡的算法

轮询:round robin(rr)负载均衡的默认算法,请求轮流分配给后端服务器。

轮询算法适用于后端服务器处理能力相近的情况,默认的算法,可以不加。

加权轮询:weight round robin 轮询的升级版,给每个后端服务器赋予不同的权重。

处理能力更强的服务器设置更高的权重。处理能力的低的,设置低权重。

高峰时间可以通过这个方法进行流量的优化。适用于服务器处理能力差异比较大的情况。

ip_Hash:当访问后端服务器,根据客户端的ip地址,使用hash算法计算出ip地址的hash值,然后再把请求发送到相应的后端服务器。

如果客户端访问的ip地址相同,通过hash算法,再一次的请求会被分配到上一次访问的服务器。保证会话的稳定。

负载均衡的会话保持通过ip_hash实现。会话保持到期之后,会话中断,重新请求会重新计算hash值。

最小连接数:最少连接数的算法可以将请求发送到当前连接比较少的后端服务器。(通常配合加权轮询一块使用)

这种算法适用后端服务器处理任务耗时不同的情况,可以有效的避免所有的请求集中在处理能力更强的后端服务器上。

URL_HASH:根据请求当中url地址来计算hash值,如果客户端请求的url请求相同,客户端的请求会被分配到同一个服务器上。

如果后台服务器的数量发生变化,会影响结果。

负载均衡的特点

  • 根据算法把请求分发到不同的服务器。
  • 客户端访问的是代理地址,响应也是代理服务器响应。
  • 客户端并不了解后端服务器的情况。
  • 可以提高安全性,后端服务器是隐藏的。
  • 负载均衡是有缓存的,可以直接访问缓存,提高响应速度。

七层代理

upstream:模块仅支持http协议,用来处理http的请求和响应

语法upstream只能写在http模块当中。不能在server也不在全局。

轮询

http {
    upstream xy104 {
        server 192.168.233.11;
        server 192.168.233.12;
    }
    server {
           location / {
               root   html;
               index  index.html index.htm;
               proxy_pass http://xy104;
           }
       }
}

加权轮询

http {
    upstream kc {
        server 192.168.233.11 weigh=100;
        server 192.168.233.12 weight=50;
    }
    server {
           location / {
               root   html;
               index  index.html index.htm;
               proxy_pass http://xy104;
           }
       }
}

ip_Hash
 

http {
    upstream xy104 {
        ip_hash;
        server 192.168.233.11;
        server 192.168.233.12;
    }
    server {
           location / {
               root   html;
               index  index.html index.htm;
               proxy_pass http://xy104;
           }
       }
}

最小连接数
 

http {
    upstream xy104 {
        least_conn;
        server 192.168.233.11 weigh=100;
        server 192.168.233.12 weight=50;
    }
    server {
           location / {
               root   html;
               index  index.html index.htm;
               proxy_pass http://xy104;
           }
       }
}

URL_HASH

http {
    upstream xy104 {
        hash $request_uri consistent;
        server 192.168.233.11 weigh=100;
        server 192.168.233.12 weight=50;
    }
    server {
           location / {
               root   html;
               index  index.html index.htm;
               proxy_pass http://xy104;
           }
       }
}
四层代理

四层代理必须在nginx安装时配置stream模块

stream:不支持http协议,仅支持tcp和udp,处理数据包的流量分发

语法四层代理需要写在全局模块当中

  • 轮询
stream {
    upstream xy104 {
        server 192.168.233.11:80;
        #需要写明端口号
        server 192.168.233.12:80;
    }
    server {
        listen 81;
        #需要修改端口号,否则会和http模块中的server模块监听端口冲突
        proxy_pass xy104;
    }
}

 加权轮询

stream {
    upstream xy104 {
        server 192.168.233.11:80 weight=100;
        server 192.168.233.12:80 weight=50;
    }
    server {
        listen 81;
        proxy_pass xy104;
    }
}
  • 最小连接数
stream {
    upstream xy104 {
    	least_conn;
        server 192.168.233.11:80;
        #需要写明端口号
        server 192.168.233.12:80;
    }
    server {
        listen 81;
        #需要修改端口号,否则会和http模块中的server模块监听端口冲突
        proxy_pass xy104;
    }
}

ip_hash和url_hash不能在四层代理当中使用

你可能感兴趣的:(服务器,网络,运维)