nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > nginx分布式部署

Nginx分布式部署流程分析

作者:三口吃掉你

文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事务的挑战,感兴趣的朋友跟随小编一起看看吧

分布式部署

分布式部署也叫集群或机群(多台电脑整合在一起,都运行相同的项目)。

Nginx

Nginx是做代理的,且Nginx是反向代理。(VPN是 正向代理)

Java中的代理

在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。

代理分为正向代理和反向代理

正向代理与反向代理的核心区别,本质上就是 “观察角度” 和 “代理服务的目标对象” 不同,而非代理本身有固定属性。

很多时候,同一个代理节点在不同场景下,因观察视角变化,可能同时扮演两种角色,也就试说反向代理和正向代理可以是同一个代理,这正是两者最易混淆的核心原因。

比如在当前角度看一个代理是正向代理,从另一个角度来看该代理则是反向代理。路由器使用的既可以是反向代理也可以是正向代理。

正向代理

正向代理就是把代理操作放在客户端。

反向代理

反向代理就是把代理操作放在服务器。

反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

Nginx应用场景

我们做程序,会做一个前端vue项目(页面),连接我们的java项目。java项目返回数据给前端。
用户访问前端vue项目,这时会出现一个问题,访问前端vue服务器的人太多了(假如是100万),造成服务器压力过大。

对此,我们可以在一台新的服务器上再部署这个前端vue项目,让其中50万用户访问第一台服务器的vue项目,让另外50万用户访问第二胎服务器的vue项目,减轻服务器压力。

但问题是怎么让其中50万用户访问第一台服务器的vue项目,让另外50万的用户访问第二胎服务器的vue项目。这就需要用到Nginx了。

用户只需访问Nginx,Nginx会帮我们做一个转向,转到两台服务器的前端vue项目。至于如何均衡的转到这两台服务器,这就需要涉及到下面的负载均衡。

负载均衡

负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

Nginx安装与启动

  1. 下载nginx包后解压到某盘(如:D盘nginx文件夹下)。
  2. 在nginx目录下,打开cmd,输入命令start nginx.exe启动nginx,也可以双击nginx.exe启动。(反馈不明显,只要做过启动操作,因该就已经启动了)
  3. 浏览器输入127.0.0.1,进入nginx欢迎页面
  4. 服务停止命令:nginx -s stop
  5. 服务重启命令:nginx -s reload
  6. 一旦启动,就无法停止(上面的命令不能用)。如果需要关闭,可直接在任务管理器找到nginx任务并关闭。

负载均衡简单设置

  1. 打开D:\nginx\conf目录下nginx.conf文件
upstream servertest {
	server 192.168.1.146:8080 down;
	server 192.168.1.146:8081 weight=3;
	server 192.168.1.146:8082;
	server 192.168.1.146:8083 backup;
}
server {
	listen 8080; #监听端口
	server_name localhost; #监听地址
	location / {
		proxy_pass http://servertest; #请求转向servertest 定义的服务器列表
		root html;
		index index.html index.htm;
	}
}

Java项目使用nginx流程

现在大多都是前端在用Nginx,其实我们Java后端也能用Nginx,使用方法跟前端一样。
可参考文章:分布式开发中最后的项目打包,分别设置使用不同的端口(因为都是在自己电脑上运行测试)进行打包,比如一个使用81端口,一个使用82端口(项目代码都一样,只是使用的端口号不同)。

配置nginx.conf

# 需要自己写,名字可随意起,这里是testnginx,网上下载的nginx不会自带,需要自己写,里面是要进行转向管理的服务器
upstream testnginx{
   server 127.0.0.1:8081;
   server 127.0.0.1:8082;
} 
server {
	# nginx的端口设置
	listen       8080;
	# nginx的IP设置
	server_name  127.0.0.1;	
	#charset koi8-r;
	#access_log  logs/host.access.log  main;
	location / {
		# nginx要访问的upstream,http://后面要与上面定义的upstream的名字保持一致
		proxy_pass   http://testnginx;
		root   html;
		# 首页
		index  index.html index.htm;
	}
}

在jar包目录下通过cmd窗口使用java -jar jar包名命令启动jar包中的项目,然后再启动nginx。就可以去访问nginx了,nginx会自动将请求随机转发给设置的服务器地址。

浏览器访问nginx的地址+端口,指定要访问的项目中的接口。

域名映射

  1. 找到电脑C:\Windows\System32\drivers\etc下hosts文件并打开
  2. 127.0.0.1 www.lp.com(可任意) 将www.lp.com映射到127.0.0.1上
  3. 在nginx中配置server中server_name为www.lp.com

session共享解决方案

ip_hash

nginx中的ip_hash技术能够将某个ip的请求固定到同一台后端应用服务器,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:

upstream servertest {
	server 192.168.1.146:8080 down;
	server 192.168.1.146:8081 weight=3;
	server 192.168.1.146:8082;
	server 192.168.1.146:8083 backup;
	ip_hash;
}

优点:ip_hash算法可以把一个ip映射到一台服务器上,这样可以解决session同步的问题。这样每个访客固定访问一个后端服务器,可以解决session的问题;

缺点:使用ip_hash进行session共享,它的原理是为每个访问者提供一个固定的访问ip,让用户只能在当前访问的服务器上进行操作,保持了session同步的,但是也造成了负载不均衡的问题,如果当前用户访问的服务器挂了的话,那就会出现问题了;

springsession

这种方式用户通过Nginx访问了其中一台服务器,存了一个session,这个session会同步到其它服务器。

导入jar

<dependency>
	<groupId>org.springframework.session</groupId>
	<artifactId>spring-session-data-redis</artifactId>
	<version>2.0.4.RELEASE</version>
</dependency>

编写(只需开启,不用配置)

@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
}

分布式事务

一旦把项目部署在多台服务器上,就会产生事务问题、多线程问题、操作统一资源产生的问题

到此这篇关于Nginx分布式部署的文章就介绍到这了,更多相关nginx分布式部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文