您现在的位置是:首页 >技术杂谈 >【Web服务应用】Nginx七层反向代理与四层反向代理网站首页技术杂谈
【Web服务应用】Nginx七层反向代理与四层反向代理
Nginx七层反向代理与四层反向代理
一、代理
1.1什么是代理
- 代理:也被叫做网络代理,是一种比较特殊的网络服务,允许一个终端(通常指客户端)通过这个服务与另一个终端(通常指服务器端)进行非直接的连接。例如:一些网关、路由器等网络设备都具备网络代理的功能。代理服务有利于保障网络终端的隐私或者安全,可以在一定程度上阻止网络攻击(因为通过代理,可以隐藏真正的服务器端/客户端)。
1.2正向代理
- 通常我们说的代理,都是指的正向代理。继续看这张图,你会发现,此处的代理服务器可以由客户端提供,也可以由服务器端提供。
当客户端主动使用代理服务器时,此时的代理叫正向代理。比如:一些网络代理工具(加速器/VPN…)
- 通过上图可以看到,客户端并没有直接与服务器相连。正向代理隐藏了真实的客户端地址。可以很好地保护客户端的安全性。
1.3反向代理
- 服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知代理服务器的IP地址,而不知道在代理服务器后面的服务器集群的存在
反向代理整个流程:由客户端发起对代理服务器的请求,代理服务器在中间将请求转发给某一个服务器,服务器将结果返回给代理服务器,代理服务器再将结果返回给客户端。
1.4反向代理的适用场景
- 负载均衡
(1)如果服务器集群中有负荷较高者,反向代理通过URL重写,根据连线请求从负荷较低者获取与所需相同的资源或备援。可以有效降低服务器压力,增加服务器稳定性 - 提升服务器安全性
(1)可以对客户端隐藏服务器的IP地址
(2)也可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等 - 加密/SSL加速:
(1)将SSL加密工作交由配备了SSL硬件加速器的反向代理来完成提供 - 缓存服务,加速客户端访问
(1) 对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务 - 数据统一压缩
(1)节约带宽
(2)为网络带宽不好的网络提供服务
- 统一的访问权限控制
- 统一的访问控制
- 突破互联网的封锁
- 为在私有网络下(如局域网)的服务器集群提供NAT穿透及外网发布服务
- 上传下载减速控制
1.5正向代理与反向代理的区别
当前面的内容理解后,对于正向代理和反向代理的区别就很好理解了。
最核心的不同在于代理的对象不同。 正向代理是代理客户端,反向代理是代理服务器。
而根据这核心的区别,我们也可以记住:代理哪端便可以隐藏哪端。
也就是说:
正向代理隐藏真实客户端,反向代理隐藏真实服务端。
二、反向代理
2.1负载均衡
- Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
- 内置策略为轮询,加权轮询,Ip hash。
- 扩展策略,就天马行空,只有你想不到的没有他做不到的。
负载均衡有哪些模式
Nginx 负载均衡模式:
●rr 轮询 负载均衡模式:
每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。●least_conn 最少连接: 优先将客户端请求调度到当前连接最少的服务器。
●ip_hash 负载均衡模式:
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session
共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。●fair(第三方)负载均衡模式: 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
●url_hash(第三方)负载均衡模式:
基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。
- 轮询
循环的意思
- 加权轮询
■ iphash
-
对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
-
有n台 tomcat 服务器,则有n个 session,如何实现session共享?【实际开发使用的是redis】
-
nginx 提供的方法是:ip进行hash运行,从而固定的ip访问固定的某台服务器。
2.2动静分离
▪ 动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。
▪
让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。
三、Nginx实战
3.1七层反向代理,负载均衡,动静分离
Nginx代理tomcat服务器
)
(1)部署tomcat服务器,关闭防火墙,安装JDK,配置tomcat多实例,模拟两台tomcat服务器
,详情看上一篇博客
(2)在两台tomcat服务器配置动态网页,
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title> #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1");%>
</body>
</html>
tomcat2同样配置
(3)部署Nginx服务器
systemctl stop firewalld
setenforce 0
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure
--prefix=/usr/local/nginx
--user=nginx
--group=nginx
--with-file-aio #启用文件修改支持
--with-http_stub_status_module #启用状态统计
--with-http_gzip_static_module #启用 gzip静态压缩
--with-http_flv_module #启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module #启用 SSL模块,提供SSL加密功能
--with-stream
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
(4)添加Nginx负载均衡,动静分离
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
#gzip on;
#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
upstream tomcat_server {
server 192.168.80.100:8080 weight=1;
server 192.168.80.101:8080 weight=1;
server 192.168.80.101:8081 weight=1;
}
server {
listen 80;
server_name www.kgc.com;
charset utf-8;
#access_log logs/host.access.log main;
#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
location ~ .*.jsp$ {
proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IP
proxy_set_header X-Real-IP $remote_addr;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#配置Nginx处理静态图片请求
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/img;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
......
}
......
}
(5)配置Nginx静态页面,浏览器访问器实验
3.2四层反向代理
(1) 如图所示四层反向代理只做一个负载均衡配置,他代理两台七层反向代理服务器
第一步:如上面实验所示,在配置一台七层反向代理服务器,里面也要配置动静分离与负载均衡,同样代理两台tomcat服务器
(2)配置四层反向代理服务器
#四层反向代理需要stream块,如果编译时没有配置请重新编译
./configure --with-stream
和http同等级:所以一般只在http上面一段设置,
stream {
#这里代理两台Nginx服务器
upstream appserver {
server 192.168.243.102:80 weight=1;
server 192.168.243.103:80 weight=1;
}
#设置反向代理的端口号为8080与本机的端口号不一致即可
server {
listen 8080;
proxy_pass appserver;
}
}
http {
#实验环境中负载均衡最好把连接保持关闭,否则会发转跳转失败
......