Nginx实现负载均衡和反向代理

Nginx 简介

什么是 Nginx

Nginx 是一款高性能的 HTTP 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师 Igor Sysoev 所开发,官方测试 Nginx 能够支支撑 5 万并发链接,并且 CPU、内存等资源消耗却非常低,运行非常稳定。

Nginx 的应用场景

  • HTTP 服务器:Nginx 是一个 HTTP 服务可以独立提供 HTTP 服务。可以做网页静态服务器。
  • 虚拟主机:可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
  • 反向代理,负载均衡:当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用 Nginx 做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况

Nginx 惊群问题

在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连接时会有争抢,这会带来著名的“惊群”问题,子进程数量越多越明显,这会造成系统性能的下降。

一般情况下,有多少CPU核心就有配置多少个worker子进程。假设现在没有用户连入服务器,某一时刻恰好所有的子进程都休眠且等待新连接的系统调用(如epoll_wait),这时有一个用户向服务器发起了连接,内核在收到TCP的SYN包时,会激活所有的休眠worker子进程。最终只有最先开始执行accept的子进程可以成功建立新连接,而其他worker子进程都将accept失败。这些accept失败的子进程被内核唤醒是不必要的,他们被唤醒会的执行很可能是多余的,那么这一时刻他们占用了本不需要占用的资源,引发了不必要的进程切换,增加了系统开销。

简单的说:就比如你去KTV唱歌,KTV晚上刚上班,你一进去就要叫小姐陪唱,老板一下就叫了好多个小姐姐过来,但是你只需要一个,所以这就造成了没必要的浪费。

Nginx 反向代理

什么是代理服务器?

代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。

在这里插入图片描述
为什么要使用代理服务器?

提高访问速度

由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。

防火墙作用

由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。

通过代理服务器访问不能访问的目标站点

互联网上有许多开放的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的翻墙浏览器就是利用了代理服务器,虽然不能出国,但也可直接访问外网。

什么是正向代理?

正向代理,架设在客户机与目标主机之间,只用于代理内部网络对 Internet 的连接请求,客户机必须指定代理服务器,并将本来要直接发送到 Web 服务器上的 Http 请求发送到代理服务器中。

在这里插入图片描述
什么是反向代理?

反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。

在这里插入图片描述
反向代理有哪些主要应用?

现在许多大型 web 网站都用到反向代理。除了可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器。

下载Windows版本的Nginx:http://nginx.org/en/download.html
Linux下使用Docker容器安装:docker pull nginx

注意:在Linux或者Windows下实现负载均衡和反向代理的方式基本相同都是更改nginx的nginx.conf配置文件

需求

  • 两个 tomcat 服务通过 nginx 反向代理
  • tomcat1 服务器:192.168.88.136:9090
  • tomcat2 服务器:192.168.88.136:9091

1、运行两个tomcat容器(我这里使用docker容器启动)

docker run --name tomcat1 -p 9090:8080 -d tomcat
docker run --name tomcat2 -p 9091:8080 -d tomcat

2、编辑nginx.conf配置文件(windows版本的)

3、复制以下代码

user  nginx;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	
	# 配置一个代理即 tomcat1 服务器
	upstream tomcatServer1 {
		server 192.168.88.136:9090;
	}

	# 配置一个代理即 tomcat2 服务器
	upstream tomcatServer2 {
		server 192.168.88.136:9091;
	}

	# 配置一个虚拟主机
	server {
		listen 80;
		server_name localhost;
		location / {
				# 域名 localhost 的请求全部转发到https://www.baidu.com/服务上
				proxy_pass https://www.baidu.com/;
				# 欢迎页面,按照从左到右的顺序查找页面
				index index.jsp index.html index.htm;
		}
	}
	
server {
		listen 80;
		server_name localhost;

		location / {
			# 域名 admin.web.itoken.funtl.com 的请求全部转发到 tomcatserver2 即 tomcat2 服务上
			proxy_pass https://www.google.com/;
			index index.jsp index.html index.htm;
		}
	}
}	

一个server就是一个虚拟主机,可以配置多个

4、浏览器输入localhost 出现百度页面就说明反向代理配置成功
(这里只是一个例子,在实际开发中域名用自己,转发页面自己指定)
在这里插入图片描述
Nginx负载均衡一些基础知识:
nginx 的 upstream目前支持 5 种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
比如:

	# 配置一个代理即 tomcat1 服务器
	upstream tomcatServer1 {
		server 192.168.88.136:9090 weight=2;
	}

	# 配置一个代理即 tomcat2 服务器
	upstream tomcatServer2 {
		server 192.168.88.136:9091 weight=1;
	}

3)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5)、url_hash(第三方)

Nginx 负载均衡

什么是负载均衡

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为 Load Balance,其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

Nginx 实现负载均衡

  • tomcat1 服务器:192.168.88.136:9090
  • tomcat2 服务器:192.168.88.136:9091

1、编辑nginx.conf配置文件(windows版本的)
2、复制以下代码到nginx.conf

user  nginx;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	
	# 配置一个代理即 mytomcat 服务器
	upstream mytomcat {
		server 192.168.88.136:9090;
		server 192.168.88.136:9091;
	}


	# 配置一个虚拟主机
	server {
		listen 80;
		server_name localhost;
		location / {
				proxy_pass http://mytomcat;
				# 欢迎页面,按照从左到右的顺序查找页面
				index index.jsp index.html index.htm;
		}
	}

}

3、启动nginx,浏览器访问localhost nginx会轮询访问tomcat服务器:192.168.88.136:9090192.168.88.136:9091
这样就实现了负载均衡

如果想指定轮询几率修改nginx.conf文件(9090端口的tomcat优先级更高):

# 配置一个代理即 mytomcat 服务器
	upstream mytomcat {
		server 192.168.88.136:9090 weight=2;
		server 192.168.88.136:9091 weight=1;
	}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Nginx是一款高性能、轻量级的Web服务器,它可以作为反向代理服务器和负载均衡器。下面是Nginx实现反向代理负载均衡的详细过程: 1. 反向代理 反向代理是指客户端请求的资源不是直接由服务器提供,而是由代理服务器转发请求到后端服务器获取资源并返回给客户端。反向代理可以隐藏后端服务器的真实IP地址,提高了系统的安全性。 Nginx实现反向代理的步骤如下: 1) 在Nginx配置文件中配置反向代理服务器的IP地址和端口号。 2) 配置反向代理的location块,将客户端请求的URL转发到后端服务器。 3) 配置后端服务器的IP地址和端口号。 2. 负载均衡 负载均衡是指将客户端请求均匀地分发到多个后端服务器上,以达到提高系统响应速度和增加系统的可靠性的目的。Nginx实现负载均衡的方式有多种,其中常用的有轮询方式和IP hash方式。 轮询方式是指将客户端请求轮流分配到后端的每台服务器上,每次请求都按照服务器列表的顺序依次分配。轮询方式是Nginx默认的负载均衡方式。 IP hash方式是指根据客户端的IP地址计算出一个hash值,然后将该请求分配到hash值对应的后端服务器上,这样相同IP地址的请求总是被分配到同一台后端服务器上。 Nginx实现负载均衡的步骤如下: 1) 在Nginx配置文件中配置后端服务器的IP地址和端口号。 2) 配置upstream块,将多个后端服务器配置在upstream块中。 3) 配置负载均衡的方式,例如轮询方式或IP hash方式。 总体来说,Nginx作为反向代理负载均衡器,可以提高系统的性能和可靠性,是企业级应用中非常常用的技术之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值