• Nginx+Tomcat负载均衡、动静分离群集


    目录

    一、Nginx负载均衡实现原理

    1、反向代理原理

    2、Nginx静态处理优势

    3、Nginx动静分离原理

    二,Nginx+Tomcat负载均衡、动静分离试验

    1、Nginx主机安装

     2、Tomcat配置

    3、动静分离配置

    3.1 Tomcat1 server 配置

     3.2 Tomcat2 server 配置

    3.3 Nginx server 配置


    一、Nginx负载均衡实现原理

    Nginx实现负载均衡是通过反向代理实现

    • Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。
    • 但是不是把所有的web请求转发,而是将静态页面请求Nginx服务器自己来处理,动态页面请求,转发给后端的Tomcat服务器来处理。
    • Tomcat是属于轻量级的应用服务器,可接受访问量可能会不足,所以我们需要多台Tomcat服务器,然后通过Nginx配置权重来进行挑选Tomcat服务器去进行处理,负载均衡的一种策略。
       

    1、反向代理原理

        反向代理(ReverseProxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

        通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。

    2、Nginx静态处理优势

    • Nginx处理静态页面的效率远高于Tomcat的处理能力
    • 若Tomcat的请求量为1000次,则Nginx的请求量为6000次
    • Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3 .6M
    • Nginx处理静态资源的能力是Tomcat处理的6倍

    3、Nginx动静分离原理

    服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源有Nginx提供服务,动态资源Nginx转发至后端。

    用户向nginx发送请求,nginx作为代理服务器将请求代理给后端,原本项目部署会全部放在tomcat某个目录下,在这个目录下会出现问题,tomcat会响应很多非动态的请求(比如说一个index文件中hi有非常多的图片css,js,html一次请求肯定完不成,第二次请求时再去找那些静态资源,那么并发请求就会非常多)那么如果将一些静态资源(img,css,js)全放到nginx中,将动静态资源分开来,这就是动静分离。

    二,Nginx+Tomcat负载均衡、动静分离试验

    以Nginx作为负载均衡器,Tomcat作为应用服务器

    环境配置:

    两台tomcat,一台nginx

    nginx:192.168.62.10

    tomcat 01:192.168.62.50

    tomcat 02:192.168.62.40

    1、Nginx主机安装

    1. systemctl stop firewalld.service
    2. systemctl disable firewalld.service
    3. setenforce 0

    yum install -y pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

    useradd -M -s /sbin/nologin nginx

     

    1. cd /opt
    2. tar zxvf nginx-1.12.0.tar.gz -C /opt/

     

    1. cd nginx-1.12.0/
    2. ./configure \
    3. --prefix=/usr/local/nginx \
    4. --user=nginx \
    5. --group=nginx \
    6. --with-file-aio \
    7. --with-http_stub_status_module \
    8. --with-http_gzip_static_module \
    9. --with-http_flv_module \
    10. --with-http_ssl_module

    make && make install

    1. ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
    2. vim /lib/systemd/system/nginx.service
    3. [Unit]
    4. Description=nginx
    5. After=network.target
    6. [Service]
    7. Type=forking
    8. PIDFile =/usr/local/nginx/logs/nginx.pid
    9. ExecStart=/usr/local/nginx/sbin/nginx
    10. ExecReload=/bin/kill -s HUP $MAINPID
    11. ExecStop=/bin/kill -s QUIT $MAINPID
    12. PrivateTmp=true
    13. [Install]
    14. WantedBy=multi-user.target

    1. chmod 754 /lib/systemd/system/nginx.service
    2. systemctl start nginx.service
    3. systemctl enable nginx.service

     2、Tomcat配置

    tomcat部署

    1. systemctl stop firewalld
    2. systemctl disable firewalld
    3. setenforce 0
    4. 关闭防火墙
    5. 将所需要的安装包 放入 /opt/Tomcat下
    6. apache-tomcat-9.0.16.tar。gz
    7. jbk-8u201-linux-x86.rpm
    8. cd /opt
    9. #查询指定软件包的文件列表
    10. rpm -qpl jdk-8u201-linux-x64.rpm
    11. #安装
    12. rpm -ivh jdk-8u201-linux-x64.rpm
    13. java -version
    14. vim /etc/profile.d/java.sh
    15. export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
    16. export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    17. export PATH=$JAVA_HOME/bin:$PATH
    18. source /etc/profile.d/java.sh
    19. java -version
    20. 加载生效、查看版本
    21. vim abc.java
    22. #类名、接口名命令:英文大小写字母、数字字符、$和_,不能使用关键字和数字开头;
    23. 一个单词命名时第一个单词的首字母要大写;多单词组成时,所有单词的首字母大写:XxxYyyZzz(大驼峰命名法)
    24. public class abc {
    25. public static void main(String[] args){
    26. System.out.println("Hello world!");
    27. }
    28. }
    29. javac abc.java
    30. java abc
    31. cd /opt
    32. tar zxvf apache-tomcat-9.0.16.tar.gz
    33. mv apache-tomcat-9.0.16 /usr/local/tomcat
    34. ##启动tomcat
    35. #后台启动
    36. /usr/local/tomcat/bin/startup.sh
    37. netstat -natp | grep 8080

    3、动静分离配置

    3.1 Tomcat1 server 配置

    1. mkdir /usr/local/tomcat/webapps/test
    2. vim /usr/local/tomcat/webapps/test/index.jsp
    3. #动态页面的配置
    4. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    5. <html>
    6. <head>
    7. <title>JSP test1 page</title>
    8. </head>
    9. <body>
    10. <% out.println("动态页面 1,http://www.test1.com");%>
    11. </body>
    12. </html>

    添加虚拟主机配置

    1. vim /usr/local/tomcat/conf/server.xml
    2. <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    3. <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" /> #新增

    1. shutdown.sh
    2. startup.sh
    3. 重启服务

     3.2 Tomcat2 server 配置

    1. mkdir /usr/local/tomcat/webapps/test
    2. vim /usr/local/tomcat/webapps/test/index.jsp
    3. #动态页面的配置
    4. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    5. <html>
    6. <head>
    7. <title>JSP test2 page</title>
    8. </head>
    9. <body>
    10. <% out.println("动态页面 2,http://www.test2.com");%>
    11. </body>
    12. </html>

    1. vim /usr/local/tomcat/conf/server.xml #修改配置文件
    2. <!-- Host name="localhost" appBase="webapps" ##开头部分新增 !--
    3. unpackWARs="true" autoDeploy="true" --> ##新增 -->
    4. <!-- SingleSignOn valve, share authentication between web applications
    5. Documentation at: /docs/config/valve.html -->
    6. <!--
    7. <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
    8. -->
    9. <!-- Access log processes all example.
    10. Documentation at: /docs/config/valve.html
    11. Note: The pattern used is equivalent to using pattern="common" -->
    12. <!-- Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" #开头新增!--
    13. prefix="localhost_access_log" suffix=".txt"
    14. pattern="%h %l %u %t "%r" %s %b" / --> #结尾处新增-->
    15. ##以下为添加
    16. <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    17. <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
    18. </Host>

    1. shutdown.sh
    2. startup.sh
    3. 重启服务

     

     

    3.3 Nginx server 配置

    1. echo '

      this is static

      '
      > /usr/local/nginx/html/index.html
    2. 准备静态页面

    1. cd /usr/local/nginx/html/img/
    2. #上传一张图片到此目录下
    3. [root@localhost img]#ls
    4. cat.jpg

    1. vim /usr/local/nginx/conf/nginx.conf
    2. ......
    3. http {
    4. ......
    5. #gzip on;
    6. #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
    7. upstream tomcat_server {
    8. server 192.168.226.129:8080 weight=1;
    9. server 192.168.226.132:8080 weight=1;
    10. }
    11. server {
    12. listen 80;
    13. server_name www.kgc.com;
    14. #charset koi8-r;
    15. #access_log logs/host.access.log main;
    16. #配置Nginx处理动态页面请求,将 .jsp 文件请求转发到Tomcat 服务器处理
    17. location ~ .*\.jsp$ {
    18. proxy_pass http://tomcat_server;
    19. #设置后端的 Web 服务器可以获取远程客户端的真实IP #设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认host的值为proxy_pass指令设置的主机名
    20. proxy_set_header HOST $host;
    21. #把$remote_addr赋值给X-Real-IP(自定义),来获取源IP
    22. proxy_set_header X-Real-IP $remote_addr;
    23. #在Nginx作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
    24. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    25. }
    26. location / {
    27. root html;
    28. index index.html index.htm;
    29. }
    30. #复制
    31. upstream tomcat_server {
    32. server 192.168.226.129:8080 weight=1;
    33. server 192.168.226.132:8080 weight=1;
    34. }
    35. location ~ .*\.jsp$ {
    36. proxy_pass http://tomcat_server;
    37. proxy_set_header HOST $host;
    38. proxy_set_header X-Real-IP $remote_addr;
    39. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    40. }
    41. location / {
    42. root html;
    43. index index.html index.htm;
    44. }
    45. systemctl restart nginx.service

     

    1. 访问 http://192.168.62.10,会出现Nginx的静态页面
    2. 而访问 http://192.168.62.10/index.jsp 时,会动态的在Tomcat1和Tomcat2之间进行切换访问。

  • 相关阅读:
    springboot做系统一定要前后端吗?只有前端或者只有后端可以吗?
    《动手学深度学习 Pytorch版》 9.1 门控循环单元(GRU)
    为AntDesign的Table组件(树形数据)添加Checkbox(NG-ZORRO)
    黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)
    2022年还在做手动测试?是该好好反思了
    Centos下使用containerd管理容器:5分钟从docker转型到containerd
    [面试直通版]网络协议面试核心之HTTP,HTTPS,DNS-安全传输的基础
    Swift 面试题及答案整理,最新面试题
    安卓逆向案例——XX电影网
    科普rabbitmq,rocketmq,kafka三者的架构比较
  • 原文地址:https://blog.csdn.net/qq_69278945/article/details/126711374