本文主要是介绍Nginx分布式部署流程分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事...
分布式部署
分布式部署也叫集群或机群(多台电脑整合在一起,都运行相同的项目)。
Nginx
Nginx是做代理的,且Nginx是反向代理。(VPN是 正向代理)
Java中的代理
在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。
代理分为正向代理和反向代理
正向代理与反向代理的核心区别,本质上就是 “观察角度” 和 “代理服务的目标对象” 不同,而非代理本身有固定属性。
很多时候,同一个代理节点在不同场景下,因观察视角变化,可能同时扮演两种角色,也就试说反向代理和正向代理可以是同一个代理,这正是两者最易混淆的核心原因。
比如在当前角度看一个代理是正向代理,从另一个角度来看该代理则是反向代理。路由器使用的既可以是反向代理也可以是正向代理。
正向代理
正向代理就是把代理操作放在客户端。
反向代理
反向代理就是把代理操作放在服务器。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对WEUxqbEjQZ外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
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安装与启动
- 下载nginx包后解压到某盘(如:D盘nginx文件夹下)。
- 在nginx目录下,打开cmd,输入命令
start nginx.exe
启动nginx,也可以双击nginx.exe启动。(反馈不明显,只要做过启动操作,因该就已经启动了) - 浏览器输入127.0.0.1,进入nginx欢迎页面
- 服务停止命令:
nginx -s stop
- 服务重启命令:
nginx -s reload
- 一旦启动,就无法停止(上面的命令不能用)。如果需要关闭,可直接在任务管理器找到nginx任务并关闭。
负载均衡简单设置
- 打开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的地址+端口,指定要访问的项目中的接口。
域名映射
- 找到电脑C:\Windows\System32\drivers\etc下hosts文件并打开
- 127.0.0.1 www.lp.com(可任意) 将www.lp.com映射到127.0.0.1上
- 在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分布式部署流程分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!