nginx+tomcat+memcached負載均衡php
負載均衡:css
負載均衡是由多臺服務器以對稱的方式組成一個服務器集合,每臺服務器都具備等價的地位,均可以單獨對外提供服務 而無須其餘服務器的輔助。經過某種負載分擔技術,將外部發送來的請求均勻分配到對稱結構中的某一臺服務器上,而接收到請求的服務器獨立地迴應客戶的請求。 均衡負載可以平均分配客戶請求到服務器列陣,籍此提供快速獲取重要數據,解決大量併發訪問服務問題。html
Tomcat 很受廣大程序員的喜歡,由於它運行時佔用的系統資源小,擴展性好,支持負載平衡與郵件服務等開發應用系統經常使用的功能;java
Tomcat 是一個小型的輕量級應用服務器,在中小型系統和併發訪問用戶不是不少的場合下被廣泛使用,是開發和調試JSP 程序的首選。對於一個初學者來講,能夠這樣認爲,當在一臺機器上配置好Apache 服務器,可利用它響應對HTML 頁面的訪問請求。實際上Tomcat 部分是Apache 服務器的擴展,但它是獨立運行的,因此當你運行tomcat 時,它實際上做爲一個與Apache 獨立的進程單獨運行的。node
<T1> <T2> linux
. \ / . nginx
. X . 程序員
. / \ .web
<M1> <M2>數據庫
Tomcat-1 (T1) 將 session 存儲在 memcached-2 (T2)上。只有當 M2 不可用時,T1 纔將 session 存儲在 memcached-1 上(M1 是 T1 failoverNode)。使用這種配置的好處是,當 T1 和 M1 同時崩潰時也不會丟失 session 會話,避免單點故障。
Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。
實驗一:
如下步驟在 ip:20 與 ip:80 上實施:
tomcat 安裝
sh jdk-6u26-linux-x64.bin
mv jdk1.6.0_26/ /usr/local/jdk
vi /etc/profile
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
安裝tomcat
tar zxf apache-tomcat-7.0.8.tar.gz -C /usr/local
mv /usr/local/apache-tomcat-7.0.8 /usr/local/tomcat
兩臺機子都得要安裝java和tomcat。可是要做爲nginx服務器的那個必需要安裝nginx,而另外一臺不須要。假設nginx安裝在:ip:20上。ip:80沒有安裝。
在安裝了nginx 的機子上
IP:192.18.0.20
IP :192.168.0.80
此時若是隻有一臺機子承擔負重,那麼
(1)首先你須要添加用戶 useradd www
(2)你須要編輯文件: vi /usr/local/nginx/conf/nginx.conf
user www www;
worker_processes 4;
error_log logs/error.log;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfil on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location /status {
stub_status on;
access_log off;
}
location ~\.jsp$
{
proxy_pass http://192.168.0.20:8080; //全部的jsp頁面交給tomcat處理,動靜分離,這樣你訪問的時候就不用親自去輸入8080端口了,由於nginx是訪問的靜態的,tomcat訪問的是動態的。
}
}
}
(3)配置完成後,
nginx -t (查看語句是否正確)
nginx -s reload (啓動nginx)
啓動tomcat服務
/usr/local/tomcat/bin/startup.sh(開啓服務shutdown是關閉服務)
你能夠測試啦:
測試頁面是vi /usr/local/tomcat/webapps/ROOT/test.jsp
The time on desktop 20 is:<%= new java.util.Date() %>
http://192.168.0.20/test.jsp
不斷刷新會出現變化的時間,假若你把tomcat關閉了,那麼你 http://192.168.0.20則默認訪問的是nginx 的訪問頁面,要是你將nginx關閉了,httpd是開着的話,那麼你默認訪問的是/var/www/html下的訪問頁面。
實驗二:
(1)爲了實現負載均衡,你須要用兩臺服務器作實驗,
此時你在兩臺主機上配置了java和tomcat。
(2) 編輯文件: vi /usr/local/nginx/conf/nginx.conf
location ~\.jsp$
{
proxy_pass http://tomcat;
}//(此處應該在上面,在location的位置。不然報錯的)
upstream tomcat
{
server 192.168.0.20:8080;
server 192.168.0.80:8080;
}
此時,進行測試:注意兩個主機上的文件應該是一致的。都得有test.jsp
訪問網頁進行測試: http://192.168.0.20/test.jsp
此時你刷新,會有不斷的兩個服務器建進行切換,當一臺主機的tomcat關閉的時候,只會留在一臺機子上
實驗三:
當一個客戶端訪問多個同一個網址時,怎麼樣避免一個客戶訪問一個網站的時候只在一個服務器上進行,不進行切換,節省資源。也就是說就像淘寶一天訪問量數 億的,一個客戶可能要訪問好多頁面,如何我這一個客戶訪問的只是一臺服務器,再也不進行服務器間的切換,避免資源浪費。此時你須要設置以下:
首先你須要從新編譯源碼:nginx 由於以前編譯的時候你沒有加載sticky模塊。
注: nginx-sticky-module 爲 nginx 的第三方模塊,使 nginx 支持 sticky 模式,所謂sticky 模式就是指同一個用戶的訪問請求都被髮送到同一個 tomcat 實例上處理。
(1)
cd ~
下載nginx-sticky-module-1.0.tar.gz
tar zxf nginx-sticky-module-1.0.tar.gz
cd nginx-1.0.6
make clean從新編譯
./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_ssl_module -add-module=/root/nginx-sticky-module-1.0/
make && make install
(2)編輯文件: vi /usr/local/nginx/conf/nginx.conf
location ~\.jsp$
{
proxy_pass http://tomcat;
}//(此處應該在上面,在location的位置。不然報錯的)
upstream tomcat
{ sticky;
server 192.168.0.20:8080;
server 192.168.0.80:8080;
}
(3)
測試: nginx -t
nginx
訪問網頁進行測試: http://192.168.0.20/test.jsp
假設此時兩臺主機的tomcat都是開着的。那麼訪問無論你如何刷新都會自定位在一臺服務器上,假設定位到ip:20時,你關掉20上的tomcat,此時會自動切換到80上面去的。
實驗四:假設你在訪問一臺服務器時,忽然一臺服務器崩潰了,客戶可不會理解你。你丟了別人的數據後果很嚴重的,因此,假設你在一臺服務器上訪問的數據,忽然崩了另外一臺應該接管着
步驟一:在IP :20上作
cd /usr/local/tomcat/lib
mget *
yum install memcached
/etc/init.d/memcached start
在IP:80上也應改那麼作
cd /usr/local/tomcat/lib
mget *
yum install memcached
/etc/init.d/memcached start
netstat -antlp | grep :11211(memcache的端口)
(2) 在ip:20
vi /usr/local/tomcat/conf/context.xml
vi /usr/local/tomcat/conf/context.xml
<Context>
……
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.20:11211,n2:192.168.0.80:11211"
failoverNodes="n1"
#在 node2 上此項設置爲「n2」
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
在ip:80
vi /usr/local/tomcat/conf/context.xml
vi /usr/local/tomcat/conf/context.xml
<Context>
……
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.20:11211,n2:192.168.0.80:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
分別在兩臺機子上啓動tomcat
/usr/local/tomcat/bin/startup.sh
啓動 tomcat
(/usr/local/tomcat/bin/shutdown.sh 關閉 tomcat)
(3)在兩臺主機上均要編輯文件:
/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>
測試:訪問http://192.168.0.20(裝有nginx的主機,nginx也能夠安裝在另外一臺主機上)/test.jsp,不一樣的主機訪問時會調度到不一樣的 tomcat 實例上處理 來自同一主機的請求會交給同一個 tomcat 實例處理,此時你 down 掉當前正在響應的 tomcat 實 例,nginx 會自動把用戶的請求調度到另外一個 tomcat 實例上,同時 session 也沒有丟掉。
——leeypp@gmail.com