Nginx分布式部署流程分析

2025-10-01 01:50

本文主要是介绍Nginx分布式部署流程分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事...

分布式部署

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

Nginx

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

Java中的代理

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

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

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

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

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

正向代理

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

反向代理

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

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

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

Nginx应用场景

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

Nginx分布式部署流程分析

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

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

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;
	}
}
  • down:表示当前的server暂时不参与负载,不会被访问。
  • Weight:默认为1。weight越大,负载的权重就越大,被访问的概率也就越高。(开发中可以设置让性能好的服务器js被访问概率更大)
  • max_fails:允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
  • fail_timeout: max_fails 次失China编程败后,暂停的时间。
  • Backup:其它所有的非backup机器宕机或者忙的时候,请求backup机器(可理解为备用机)。所以这台机器压力会最轻。
  • upstream 块:
    • 网上下载的nginx的conf配置中没有,需要自己手动添加
    • 这是定义负载均衡池的配置,名称为testnginx(可自定义)。
    • 里面包含了服务器地址(IP+端口号)。
    • Nginx 会按照默认的轮询策略(Round Robin)将请求分发到这些服务器。
  • server 块:
    • listen 80;:nginx的端口设置。
    • server_name 127.0.0.1;:nginx的IP设置。
    • location / 块:
      • 这是处理根路径请求的配置。
      • proxy_pass http://testnginx:关键配置,将所有根路径的请求转发到前面定义的testnginx负载均衡池。
      • root html:指定静态文件的根目录。
      • index:指定默认首页文件。

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://teWEUxqbEjQZstnginx;
		root   html;
		# 首页
		index  index.html index.htm;
	}
}

在jar包目录下通过cmd窗口使用java -jar jar包名命令启动jar包中的项目,然后再启动nginx。就可以去访问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>
</dependenChina编程cy>

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

@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
}

分布式事务

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

到此这篇关于Nginx分布式部署的文章就介绍到这了,更多相关nginx分布式部署内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Nginx分布式部署流程分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156121

相关文章

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe