實驗環境:
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 也沒有丟掉。