Windows下nginx+tomcat的负载均衡

2023-05-16

一、为什么需要对Tomcat服务器做负载均衡: 

Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果有超过500的并发数便会出现Tomcat不能响应新的请求的情况,严重影响网站的运行。另外,在访问量大的情况下,Tomcat的线程数会不断增加。由于Tomcat自身对内存的占用有控制,当对内存的占用达到最大值时便会出现内存溢出,对网站的访问严重超时等现象,这时便需要重新启动Tomcat以释放占用的内存,这样做便会阻断网站运行。 

所以对Tomcat做负载均衡便很有必要。目前可以和Tomcat做负载均衡的主流服务器是Apache,但是Nginx由于功能多、配置简单等优点逐渐成为很多负载均衡服务器的首选。Nginx的并发数可达到50000,所以理论上可以和Tomcat以1:100的比例来配置,这样便可以很好的解决网站并发瓶颈问题。而且Nginx、apache是基于http反向代理方式,位于ISO模型的第七层应用层。直白些就是TCP UDP 和http协议的区别,Nginx不能为基于TCP协议的应用提供负载均衡。

 二. 配置方法

  1.下载相应的服务器,本人两个Tomcat的版本都采用6.0的.Nginx采用1.5.6版本

  

  2. Nginx介绍

     目录结构

     Nginx-

              |_  conf   配置目录

              |_  contrib

              |_  docs 文档目录

              |_  logs  日志目录

              |_  temp 临时文件目录

              |_  html 静态页面目录

              |_  nginx.exe 主程序

   window下安装Nginx极其简单,解压缩到一个无空格的英文目录即可(个人习惯,担心中文出问题),双击nginx启动,这里我安装到:D:\test目录. 若果想停止nginx,dos环境运行命令:nginx -s stop.

nginx.conf配置

   Nginx配置文件默认在conf目录,主要配置文件为nginx.conf,我们安装在D:\server\nginx-0.8.20、默认主配置文件为D:\server\nginx-0.8.20\nginx.conf。下面是nginx作为前端反向代理服务器的配置。

Nginx.conf代码

  #Nginx所用用户和组,window下不指定
#user  nobody;

#工作的子进程(通常等于CPU数量或者1倍于CPU)
worker_processes  1;

#错误日志存放路径
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#指定pid存放文件
#pid        logs/nginx.pid;


