负载均衡搭配
背景介绍
在当今互联网时代,高并发访问已成为Web应用程序面临的重要挑战之一,为了保证系统的稳定性和用户体验,我们需要采取有效的措施来应对这一挑战,本文将详细介绍如何利用Nginx搭配负载均衡和动静分离技术,构建高性能的Web应用。
一、Nginx简介
Nginx是什么
Nginx是一款开源的轻量级Web服务器和反向代理服务器,它由俄罗斯开发者Igor Sysoev创建并首次发布于2004年,Nginx采用事件驱动、异步非阻塞IO模型,以高性能著称,它可以处理静态文件、反向代理、负载均衡、动静分离等任务,适用于构建高并发、高可靠性的Web应用程序。
Nginx的特点
高性能:采用异步非阻塞IO模型,能够处理大量并发连接,具有优秀的性能表现。
稳定可靠:多进程/线程工作方式使得Nginx能够充分利用多核处理器,并在面对高并发请求时保持稳定性,它还具备高级的容错能力,即使其中一个进程/线程出现问题,其他进程/线程仍然可以正常工作。
轻量级:代码量相对较少,占用的系统资源较少,适合应用于资源受限的环境。
可扩展性:模块化设计使得用户可以根据需求选择所需的模块,并支持第三方插件的扩展。
二、负载均衡与动静分离
负载均衡
负载均衡指的是将客户端请求分摊到多个服务器上,以达到负载均衡的效果,通常情况下,负载均衡器会根据一定的算法(如轮询、权重、IP哈希等)选取一台可用的服务器,并将客户端请求转发到该服务器上,负载均衡的主要作用是提高系统的可用性、稳定性和吞吐量。
1.1 SLB+nginx负载均衡搭配
阿里云的SLB(Server Load Balancer)是一种负载均衡解决方案,主要负责负载均衡的作用,同样地,nginx也可以实现负载均衡的功能,如果只是单纯考虑负载均衡的话,阿里云的SLB优越性更高,但nginx可以做的更多,如反向代理、HTTP服务器等,灵活性更高,同时使用了nginx和SLB后,除了反向代理之外,nginx还承担了一个静态站点的HTTP服务。
1.2 upstream配置项
upstream是nginx中用于定义后端服务器池的配置项,常见的分配策略有:
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器。
weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream linuxidc{ server 10.0.0.77 weight=5; server 10.0.0.88 weight=10; }
ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream favresin{ ip_hash; server 10.0.0.10:8080; server 10.0.0.11:8080; }
fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream favresin{ server 10.0.0.10:8080; server 10.0.0.11:8080; fair; }
url_hash(第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream resinserver{ server 10.0.0.10:7777; server 10.0.0.11:8888; hash $request_uri; hash_method crc32; }
upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:
down:表示单前的server暂时不参与负载。
weight:默认为1,weight越大,负载的权重就越大。
max_fails:允许请求失败的次数默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。
fail_timeout:max_fails次失败后,暂停的时间。
backup:其它所有的非backup机器down或者忙的时候,请求backup机器,所以这台机器压力会最轻。
upstream bakend{ #定义负载均衡设备的Ip及设备状态 ip_hash; server 10.0.0.11:9090 down; server 10.0.0.11:8080 weight=2; server 10.0.0.11:6060; server 10.0.0.11:7070 backup; }
模拟一台宕机:用了nginx负载均衡后,在两台tomcat正常运行的情况下,访问http://localhost速度非常迅速,通过测试程序也可以看出是得到的负载均衡的效果,但是试验性的把其中一台tomcat(server localhost:8080)关闭后,再查看http://localhost,发现反应呈现了一半反映时间快一半反映时间非常非常慢的情况,但是最后都能得到正确结果,解决办法主要是proxy_connect_timeout这个参数,这个参数是连接的超时时间,我设置成1,表示是1秒后超时会连接到另外一台服务器。
#user nobody; worker_processes 1; #error_log logs/error.log; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; upstream localhost{ #ip_hash; server 127.0.0.1:8081; server 127.0.0.1:8080; } sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location /{ proxy_pass http://localhost; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 1; } } }
三、Nginx搭载负载均衡并提供前后端分离后台接口数据
Nginx安装
首先需要安装Nginx,可以通过以下命令进行安装:
sudo apt-get update sudo apt-get install nginx
安装完成后,可以通过sudo service nginx start
启动Nginx服务。
Tomcat负载均衡
假设我们有两个Tomcat服务器作为后端服务器,它们的地址分别是http://192.168.1.101:8080
和http://192.168.1.102:8080
,我们可以使用Nginx的upstream模块来实现负载均衡,具体配置如下:
upstream tomcat_servers{ server 192.168.1.101:8080; server 192.168.1.102:8080; } server{ listen 80; server_name yourdomain.com; location /{ proxy_pass http://tomcat_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
上述配置表示将所有来自yourdomain.com的请求转发到两个Tomcat服务器中的一个进行处理,Nginx会根据upstream中的配置自动选择合适的服务器进行响应。
负载均衡后台项目发布
为了实现负载均衡后的后台项目发布,我们需要将项目打包成WAR包并部署到Tomcat服务器上,具体步骤如下:
将项目打成WAR包,可以使用Maven或Gradle等构建工具来完成这一步,使用Maven的命令为:mvn clean package
。
将生成的WAR包复制到Tomcat服务器的webapps目录下,可以使用scp命令将WAR包复制到远程服务器:scp yourproject.war user@192.168.1.101:/path/to/tomcat/webapps/
。
重启Tomcat服务器以使新的WAR包生效,可以通过以下命令重启Tomcat:sudo service tomcat restart
,如果一切正常,你应该能够通过浏览器访问你的后台项目了。
小伙伴们,上文介绍了“负载均衡搭配”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。