測試環(huán)境均為本地,測試軟件為: nginx-1.6.0,,apache-tomcat-7.0.42-1,,apache-tomcat-7.0.42-2,apache-tomcat-7.0.42-3 利用nginx做負(fù)載均衡,,三臺tomcat做WEB具體業(yè)務(wù)處理,。 nginx配置nginx.conf: #Nginx所用用戶和組,window下不指定 #user niumd niumd; #user nobody; #工作的子進(jìn)程數(shù)量(通常等于CPU數(shù)量或者2倍于CPU) worker_processes 2; #錯(cuò)誤日志存放路徑 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #指定pid存放文件 #pid logs/nginx.pid; events { #使用網(wǎng)絡(luò)IO模型linux建議epoll,,F(xiàn)reeBSD建議采用kqueue,,window下不指定。 #use epoll; #允許最大連接數(shù) worker_connections 1024; } 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; access_log logs/access.log; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; client_header_buffer_size 1k; large_client_header_buffers 4 4k; sendfile on; tcp_nopush on; tcp_nodelay on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; include gzip.conf; upstream localhost { #根據(jù)ip計(jì)算將請求分配各那個(gè)后端tomcat,,許多人誤認(rèn)為可以解決session問題,,其實(shí)并不能。 #同一機(jī)器在多網(wǎng)情況下,,路由切換,,ip可能不同 server localhost:18081; server localhost:18082; server localhost:18083; #根據(jù)IP做分配策略 ip_hash; } #down 表示單前的server暫時(shí)不參與負(fù)載 #weight 默認(rèn)為1.weight越大,負(fù)載的權(quán)重就越大,。 #max_fails :允許請求失敗的次數(shù)默認(rèn)為1.當(dāng)超過最大次數(shù)時(shí),,返回proxy_next_upstream 模塊定義的錯(cuò)誤 #fail_timeout:max_fails 次失敗后,暫停的時(shí)間,。 #backup: 其它所有的非backup機(jī)器down或者忙的時(shí)候,,請求backup機(jī)器,。所以這臺機(jī)器壓力會最輕。 #nginx 的 upstream目前支持 4 種方式的分配 #1),、輪詢(默認(rèn)) 每個(gè)請求按時(shí)間順序逐一分配到不同的后端服務(wù)器,,如果后端服務(wù)器down掉,能自動剔除,。 #2),、weight 指定輪詢幾率,weight和訪問比率成正比,,用于后端服務(wù)器性能不均的情況,。 #2)、ip_hash 每個(gè)請求按訪問ip的hash結(jié)果分配,,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,,可以解決session的問題。 #3),、fair(第三方)按后端服務(wù)器的響應(yīng)時(shí)間來分配請求,,響應(yīng)時(shí)間短的優(yōu)先分配。 #4),、url_hash(第三方) server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://localhost; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; #允許客戶端請求的最大單文件字節(jié)數(shù) client_body_buffer_size 128k; #緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù),, proxy_connect_timeout 90; #nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí)) proxy_send_timeout 90; #后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí)) proxy_read_timeout 90; #連接成功后,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí)) proxy_buffer_size 4k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小 proxy_buffers 4 32k; #proxy_buffers緩沖區(qū),,網(wǎng)頁平均在32k以下的話,這樣設(shè)置 proxy_busy_buffers_size 64k; #高負(fù)荷下緩沖大?。╬roxy_buffers*2) proxy_temp_file_write_size 64k; #設(shè)定緩存文件夾大小,,大于這個(gè)值,將從upstream服務(wù)器傳 } #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 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }Tomcat1配置server.xml: <?xml version='1.0' encoding='utf-8'?> <Server port="18001" shutdown="SHUTDOWN"> <Connector port="18081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18441" /> <Connector port="18021" protocol="AJP/1.3" redirectPort="18441" /> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> </Service> </Server>Tomcat1配置server.xml: <?xml version='1.0' encoding='utf-8'?> <Server port="18002" shutdown="SHUTDOWN"> <Connector port="18082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18442" /> <Connector port="18022" protocol="AJP/1.3" redirectPort="18442" /> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> </Service> </Server>Tomcat3配置server.xml: <?xml version='1.0' encoding='utf-8'?> <Server port="18003" shutdown="SHUTDOWN"> <Connector port="18083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18443" /> <Connector port="18023" protocol="AJP/1.3" redirectPort="18443" /> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> </Service> </Server> 分別啟動三臺tomcat,,訪問到地址依次是:http://localhost:18081,;http://localhost:18082;http://localhost:18083 然后啟動nginx,,訪問地址是:http://localhost (cmd下面運(yùn)行nginx.exe,,關(guān)閉cmd下面運(yùn)行nginx -s stop) 這樣子根據(jù)客戶端IP做負(fù)載均衡的同步策略已基本可滿足需求,但是考慮到客戶端多網(wǎng)卡或者客戶端訪問不同的服務(wù)器時(shí)產(chǎn)生session不同步的問題,,需要使用memcached做session同步策略,,后續(xù)我會跟上配置文檔。
附:以下是來自于互聯(lián)網(wǎng)的三中方法: 下面是從網(wǎng)絡(luò)上整理的關(guān)于nginx與apache的對比: 1,、nginx與apache優(yōu)缺點(diǎn)對比 nginx相對于apache的優(yōu)點(diǎn):(1)輕量級,同樣起web 服務(wù),,比apache占用更少的內(nèi)存及資源 (2)抗并發(fā),,nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能 (3)高度模塊化的設(shè)計(jì),,編寫模塊相對簡單 (4)社區(qū)活躍,,各種高性能模塊出品迅速啊 apache 相對于nginx 的優(yōu)點(diǎn): (1)rewrite:比nginx 的rewrite 強(qiáng)大 (2)動態(tài)頁面:模塊超多,基本想到的都可以找到 (3)少bug ,,nginx 的bug 相對較多 (4)超穩(wěn)定 存在就是理由,,一般來說,需要性能的web 服務(wù),,用nginx ,。如果不需要性能只求穩(wěn)定,那就apache 吧,。 后者的各種功能模塊實(shí)現(xiàn)得比前者,,例如ssl 的模塊就比前者好,可配置項(xiàng)多,。這里要注意一點(diǎn),,epoll(freebsd 上是 kqueue )網(wǎng)絡(luò) IO 模型是nginx 處理性能高的根本理由,但并不是所有的情況下都是epoll 大獲全勝的,,如果本身提供靜態(tài)服務(wù)的就只有寥寥幾個(gè)文 件,,apache 的select 模型或許比epoll 更高性能。當(dāng)然,,這只是根據(jù)網(wǎng)絡(luò)IO 模型的原理作的一個(gè)假設(shè),,真正的應(yīng)用還是需要實(shí)測了再說 的。 2,、作為 Web 服務(wù)器:相比 Apache,,Nginx 使用更少的資源,支持更多的并發(fā)連接,,體現(xiàn)更高的效率,,這點(diǎn) 使 Nginx 尤其受到虛擬主機(jī)提供商的歡迎。在高連接并發(fā)的情況下,,Nginx是Apache服務(wù)器不錯(cuò)的替代品: Nginx在美國是做虛擬主機(jī)生 意的老板們經(jīng)常選擇的軟件平臺之一. 能夠支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù)的響應(yīng), 感謝Nginx為我們選擇了 epoll and kqueue 作為開發(fā)模型. Nginx 作為負(fù)載均衡服務(wù)器: Nginx 既可以在內(nèi)部直接支持 Rails 和 PHP 程序?qū)ν膺M(jìn)行服務(wù), 也可以支持作為 HTTP代理 服務(wù)器對外進(jìn)行服務(wù). Nginx采用C進(jìn)行編寫, 不論是系統(tǒng)資源開銷還是CPU使用效率都比 Perlbal 要好很多. 作為郵件代理服務(wù)器: Nginx 同時(shí)也是一個(gè)非常優(yōu)秀的郵件代理服務(wù)器(最早開發(fā)這個(gè)產(chǎn)品的目的之一也是作為郵件代理服務(wù)器), Last.fm 描述了成功并且美妙的使用經(jīng)驗(yàn). Nginx 是 一個(gè)安裝非常的簡單 , 配置文件非常簡潔(還能夠支持perl語法), Bugs 非常少的服務(wù)器: Nginx 啟動特別容易, 并且?guī)缀蹩梢宰龅?7*24不間斷運(yùn)行,即使運(yùn)行數(shù)個(gè)月也不需要重新啟動. 你還能夠不間斷服務(wù)的情況下進(jìn)行軟件版本的升級 . 3,、Nginx 配置簡潔, Apache 復(fù)雜 Nginx 靜態(tài)處理性能比 Apache 高 3倍以上 Apache 對 PHP 支持比較簡單,,Nginx 需要配合其他后端用 Apache 的組件比 Nginx 多 現(xiàn)在 Nginx 才是 Web 服務(wù)器的首選 4、最核心的區(qū)別在于apache是同步多進(jìn)程模型,,一個(gè)連接對應(yīng)一個(gè)進(jìn)程,;nginx是異步的,多個(gè)連接(萬級別)可以對應(yīng)一個(gè)進(jìn)程 5,、nginx處理靜態(tài)文件好,耗費(fèi)內(nèi)存少.但無疑apache仍然是目前的主流,有很多豐富的特性.所以還需要搭配著來.當(dāng)然如果能確定nginx就適合需求,那么使用nginx會是更經(jīng)濟(jì)的方式. apache有先天不支持多核心處理負(fù)載雞肋的缺點(diǎn),,建議使用nginx做前端,後端用apache,。大型網(wǎng)站建議用nginx自代的集群功能 6,、 從個(gè)人過往的使用情況來看,,nginx的負(fù)載能力比apache高很多。最新的服務(wù)器也改用nginx了,。而且nginx改完配置能-t測試一下配置有沒有問題,,apache重啟的時(shí)候發(fā)現(xiàn)配置出錯(cuò)了,會很崩潰,,改的時(shí)候都會非常小心翼翼現(xiàn)在看有好多集群站,,前端nginx抗并發(fā),后端apache集群,, 配合的也不錯(cuò),。 7、nginx處理動態(tài)請求是雞肋,,一般動態(tài)請求要apache去做,,nginx只適合靜態(tài)和反向。 8,、從我個(gè)人的經(jīng)驗(yàn)來看,,nginx是很不錯(cuò)的前端服務(wù)器,負(fù)載性能很好,,在老奔上開nginx,,用webbench模擬10000個(gè)靜態(tài)文件請求毫不吃力。apache對php等語言的支持很好,,此外apache有強(qiáng)大的支持網(wǎng)路,,發(fā)展時(shí)間相對nginx更久. 9、 Nginx優(yōu)于apache的主要兩點(diǎn): (1).Nginx本身就是一個(gè)反向代理服務(wù)器 (2).Nginx支持7層負(fù)載均衡,;其他的當(dāng)然,,Nginx可能會比 apache支持更高的并發(fā),但是根據(jù)NetCraft的統(tǒng)計(jì),2011年4月的統(tǒng)計(jì)數(shù)據(jù),,Apache依然占有62.71%,,而Nginx是 7.35%,因此總得來說,,Aapche依然是大部分公司的首先,,因?yàn)槠涑墒斓募夹g(shù)和開發(fā)社區(qū)已經(jīng)也是非常不錯(cuò)的性能。 10,、你對web server的需求決定你的選擇,。大 部分情況下nginx都優(yōu)于APACHE,比如說靜態(tài)文件處理,、PHP-CGI的支持,、反向代理功能、前端Cache、維持連接等等,。在 Apache+PHP(prefork)模式下,,如果PHP處理慢或者前端壓力很大的情況下,很容易出現(xiàn)Apache進(jìn)程數(shù)飆升,,從而拒絕服務(wù)的現(xiàn)象,。 11、可以看一下nginx lua模塊:https://github.com/chaoslaw...apache比nginx多的模塊,,可直接用lua實(shí)現(xiàn)apache是最流行的,,why?大多數(shù)人懶得更新到nginx或者學(xué)新事物 12,、對于nginx,,我喜歡它配置文件寫的很簡潔,正則配置讓很多事情變得簡單運(yùn)行效率高,,占用資源少,,代理功能強(qiáng)大,很適合做前端響應(yīng)服務(wù)器 13,、Apache在處理動態(tài)有優(yōu)勢,,Nginx并發(fā)性比較好,CPU內(nèi)存占用低,,如果rewrite頻繁,,那還是Apache吧 |
|