Nginx+Tomcat负载均衡配置

参考文件:

Nginx+Tomcat负载均衡配置 : http://blog.csdn.net/wave_1102/article/details/44475093
参考:http://blog.csdn.net/wave_1102/article/details/44475093

理论:

【Nginx 和 Apache 各有什么优缺点?】
可参考一些文章:
http://www.cnblogs.com/huangye-dream/p/3550328.html
https://www.zhihu.com/question/19571087
nginx 相对 apache 的优点:
(1) 轻量级,同样起web 服务,比apache 占用更少的内存及资源抗并发,
(2) nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能高度模块化的设计,编写模块相对简单社区活跃,各种高性能模块出品迅速啊
apache相对nginx 的优点:
rewrite(URL重写) ,比nginx 的rewrite 强大模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多超稳定存在就是理由,
一般来说,
(1)如果需要性能的web 服务,用nginx
(2)如果不需要性能只求稳定,那就apache。apache的各种功能模块实现得比前者,例如ssl 的模块就比前者好,可配置项多。
注意:epoll(freebsd 上是 kqueue )网络IO 模型是nginx 处理性能高的根本理由,但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的select 模型或许比epoll 更高性能。当然,这只是根据网络IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。
1.Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache吧
2.ginx处理静态文件好,耗费内存少.但无疑apache仍然是目前的主流,有很多丰富的特性.所以还需要搭配着来.当然如果能确定nginx就适合需求,那么使用nginx会是更经济的方式.
3.nginx 适合做静态,简单,效率高,apache 适合做动态,稳定,功能强
4....


【关于Nginx/Apache + Tomcat架构方式,如何选择】
(1)Nginx:一款能承受高并发的HTTP服务器,异步的,多个连接(万级别)可以对应一个进程,进行响应。基于事件驱动模型。
Nginx优点:负载均衡、反向代理、处理静态文件优势。
(2)Apache:相对于Nginx来说,同步多进程模型,一个连接对一个进程方式处理请求。在速度上和消耗来说,Apache不能承受高并发,会导致宕机。
Apache优点:相对于Tomcat服务器来说处理静态文件是它的优势,速度快。Apache是静态解析,适合静态HTML、图片等。相对于Nginx来说,Nginx配置简洁,简单配置负载均衡,而Apache配置复杂。Nginx处理静态文件的性能也优于Apache,Apache提供的组件比Nginx多,
(3)Tomcat:动态解析容器,处理动态请求,是编译JSP\Servlet的容器。
Tomcat优势:处理动态请求,以线程的方式处理请求。

Nginx有动态分离机制,静态请求直接就可以通过Nginx处理,动态请求才转发请求到后台交由Tomcat进行处理。

动静分离普遍采用的架构组合有:
(1)比较早使用的,apache+tomcat
(2)nginx+tomcat
(3)nginx+apache+tomcat
很明显方案1比较老,但由于历史原因有部分系统在使用;方案3,很多人用pache来做一个中间层,用来检测请求,并做一些校验,和攻击防护,比加CSRF校验,防slow HTTP denial.这些只需要在apache加一个module即可,而真正的后台Tomcat只需要关注逻辑处理即可,更多是因为更熟悉apache或是更注重apache的稳定性,虽然nginx也可以实现相同功能

Nginx+tomcat是目前主流的Java web架构,如何让nginx+tomcat同时工作呢,也可以说如何使用nginx来反向代理tomcat后端均衡呢!!!

Tomcat集群规划

192.168.1.111:8080
192.168.1.112:8080


安装步骤

Java JDK安装:参照 jdk安装实践

Nginx安装:参照ngixn.txt

Tomcat安装:参照tomcat安装
#官方网站下载tomcat 6.0.30或者其他版本:  

注:如下举措在一台上部署多台Tomcat时使用

#直接解压就可以使用,解压完成执行,同时拷贝两个tomcat,命名为tomcat1 tomcat2   
mv apache-tomcat-6.0.30  /usr/local/tomcat1  
cp /usr/local/tomcat1  /usr/local/tomcat2 -r  
#分别修改tomcat1和tomcat2 端口,这里有三个端口需要修改,分别如下:  
shutdown 端口:8005  主要负责启动关闭.  
ajp端口:8009 主要负责通过ajp均衡(常用于apache和tomcat整合)  
http端口:8080 可以通过web页面直接访问(nginx+tomcata整合)  
#注* 如果tomcat1三个端口分别为:8005 8009 8080 ,那么tomcat2端口在此基础上都+1,即为:8006 8010 8081  

#一台服务器上,端口不能重复,否则会报错。   
#修改完端口后,然后启动两个tomcat,启动命令为:  
#如何提示没有这个文件或者权限不足,需要tomcat 的bin目录对sh文件赋予执行权限:chmod o+x   *.sh  
/usr/local/tomcat1/bin/startup.sh  
/usr/local/tomcat2/bin/startup.sh  
#启动后,使用netstat -tnl 可以看到6个端口,即代表tomcat1 tomcat2成功启动。你可以使用http://ip:8080  http://ip:8081访问tomcat默认页面。
 

