Nginx+Tomcat服务器负载均衡实践方案
1.????為何選擇Nginx+Tomcat做負(fù)載均衡?
1.1.?Nginx是什么?
??????Nginx(發(fā)音同?engine x)是一款輕量級(jí)的Web?服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-like?協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計(jì)師Igor Sysoev所開(kāi)發(fā),供俄國(guó)大型的入口網(wǎng)站及搜索引擎Rambler(俄文:Рамблер)使用。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力確實(shí)在同類(lèi)型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好,中國(guó)大陸使用nginx網(wǎng)站用戶有:新浪、網(wǎng)易、?騰訊等。
1.2.?Nginx特點(diǎn)
?????Nginx是一款面向性能設(shè)計(jì)的HTTP服務(wù)器,相較于Apache、lighttpd具有占有內(nèi)存少,穩(wěn)定性高等優(yōu)勢(shì)。與舊版本(<=2.2)的Apache不 同,nginx不采用每客戶機(jī)一線程的設(shè)計(jì)模型,而是充分使用異步邏輯,削減了上下文調(diào)度開(kāi)銷(xiāo),所以并發(fā)服務(wù)能力更強(qiáng)。整體采用模塊化設(shè)計(jì),有豐富的模塊 庫(kù)和第三方模塊庫(kù),配置靈活。??在Linux操作系統(tǒng)下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系統(tǒng)下效率相當(dāng)高。同時(shí)Nginx在OpenBSD或FreeBSD操作系統(tǒng)上采用類(lèi)似于epoll的高效事件模型kqueue。
1.3.?Nginx可大量平行處理
????Nginx在官方測(cè)試的結(jié)果中,能夠支持五萬(wàn)個(gè)平行連接,而在實(shí)際的運(yùn)作中,是可以支持二萬(wàn)至四萬(wàn)個(gè)平行鏈接。
1.4.?nginx?的模塊
????整體采用模塊化設(shè)計(jì)是nginx的一個(gè)重大特點(diǎn),甚至http服務(wù)器核心功能也是一個(gè)模塊。要注意的是:nginx的模塊是靜態(tài)的,添加和刪除模塊都要對(duì)nginx進(jìn)行重新編譯,這一點(diǎn)與Apache的動(dòng)態(tài)模塊完全不同。
1.5.?Nginx與PHP的集成
?????自PHP-5.3.3起,PHP-FPM加入到了PHP核心,編譯時(shí)加上--enable-fpm即可提供支持。??PHP-FPM以守護(hù)進(jìn)程在后臺(tái)運(yùn)行,Nginx響應(yīng)請(qǐng)求后,自行處理靜態(tài)請(qǐng)求,PHP請(qǐng)求則經(jīng)過(guò)fastcgi_pass交由PHP-FPM處理,處理 完畢后返回。?Nginx和PHP-FPM的組合,是一種穩(wěn)定、高效的PHP運(yùn)行方式,效率要比傳統(tǒng)的Apache和mod_php高出不少。
????PHP-FPM不支持Windows平臺(tái),由于沒(méi)有fastcgi進(jìn)程管理器管理php-cgi.exe,因此一旦php-cgi.exe崩潰退 出,前端將失去響應(yīng),這時(shí)Nginx會(huì)返回“The page you are looking for is temporarily??unavailable. Please try again later.”的錯(cuò)誤信息。??因此在Windows上用Nginx和php-cgi.exe組合來(lái)運(yùn)行PHP的方式并不可靠,穩(wěn)定性有待提高。
1.6.?Tomcat與Nginx性能對(duì)比
?????Tomcat?服務(wù)器作為一個(gè)?Web?服務(wù)器,其并發(fā)數(shù)在?300-500?之間,如果有超過(guò)?500的并發(fā)數(shù)便會(huì)出現(xiàn)?Tomcat?不能響應(yīng)新的請(qǐng)求的情況,嚴(yán)重影響網(wǎng)站的運(yùn)行。另外,在訪問(wèn)量大的情況下,Tomcat?的線程數(shù)會(huì)不斷增加。由于Tomcat?自身對(duì)內(nèi)存的占用有控制,當(dāng)對(duì)內(nèi)存的占用達(dá)到最大值時(shí)便會(huì)出現(xiàn)內(nèi)存溢出,對(duì)網(wǎng)站的訪問(wèn)嚴(yán)重超時(shí)等現(xiàn)象,這時(shí)便需要重新啟動(dòng)?Tomcat?以釋放占用的內(nèi)存,這樣做便會(huì)阻斷網(wǎng)站運(yùn)行。所以對(duì)?Tomcat?做負(fù)載均衡便很有必要。目前可以和?Tomcat?做負(fù)載均衡的主流服務(wù)器是?Apache?,但是?Nginx?由于功能多、配置簡(jiǎn)單等優(yōu)點(diǎn)逐漸成為很多負(fù)載均衡服務(wù)器的首選。?Nginx?的并發(fā)數(shù)可達(dá)到50000?,所以理論上可以和Tomcat?以?1:100?的比例來(lái)配置,這樣便可以很好的解決網(wǎng)站并發(fā)瓶頸問(wèn)題。
?
2.????Nginx+Tomcat負(fù)載均衡方案實(shí)施
2.1.?環(huán)境及軟件安裝工具準(zhǔn)備
2.1.1.下載JDK7
?????在官網(wǎng)(http://www.oracle.com/us/sun/index.htm)上下載JDK即可,下載地址:
http://java.com/zh_CN/download/index.jsp
2.1.2.下載Nginx
?????根據(jù)自己的需要下載合適的系統(tǒng)版本,目前官方對(duì)Windows系列平臺(tái)只提供Windows 32bit的下載,下載地址:http://nginx.org/en/download.html
2.1.3.下載Tomcat7
??????Tomcat需要JDK運(yùn)行環(huán)境支持,由于我們下載的是JDK7所以選擇對(duì)應(yīng)的Tomcat也是7。建議下載最新的Tomcat7版本,下載地址:http://tomcat.apache.org/download-70.cgi
注:下載Binary版本,沒(méi)有必要下載Resource版本。
2.2.?安裝JDK并設(shè)置Tomcat和Nginx
2.2.1.安裝JDK
????下載完成后,系統(tǒng)會(huì)自動(dòng)彈出安裝文件提示用戶安裝。直接點(diǎn)擊“同意協(xié)議”,然后直接默認(rèn)安裝JDK路徑,點(diǎn)“下一步”知道完成為止(對(duì)于JDK安裝這個(gè)沒(méi)多大的技術(shù)難度,JDK怎么安裝已經(jīng)在多處文檔中寫(xiě)過(guò)了,故不再詳述),記得驗(yàn)證安裝是否成功。??參見(jiàn)文檔:《WEB應(yīng)用打包部署》。
2.2.2.解壓Tomcat
???將下載的Tomcat服務(wù)器包解壓到任意路徑下,如:D:\BALANCE_TOMCAT__NGINX由于我已經(jīng)下載Tomcat7,就用我本機(jī)的apache-tomcat-7.0.47作為示例。解壓兩個(gè)Tomcat分別命名為apache-tomcat-7.0.47-1何apache-tomcat-7.0.47-2.解壓后如圖所示:
2.2.3.啟動(dòng)Nginx
?????之所以不以安裝為名是因?yàn)镹ginx本身是控制臺(tái)程序而并未做出Windows服務(wù);將下載的Nginx1.6.0解壓至與Tomcat相同的D:\BALANCE_TOMCAT__NGINX路徑下。切換文件夾路徑找到D:\BALANCE_TOMCAT__NGINX\nginx-1.6.0:
在控制臺(tái)“cmd”,執(zhí)行“start nginx”命令啟動(dòng)上圖中的exe程序。
啟動(dòng)后會(huì)看到控制臺(tái)閃一下;這時(shí)查看系統(tǒng)進(jìn)程中有兩個(gè)nginx.exe的進(jìn)程,說(shuō)明啟動(dòng)完成。
2.2.4.負(fù)載均衡設(shè)置
2.2.4.1.???????修改Tomcat設(shè)置
這里需要修改兩個(gè)Tomcat的server.xml文件:
?
apache-tomcat-7.0.47-1配置:
?
1、<Server port="18080" shutdown="SHUTDOWN">
?
2、?<Connector port="18080" protocol="HTTP/1.1"
???????????????connectionTimeout="20000"
???????????????redirectPort="18443" />
?
3、?<Connector port="18009" protocol="AJP/1.3" redirectPort="18443" />
?
4、??<Engine name="Catalina" defaultHost="localhost"?jvmRoute="tomcat1">
5、?另外<Host>中添加<Content>設(shè)置:
??<Context path="/nginx" reloadable="false" docBase="D:/DEVELOPER_WORKSPACE_AJX/workspace/nginx/WebRoot"> </Context>
注:docBase是項(xiàng)目物理路徑。
?
apache-tomcat-7.0.47-2配置:
?
2、<Server port="28080" shutdown="SHUTDOWN">
?
2、?<Connector port="28080" protocol="HTTP/1.1"
???????????????connectionTimeout="20000"
???????????????redirectPort="28443" />
?
6、?<Connector port="28009" protocol="AJP/1.3" redirectPort="28443" />
?
7、??<Engine name="Catalina" defaultHost="localhost"?jvmRoute="tomcat2">
8、?另外<Host>中添加<Content>設(shè)置:
??<Context path="/nginx" reloadable="false" docBase="D:/DEVELOPER_WORKSPACE_AJX/workspace/nginx/WebRoot"> </Context>
注:docBase是項(xiàng)目物理路徑。
?
2.2.4.2.???????修改Nginx設(shè)置
?????打開(kāi)Nginx1.6.0/conf/nginx.conf進(jìn)行修改,nginx.conf內(nèi)容如下:
?
#user nobody; #此參數(shù)修改為與CPU個(gè)數(shù)一致 worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;pid logs/nginx.pid;#后添的 worker_rlimit_nofile 51200;events {worker_connections 51200; }http {include mime.types;default_type application/octet-stream;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;server_names_hash_bucket_size 128;client_header_buffer_size 32k; large_client_header_buffers 4 32k;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 60;tcp_nodelay on;#gzip on;upstream abc.tomcats.com {#ip_hash;server 192.168.1.147:18080 weight=1;server 192.168.1.147:28080 weight=2;}server {listen 80;server_name abc.tomcats.com;proxy_redirect off;access_log logs/abc.tomcats.com.log combined;#charset koi8-r;#access_log logs/host.access.log main;#充許客戶端請(qǐng)求的最大單個(gè)文件字節(jié)數(shù) client_max_body_size 10m;client_body_buffer_size 128k;#跟后端服務(wù)器連接的超時(shí)時(shí)間 proxy_connect_timeout 600;#連接成功后等候后端服務(wù)器響應(yīng)時(shí)間 proxy_read_timeout 600;#后端服務(wù)器數(shù)據(jù)回傳時(shí)間 proxy_send_timeout 600;#代理請(qǐng)求緩存區(qū) proxy_buffer_size 8k;#同上,保存用幾個(gè)buffer每個(gè)最大空間是多少 proxy_buffers 4 32k;#如果系統(tǒng)很忙時(shí)可以申請(qǐng)更大的proxy_buffers,官方推薦*2 proxy_busy_buffers_size 64k;#緩存臨時(shí)文件的大小 proxy_temp_file_write_size 64k;location / {root html;index index.html index.htm;proxy_pass http://abc.tomcats.com;proxy_set_header Host $host;proxy_set_header X-Real-Ip $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location /status{stub_status on;access_log off;auth_basic "NginxStatus";auth_basic_user_file htpasswd;}location ~ \.jsp$ {proxy_pass http://abc.tomcats.com;} location ~ \.(html|js|css|png|gif)$ {root html;proxy_pass http://abc.tomcats.com;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443;# server_name localhost;# ssl on;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_timeout 5m;# ssl_protocols SSLv2 SSLv3 TLSv1;# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}然后使用“Nginx -s reload”命令重新加載Nginx的設(shè)置。
2.2.5.項(xiàng)目部署及啟動(dòng)
2.2.5.1.???????部署web項(xiàng)目
????將J2EE項(xiàng)目打包成war包分別放置到apache-tomcat-7.0.47-1和apache-tomcat-7.0.47-2的webapps目錄下,然后分別啟動(dòng)Tomcat就行了。
注:webapps下放置的war版本要一致,這是兩個(gè)相同的程序服務(wù)器部署。
2.2.5.2.???????啟動(dòng)Tomcat和Nginx
????2個(gè)Tomcat隨便啟動(dòng)無(wú)先后順序,并且Nginx與Tomcat啟動(dòng)也無(wú)先后順序。如果修改了nginx.conf只需要執(zhí)行“Nginx -s reload”命令重新加載Nginx的設(shè)置。而如果修改了Tomcat的配置則需要重新啟動(dòng)Tomcat和Nginx。
?
2.3.?啟動(dòng)測(cè)試負(fù)載均衡實(shí)施效果
2.3.1.導(dǎo)航到服務(wù)器默認(rèn)界面
在瀏覽器輸入輸入localhost即可看到如下界面:
2.3.2.訪問(wèn)靜態(tài)html文件
注:不一定用localhost,你也可以通過(guò)ip地址訪問(wèn)。
2.3.3.訪問(wèn)JSP動(dòng)態(tài)頁(yè)面
2.4.?配置Memcached?實(shí)現(xiàn)session共享
2.4.1.下載Memcached
?????你可以從這里下載對(duì)應(yīng)系統(tǒng)版本的Memcached:http://pecl.php.net/package/memcache
Memcached與Nginx相似,安裝這里就不再說(shuō)了。
2.4.2.Windows Memcached常用命令
????以下是?memcached?在?Windows?系統(tǒng)下的?x86/x64?版本的安裝方法。命令提示符下運(yùn)行如下,
-----------------------------------------安裝--------------------:
memcached -d install
memcached -d start
net start "Memcached Server"
?
----------------------------------------卸載-------------------:
memcached -d stop
memcached -d remove
sc delete "Memcached Server"
?
-------------------------------memcached的基本設(shè)置:
-p?監(jiān)聽(tīng)的端口
-l?連接的IP地址,?默認(rèn)是本機(jī)
-d start?啟動(dòng)memcached服務(wù)
-d restart?重起memcached服務(wù)
-d stop|shutdown?關(guān)閉正在運(yùn)行的memcached服務(wù)
-d install?安裝memcached服務(wù)
-d uninstall?卸載memcached服務(wù)
-u?以的身份運(yùn)行?(僅在以root運(yùn)行的時(shí)候有效)
-m?最大內(nèi)存使用,單位MB。默認(rèn)64MB
-M?內(nèi)存耗盡時(shí)返回錯(cuò)誤,而不是刪除項(xiàng)
-c?最大同時(shí)連接數(shù),默認(rèn)是1024
-f?塊大小增長(zhǎng)因子,默認(rèn)是1.25
-n?最小分配空間,key+value+flags默認(rèn)是48
-h?顯示幫助
2.4.3.設(shè)置Tomcat的Memcached
下載如下jar包 (這些jar不能缺失,否則會(huì)出現(xiàn)問(wèn)題)全部拷貝進(jìn)TOMCAT/lib中全部的tomcat:然后修改?conf/context.xml添加如下代碼:????
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" sticky="false" memcachedNodes="n1:localhost:11211" failoverNodes="" lockingMode="all" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico)$" sessionBackupAsync="false"sessionBackupTimeout="100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />因?yàn)橹С謒emcached分布式??如果有多臺(tái)memcached在memcachedNodes="nx:IP:port"?即可。
注意:這里的端口號(hào)要和啟動(dòng)的設(shè)置的端口一致
???打開(kāi)cmd?進(jìn)入nginx?的解壓目錄 輸入?nginx -s -stop??輸入?nginx start??重新啟動(dòng)nginx依次啟動(dòng)三臺(tái)tomcat。在TOMCAT \webapps\ROOT?下新增一張頁(yè)面demo.jsp:
<%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.util.*" %> <html> <head><title>Cluster Test</title></head> <body> <% HttpSession sess = request.getSession(true); System.out.println(sess.getId()); out.println("<br> SESSION ID:" + sess.getId()+"<br>"); // 如果有新的請(qǐng)求,則添加session屬性 String name = request.getParameter("name"); if (name != null && name.length() > 0) { String value = request.getParameter("value"); sess.setAttribute(name, value); } out.print("<b>Session List:</b>"); Enumeration<String> names = sess.getAttributeNames(); while (names.hasMoreElements()) { String sname = names.nextElement(); String value = sess.getAttribute(sname).toString(); out.println( sname + " = " + value+"<br>"); System.out.println( sname + " = " + value); } %>jvm1 </body> </html>
JVM?分別是?1 2 3?分別放進(jìn)?t1 t2 t3?中 然后打開(kāi)瀏覽器http://localhost/demo.jsp?多次刷新看到不同的jvm?相同的session?表示成功nginx + tomcat + memcached?環(huán)境就搭建好了。
?
?
總結(jié)
以上是生活随笔為你收集整理的Nginx+Tomcat服务器负载均衡实践方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IEEE论文格式要求
- 下一篇: Nginx系列(十六):HTTP Var