正向代理代理的是客户端。
客户端设备要访问局域网以外的 Internet 时,需在客户端浏览器中配置代理服务器,然后通过代理服 务器来进行访问,将访问到的局域网以外的 Internet 网站内容返回给客户端,而不是通过局域网中的客 户端设备直接访问。
访问原来无法访问的资源;
可做缓存,加速访问资源;
对客户端访问授权,上网进行认证;
代理可以记录用户访问记录等,且对外隐藏用户信息。
server {
listen 80;
server_name ....;#客户端访问的域名或IP地址
location / {
proxy_pass http://目标服务器地址;
}
}
反向代理代理的是服务端。
在使用反向代理时,客户端向一个服务器发送请求,而实际上该请求会被转发到后端的多个真实服务器(也称为上游服务器),然后由反向代理服务器来处理请求并将结果返回给客户端。
客户端不直接与后端服务器进行通信,而是与反向代理服务器进行通信,隐藏了后端服务器的 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:只能做四层转发
$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;
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不能在四层代理当中使用