实验环境:
redhat6.5版本虚拟机3台:
server1 :172.25.44.10,内存1024M,CPU双核
server2:172.25.44.20,内存512M,CPU单核
server3:172.25.44.30,内存512M,CPU单核
这三台虚拟机iptables为关闭状态,selinux为disabled状态。
apache和nginx的区别:
nginx相对于apache的优点:轻量级,同样是web服务,nginx比apache占用更少的内存和资源。nginx处理请求是异步非阻塞的,而apache同步阻塞型的,nginx能保持低资源低消耗高性能,nginx的负载能力比apache高很多。
apache相对于nginx的优点:rewrite功能比nginx的rewrite功能强大,模块多,一般来说,需要性能的web服务用nginx,如果不需要性能只求稳定,用apache。
异步非阻塞型和同步阻塞型的工作模式区别:
同步与异步的区别:同步就是发出一个指令,服务器进行处理,等待服务器将返回值传递给你才结束,就好比你打电话预约一个酒店房间,服务员给你查找房间,在这个查找过程中你需要等待,直到服务员给你答复(返回结果)。
异步就是发出一个指令,服务器进行处理,待服务器将返回值传递回来,不需要等待,就好比你打电话预约一个酒店房间,服务员直接告诉你我查一下啊,查好了告诉你,然后直接挂电话(不返回结果),等他查好了,然后主动打电话给你。
阻塞与非阻塞的区别:就用上面的例子来说,如果是阻塞式调用,你就会一直什么都不干,一直拿着电话,直到得知有没有房间。如果是非阻塞式调用,你不管服务员有没有告诉你,自己一边玩去,不过你也要过几分钟检查以下服务员有没有给你返回结果。
实验过程:
在 server1 虚拟机上执行以下操作:
从网站下载nginx1.8.1版本的tar包
tar zxf nginx-1.8.1.tar.gz #解压安装包
cd nginx-1.8.1
useradd -u 800 -M -d /usr/local/nginx -s /sbin/nologin nginx #新建nginx用户,指定其uid800
编译nginx需要关闭debug模式,配置文件为该目录的auto/cc的gcc文件,还需要改变nginx的版本信息,配置文件为该目录的src/core的nginx.h文件。
编译nginx,需要C编译
yum install gcc -y
在编译的过程中缺啥装啥
yum install pcre-devel.x86_64 -y
yum install openssl-devel.x86_64 -y
make && make install
编辑vim .bash_profile 将/usr/local/nginx/sbin加入变量
vim /usr/local/nginx/conf/nginx.conf
server1这台虚拟的的cpu为双核,所以 worker_processes 2;
cpu捆绑,worker_cpu_affinity 01 10; ##01为第一个CPU,10为第二个CPU。
event工作模式选择epoll(异步非阻塞)模式。
在server2和server3虚拟机上都执行以下操作:19
yum install httpd -y
/etc/init.d/httpd start
server2上创建测试网页文件 echo server2 > /var/www/html/index.html
server3上创建测试网页文件 echo server3 > /var/www/html/iindex.html
在server1虚拟机上:
vim /usr/local/nginx/conf/nginx.conf
第19行 upstream westos {
第20行 server 172.25.44.20:80;
第21行 server 172.25.44.30:80;
第22行 }
第49,50行注释
第51行 proxy_pass http://westos;
nginx -t #检查有没有错误
nginx -s reload #刷新nginx
浏览器访问 172.25.44.10 ,刷新网页,server2和server3轮询显示
vim /usr/local/nginx/conf/nginx.conf
第19行 upstream westos {
第20行 ip_hash; #捆绑IP, 使得刷新网页时不轮询。
第21行 server 172.25.44.20:80;
第22行 server 172.25.44.30:80;
第23行 }
nginx -t
nginx -s reload
打开浏览器进行测试,如果一台客户端挂掉,会显示另一台客户端的内容,挂掉的客户端重新好了,不会自动调转显示刚坏的客户端的信息。
sticky:使用nginx sticky实现基于cookie的负载均衡
重新编译nginx,加入sticky模块。
nginx -s stop #先将nginx停掉
将nginx-sticky-module-1.0.tar.gz压缩包下载到/mnt目录下
tar zxf nginx-sticky-module-1.0.tar.gz -C nginx-1.8.1
cd /mnt/nginx-1.8.1
make clean
./configure --prefix=/usr/local/nginx --with-http_ssl_module --user=nginx --group=nginx --add-module=nginx-sticky-module-1.0/
make && make install
vim /usr/local/nginx/conf/nginx.conf
第20行 sticky;
nginx -t
nginx
注:sticky no_fallback; 当一台客户端挂掉时,刷新网页不会显示另一台客户端的信息,而直接显示网页报错信息。
server 172.25.44.20:80 weight=3;
server 172.25.44.30:80; ##weight的作用是一种权重关系,刷新网页显示server2三次才显示server3一次。backup为主备关系,如果一台客户机挂了,另一台客户机顶上工作,down为客户端服务是好的,但服务端down,使得无法轮询。
tomcat:Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,是开发和调试JSP 程序的服务器。
在server2和server3虚拟机上执行:
tomcat安装:
sh jdk-6u26-linux-x64.bin
mv jdk1.6.0_26/ /usr/local
vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
ln -s /usr/local/jdk1.6.0_26/ java
tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local
ln -s /usr/local/apache-tomcat-7.0.37 tomcat
vim /usr/local/tomcat/webapps/ROOT/test.jsp
server2 The time is: <%=new java.util.Date() %> #在server3上写server3,方便我们实验测试
cd /usr/local/tomcat
bin/start.sh
在server1虚拟机上执行以下操作:
vim /usr/local/nginx/conf/nginx.conf
第19行 upstream westos {
第20行 sticky;
第21行 server 172.25.44.20:8080;
第22行 server 172.25.44.20:8080;
第23行 }
第50行 root html;
第51行 index index.html index.htm;
第65行 location ~ \.jsp { ##将jcp页面交给tomcat处理,动静分离
第66行 proxy_pass http://westos;
第67行 }
nginx -t
nginx -s reload
浏览器检测
memcache: memcache是一个高性能的分布式缓存系统。它可以用来保存一些经常存取的数据。直接通过telnet在memcached服务器上可进行存取数据操作。
tomcat采用交叉存储的方式将数据存储在memcached上,这种交叉存储的优点是当T1和M1同时崩掉时,也不会丢失session会话,避免单点故障。
在server2和server3虚拟机上执行:
yum install memcached -y
/etc/init.d/memcached start
/usr/local/tomcat/bin/shutdown.sh
把以下这些软件放在/usr/local/tomcat/lib目录下
kryo-1.03.jar
kryo-serializers-0.8.jar
memcached-2.5.jar
memcached-session-manager-1.5.1.jar
memcached-session-manager-tc7-1.5.1.jar
minlog-1.2.jar
msm-kryo-serializer-1.5.1.jar
reflectasm-0.9.jar
vim /usr/local/tomcat/conf/context.xml
<Context>
......
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.44.20:11211,n2:172.25.44.30:11211"
failoverNodes="n1"
#在 node2 上此项设置为“n2”
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
以下为测试页面,保存到/usr/local/tomcat/webapps/ROOT/test.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
/usr/local/tomcat/bin/start.sh #开启服务
访问http://172.25.44.10/test.jsp ,不同的主机访问时会调度到不同的 tomcat 实例上处理
来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down 掉当前正在响应的 tomcat 实
例,nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉。
redhat6.5搭建nginx+tomcat负载均衡,memcached高速缓存
原文地址:http://11731816.blog.51cto.com/11721816/1819837