无论单台还是多台,如果需要修改tomcat发布目录为自己制定的目录,需要做如下调整,创建两个发布目录:
(1) mkdir -p /usr/webapps/{www1,www2} 
(2) 编辑vi /usr/local/tomcat1/conf/server.xml 在最后</Host>前一行加下内容:<Context  path="" docBase="/usr/webapps/www1" reloadable="false"/>
(3) 编辑vi /usr/local/tomcat2/conf/server.xml 在最后</Host>前一行加下内容:<Context  path="" docBase="/usr/webapps/www2" reloadable="false"/>
(4)  tomcat1发布目录内容:

    <html>  
    <body>  
    <h1>TOMCAT_1 JSP Test Page</h1>  
    <%=new java.util.Date()%>  
    </body>  
    </html>
(5) tomcat2发布目录内容:

    <html>  
    <body>  
    <h1>TOMCAT_2 JSP Test Page</h1>  
    <%=new java.util.Date()%>  
    </body>  
    </html>

然后访问http://ip:8080、8081查看测试内容。

注:由于我用的2台机器所以在2台的webapp内设置内容

(1) mkdir -p /usr/webapps/www

(2) 编辑vi /usr/local/src/tomcat7/conf/server.xml 在最后</Host>前一行加下内容:<Context  path="" docBase="/usr/webapps/www" reloadable="false"/>

(3)  tomcat1发布目录内容:test.jsp
    <html>  
    <body>  
    <h1>TOMCAT_1 JSP Test Page</h1>  
    <%=new java.util.Date()%>  
    </body>  
    </html>
(4) tomcat2发布目录内容:test.jsp

    <html>  
    <body>  
    <h1>TOMCAT_2 JSP Test Page</h1>  
    <%=new java.util.Date()%>  
    </body>  
    </html>

启动命令:

/usr/local/src/tomcat7/bin/startup.sh & tail -f /usr/local/src/tomcat7/logs/catalina.out

 

测试:

http://192.168.1.111:8081/test.jsp

http://192.168.1.112:8081/test.jsp


Nginx+tomcat整合:负载均衡和动静分离
整合主要是修改nginx.conf配置,给一个完整的nginx.conf线上配置,部分参数可以自己根据实际需求修改:

# vi /usr/local/nginx/conf/nginx.conf
user www www;  
    worker_processes 8;  
    pid /usr/local/nginx/nginx.pid;  
    worker_rlimit_nofile 102400;  
    events  
    {  
    use epoll;  
    worker_connections 102400;  
    }  
    http  
    {  
      include       mime.types;  
      default_type  application/octet-stream;  
      fastcgi_intercept_errors on;  
      charset  utf-8;  
      server_names_hash_bucket_size 128;  
      client_header_buffer_size 4k;  
      large_client_header_buffers 4 32k;  
      client_max_body_size 300m;  
      sendfile on;  
      tcp_nopush     on;  

      keepalive_timeout 60;  

      tcp_nodelay on;  
      client_body_buffer_size  512k;  

      proxy_connect_timeout    5;  
      proxy_read_timeout       60;  
      proxy_send_timeout       5;  
      proxy_buffer_size        16k;  
      proxy_buffers            4 64k;  
      proxy_busy_buffers_size 128k;  
      proxy_temp_file_write_size 128k;  

      gzip on;  
      gzip_min_length  1k;  
      gzip_buffers     4 16k;  
      gzip_http_version 1.1;  
      gzip_comp_level 2;  
      gzip_types       text/plain application/x-javascript text/css application/xml;  
      gzip_vary on;  

    ###2012-12-19 change nginx logs  
    log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' 
                  '$status $body_bytes_sent "$http_referer" ' 
                  '"$http_user_agent"  $request_time $remote_addr';  

    upstream web_app {  
     server 192.168.1.111:8081 weight=1 max_fails=2 fail_timeout=30s;  
     server 192.168.1.112:8081 weight=1 max_fails=2 fail_timeout=30s;  
    }  

    ####chinaapp.sinaapp.com  
    server {  
        listen 80;  
        server_name  chinaapp.sinaapp.com;  
        index index.jsp index.html index.htm;  
        #发布目录/data/www  
        root  /data/www;  

        location /  
        {  
        proxy_next_upstream http_502 http_504 error timeout invalid_header;  
        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_pass http://web_app;  
        expires      3d;  
        }  

      }  

    }

测试: http://192.168.1.100:88/test.jsp


注* server段 proxy_pass定义的 web_app 需要跟 upstream  里面定义的web_app一致,否则server找不到均衡。
最佳实践:这里把apache地址换成TOMCAT地址就实现了,相关参数需要研究
#如上配置,nginx+tomcat反向代理负载均衡配置完毕,如果要做动静分离,只需要在nginx添加如下配置就OK了

配置Nginx动静分离 

# vi /usr/local/nginx/conf/nginx.conf

location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$  
{  
    root /data/www;  
    #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力  
    expires      3d;  
}

 


最佳实践:

(1)这个/data/www是在nginx文件下建的,不是tomcat下面
(2)需要在/data/www下面建立相同的应用文件夹,比如/data/www/edu-demo/..

mkdir -p /data/www/edu-demo

(3)动静分离时出现的异常: dwz Error loading XML document: dwz.frag.xml
剖析:dwz.frag.xml是一个核心文件,需要加载才可以正常使用
这个文件不能进行分离,可以单独列在容器下面

(4)大坑:http://192.168.1.100:88/edu-demo 不行,这里必须这样写http://192.168.1.100:88/edu-demo/index.jsp


在web.xml中加入
    <mime-mapping> 
      <extension>xml</extension> 
      <mime-type>text/xml</mime-type> 
    </mime-mapping>

相关推荐