events {
    #允许最大连接数
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
     
	 #定义日志格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    
	#客户端上传文件大小控制
	client_max_body_size 8m;
	
    #gzip  on;
      upstream localhost {  
            	  server localhost:8080;
				  server localhost:8000;
         #根据ip计算将请求分配各那个后端tomcat,许多人误认为可以解决session问题,其实并不能。				  
         #同一机器在多网情况下,路由切换,ip可能不同                
			   ip_hash;  
				   } 
				   
    server {
        listen       9999;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root html;
			index index.html index.htm;
			#此处的 http://localhost与upstream localhost对应
			proxy_pass  http://localhost;
			
			proxy_redirect off;
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
			client_max_body_size   10m; 
			client_body_buffer_size  128k;
			proxy_connect_timeout  100;
			proxy_send_timeout   100;
			proxy_read_timeout 100;
			proxy_buffer_size 4k;
			proxy_buffers  4 32k;
			proxy_busy_buffers_size 64k;
			proxy_temp_file_write_size  64k;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


修改Nginx配置文件nginx.conf

①       在#gzip  on;后面加入下面配置: 

       

 upstream localhost {   
            server localhost:8080;   
            server localhost:8088;   
           ip_hash; 
 } 

其中serverlocalhost:8080为第一个Tomcat的启动地址,server localhost:8088为第二个Tomcat的启动地址,ip_hash用于做session同步其实是不起作用的。

 ② 修改第一个server{}配置中的listen  80;改为新的端口号,因为我的本机80端口被其他服务器占用,因此将此处改为listen 9999;

location / {
          root   html;  
          index  index.html index.htm; 
}  
改为: 
location / {
                        root html;
			index index.html index.htm;
			#此处的 http://localhost与upstream localhost对应
			proxy_pass  http://localhost;
			
			proxy_redirect off;
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
			client_max_body_size   10m; 
			client_body_buffer_size  128k;
			proxy_connect_timeout  100;
			proxy_send_timeout   100;
			proxy_read_timeout 100;
			proxy_buffer_size 4k;
			proxy_buffers  4 32k;
			proxy_busy_buffers_size 64k;
			proxy_temp_file_write_size  64k;
        }

3.tomcat的配置

  修改其中一个tomcat的server.xml配置文件即可

第一处端口修改:

 <!--  修改port端口:18006 俩个tomcat不能重复,端口随意,别太小-->  
<Server port="8000" shutdown="SHUTDOWN">  
第二处端口修改

<!-- port="18081" tomcat监听端口,随意设置,别太小 -->  
<Connector port="18081" protocol="HTTP/1.1"   
               connectionTimeout="20000"   
               redirectPort="8443" />  

 第三处端口修改:

Java代码 

"8009" protocol="AJP/1.3" redirectPort="8443" />

验证配置与测试负载均衡

  首先测试nginx配置是否正确,测试命令:nginx -t  (默认验证:conf\nginx.conf),也可以指定配置文件路径


 其次验证两个tomcat,启动两个tomcat不出现端口冲突即为成功

最后验证配置负载均衡,启动nginx双机nginx.exe文件或者用start nginx启动 打开浏览器输入地址http://localhost:9999看到下面画面表示成功:

此图说明已经成功跳转到tomcat 输入测试路径可以看到测试项目的首页就表示基本成功。


     至此windownginx+tomcat负载均衡配置结束,关于tomcat Session的问题通常是采用memcached,或者采用nginx_upstream_jvm_route,他是一个 Nginx的扩展模块,用来实现基于 Cookie Session Sticky的功能。如果tomcat过多不建议session同步,server间相互同步session很耗资源,高并发环境容易引起Session风暴。请根据自己应用情况合理采纳session解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows下nginx+tomcat的负载均衡 的相关文章

  • 当调用dll函数时,参数对象的成员变量的内存地址发生变化

    类某类 一些成员MemberClass one of the mem 我有一个函数foo SomeClass object 在 dll 中 它是从 exe 调用的 Problem 地址one of the mem 在调度 dll 调用期间发
  • Flask 或 Pyramid 中的简单网络 UDP 监听

    我需要创建一个 Web 应用程序来显示通过定期传入 UDP 数据包提供的数据 该站点可能位于 Flask 可能是 Pyramid 中 部署在 Nginx 下 如何创建一个非常简单的后台任务 基本上只是 socket recv 来侦听任何传入
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • WndProc调用机制(WinAPI)

    我试图了解 Windows 应用程序是如何工作的 有一个WndProc函数 其中发生消息处理 LRESULT CALLBACK WndProc HWND hwnd UINT msg WPARAM wParam LPARAM lParam s
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 推送更改到 Git 不起作用

    每次我想要提交命令 git push heroku master 时 系统都会要求我在 PowerShell 中输入凭据 当我输入 heroku 凭据 默认情况下连接到 git 时 我收到错误消息 但是 当我输入我的主目录中的 netrc
  • Windows 10:任务栏中的图标大小错误

    从 Windows 10 开始 任务栏中的图标大小似乎为 24x24px 如果 Windows 选择图标文件中的 24px 版本进行显示 那么这不会有问题 但它选择了 32px 版本并将其缩小 这会导致丑陋的伪像 尤其是当你的图标中有直线时
  • 我们必须将 .class 文件放在 Tomcat 目录中的位置

    我必须把我的 class文件在 Tomcat 目录中 在我的 Java Complete Reference 书中 他们告诉将其放入C Program Files Apache Tomcat 4 0 webapps examples WEB
  • web.xml 中的多个安全约束不起作用

    我正在升级一个 Web 应用程序 Servlet 3 0 Tomcat 7 它的大部分页面都需要基本身份验证 该应用程序具有一小组监视 servlet 其中任何一个都不应该受到保护 在我的web xml 我目前有以下内容security c
  • perfmon 性能计数器是否基于与 xperf 使用的 ETW 事件“幕后”相同的东西?

    我最近开始熟悉 perfmon 和 xperf Perfmon 使用性能计数器 xperf 使用 ETW Windows 事件跟踪 Perfmon 具有提供数据的对象 而 xperf 使用 提供者 组 作为这个领域的新手 我想问是否有人可以
  • 如何在 IIS 上设置 Mercurial 和 hgweb?

    我一直在寻找关于如何让 hgweb 在 IIS 上工作的不错的说明 但我没有发现太多有价值的信息 There s 这个 一步一步 https www mercurial scm org wiki HgWebDirStepByStep在 Me
  • 在 .NET 中获取远程计算机上环境变量的实际值

    我正在尝试获取实际值 of 环境变量 这是我到目前为止所拥有的 string query string Format Select VariableValue From Win32 Environment Where Name 0 vari
  • MySQL JDBC 连接上的故障转移?

    我正在尝试确定如何使用 MySQL JDBC 驱动程序实现高可用性解决方案 似乎有一个我可以设置的故障转移属性 但我想知道当使用 MySQL 和 JDBC 实现简单的故障转移机制时 人们倾向于使用什么 我们计划将 2 个前端 Tomcat
  • 为什么将域连接到“Shopify”需要 CNAME 和 A 记录?

    为什么将域连接到 Shopify 需要CNAME and ARecord ref https help shopify com en manual domains add a domain using existing domains co
  • 带有 Spring 的 Tomcat

    我有一个在 Tomcat 中托管的 3 层应用程序 Web 服务和 DAO 层 如何整合Tomcat和Spring 我需要利用Spring的依赖注入 事务管理等 我只能想到实例化 ClassPathXmlApplicationContext
  • 使用 INF 文件 C++ 以编程方式安装驱动程序

    这里有人可以告诉我如何安装第 3 方设备驱动程序吗 如果提供了所有必需的文件 即 inf 文件 sys 等 则以编程方式进行 这 该解决方案应运行的最低操作系统是Windows2000 我尝试复制 inf文件放入Win文件夹 INF文件夹和
  • Inno Setup 安装程序的文本编码错误

    对于某些 Windows 安装 我的安装程序 Inno Setup 的俄语文本编码很差 所有机器都安装了Windows XP SP3 英文版 但有些机器可以运行 有些机器则没有 Windows 上有什么设置可以解决这个问题吗 Thanks
  • 如何将 CString 传递给格式字符串 %s?

    class MyString public MyString const std wstring s2 s s2 operator LPCWSTR const return s c str private std wstring s int
  • 如何使用 VB6 调用 Windows shell 命令?

    究竟如何使用 VB6 才能像从命令行一样调用任何 Windows shell 命令 例如 一些微不足道的事情 echo foo 操作方法如下 Shell cmd echo foo vbNormalFocus
  • 使用 Windows 锁定屏幕后删除 Kerberos 缓存票证

    无论如何 有没有办法阻止 Kerberos 缓存的票证在 Windows 进入锁定屏幕后被删除 首次登录 Windows 时 klist exe 显示 2 个缓存票证 但是 发生 Windows 锁屏事件后 klist exe 显示 0 个

随机推荐