dongliwei 2017-08-01
参考文件:
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>