十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
使用Nginx+Keepalived+iis+Memcached搭建高可用的集群服務(wù)
大致架構(gòu)如上圖所示
1、設(shè)置Windows服務(wù)端
公司使用好多IIS作為web服務(wù),其中在session共享哪里浪費(fèi)了好長(zhǎng)時(shí)間。
剛開始打算使用Sqlserver數(shù)據(jù)庫(kù)共享,后來發(fā)現(xiàn)IIS自帶session共享。
如上圖所示 在會(huì)話狀態(tài)中 連接字符串使用另外一臺(tái)服務(wù)器IIS服務(wù)的session即可,當(dāng)然3臺(tái)4臺(tái)服務(wù)器也照樣可以設(shè)置,個(gè)人理解為只要能圍成一個(gè)圓它們就會(huì)互相共享,互相匯聚。設(shè)置方法,運(yùn)行regedit → 打開注冊(cè)表 → 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters節(jié)點(diǎn) → 將 AllowRemoteConnection 的鍵值設(shè)置成“1”(1 為允許遠(yuǎn)程電腦的連接,0 代表禁止)
親測(cè)有效
還有一個(gè)就是設(shè)置站點(diǎn)的時(shí)候,因?yàn)槲覀兪且粋€(gè)iis上面有多個(gè)站點(diǎn),平時(shí)使用就是下圖這樣的
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都做網(wǎng)站、洛龍網(wǎng)絡(luò)推廣、微信小程序定制開發(fā)、洛龍網(wǎng)絡(luò)營(yíng)銷、洛龍企業(yè)策劃、洛龍品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供洛龍建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
新建一個(gè)站點(diǎn),使用的是80端口,然后站點(diǎn)下面有好多的虛擬目錄或者是應(yīng)用程序(在此必須設(shè)置為應(yīng)用程序),因?yàn)槲覀兪窃诖疟P中新建一個(gè)目錄然后在目錄下面放了好多的站點(diǎn),因?yàn)槌绦驅(qū)懙臅r(shí)候必須要在一級(jí)目錄,所以只能轉(zhuǎn)化為程序才能正常訪問。
回到正題題,因?yàn)楝F(xiàn)在用nginx做負(fù)載均衡,所以就涉及到Nginx的后端檢測(cè)模塊,在此建議一個(gè)站點(diǎn)就是一個(gè)網(wǎng)站,站點(diǎn)多了可以使用不同的端口,且不可像以上那樣,具體原因后面有詳細(xì)介紹。
以上就是windows系統(tǒng)設(shè)置的過程。
2、開始搭建Linux服務(wù)
首先是設(shè)置Nginx 這里用到了Nginx的反向代理模塊和后端server的健康狀態(tài)檢查模塊
1)、搭建nginx,關(guān)閉防火墻,關(guān)閉selinux重啟服務(wù)器
2)、因?yàn)樾枰玫胶蠖藱z測(cè)模塊是第三方模塊,所以需要編譯安裝Nginx
使用的Nginx版本為nginx-1.14.0.tar.gz,第三方模塊為nginx_upstream_check_module-master.zip
為什么使用nginx-1.14.0.tar.gz,因?yàn)榈谌侥K里面check_1.14.0+.patch只看到了1.14的(最高的),如果使用新版本的話 怕是不支持
3)、先給Nginx打補(bǔ)丁
因?yàn)槲业囊呀?jīng)打過了。所有會(huì)這樣提示,而正常的提示是下圖:
出現(xiàn)如圖所示則表示打補(bǔ)丁成功
4)、編譯Nginx
首先直接安裝開發(fā)工具包組,后期編譯的時(shí)候出錯(cuò)少
yum groupinstall Development-tools -y 這個(gè)等待時(shí)間較長(zhǎng)
另外安裝:yum -y install perl-devel perl-ExtUtils-Embed 這個(gè)包平時(shí)沒用過,但是如果不安裝的話 編譯第三方模塊的時(shí)候會(huì)報(bào)錯(cuò),直接安裝了吧
Nginx編譯參數(shù):
./configure --prefix=/usr/local/nginx1.14 --conf-path=/usr/local/nginx1.14/nginx.conf --error-log-path=/usr/local/nginx1.14/logs/error.log --http-log-path=/usr/local/nginx1.14/logs/access.log --with-http_stub_status_module --add-module=/home/nginx_upstream_check_module-master --with-http_gunzip_module --with-http_gzip_static_module --with-http_ssl_module --with-http_v2_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_auth_request_module --with-http_sub_module --with-http_perl_module --with-perl_modules_path=/usr/local/nginx1.14/modules/
以上是nginx編譯參數(shù),按照上面編譯夠了,具體不知道編譯安裝流程的可以百度或google下這里不再贅述
如果順利通過的話 則會(huì)在/usr/local/下面看到ngnx1.14的文件夾了
如圖所示
下面開始配置nginx,配置文件nginx.conf 建議先行備份nginx.conf.back
5)、配置nginx.conf
user www; 啟動(dòng)nginx的時(shí)候用的用戶
worker_processes auto; 限制可支持auto,不用再寫cpu個(gè)數(shù)了
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65; 設(shè)置超時(shí)時(shí)間
gzip on;
upstream ERP { 這里定義了后端服務(wù)器 一共兩臺(tái),但是這都是使用的80端口(默認(rèn)),后面需要修改
ip_hash;
server 192.168.3.100;
server 192.168.0.229;
check interval=3000 rise=2 fall=5 timeout=1000 type=http; 這里就使用到了剛打的補(bǔ)丁了,后端健康狀態(tài)檢查,在此建議設(shè)置為
一秒一次成功一次則成功,失敗一次則失敗,對(duì)于要求比較高的,建議可以再縮小都行,這里是可一個(gè)坑,如果設(shè)置的時(shí)間過長(zhǎng)的話,刷新的時(shí)候會(huì)刷出錯(cuò)誤頁(yè)面出來。因?yàn)楸緛硪呀?jīng)停止的IIS在Nginx中還沒有給剔除掉,所以Nginx還會(huì)在這個(gè)時(shí)間段內(nèi),把請(qǐng)求調(diào)度給后端已經(jīng)停止的Server
”簡(jiǎn)單介紹下后端健康檢查這個(gè)模塊。這個(gè)模塊nginx_upstream_check_module-master.zip應(yīng)該是淘寶做的,淘寶的tengine默認(rèn)就支持此模塊,在其官網(wǎng)中有說明
Tengine是由淘寶網(wǎng)發(fā)起的Web服務(wù)器項(xiàng)目。它在Nginx的基礎(chǔ)上,針對(duì)大訪問量網(wǎng)站的需求,添加了很多高級(jí)功能和特性。Tengine的性能和穩(wěn)定性已經(jīng)在大型的網(wǎng)站如淘寶網(wǎng),天貓商城等得到了很好的檢驗(yàn)。它的最終目標(biāo)是打造一個(gè)高效、穩(wěn)定、安全、易用的Web平臺(tái)。
從2011年12月開始,Tengine成為一個(gè)開源項(xiàng)目,Tengine團(tuán)隊(duì)在積極地開發(fā)和維護(hù)著它。Tengine團(tuán)隊(duì)的核心成員來自于淘寶、搜狗等互聯(lián)網(wǎng)企業(yè)。Tengine是社區(qū)合作的成果,我們歡迎大家參與其中,貢獻(xiàn)自己的力量?!?br/>參數(shù)的含義是:
interval:檢查請(qǐng)求的間隔時(shí)間。
fall(fall_count):在fall_count失敗檢查后,服務(wù)器被標(biāo)記為關(guān)閉。
rise(rise_count):在rise_count成功檢查后,服務(wù)器被標(biāo)記。
timeout:檢查請(qǐng)求的超時(shí)。
default_down:指定后端服務(wù)器的初始狀態(tài),默認(rèn)為關(guān)閉。
type:檢查協(xié)議類型:
tcp:一個(gè)簡(jiǎn)單的TCP套接字連接并查看一個(gè)字節(jié)。
ssl_hello:發(fā)送客戶端SSL hello數(shù)據(jù)包并接收服務(wù)器SSL hello數(shù)據(jù)包。
http:發(fā)送http請(qǐng)求數(shù)據(jù)包,接收并解析http響應(yīng),以診斷上游服務(wù)器是否處于活動(dòng)狀態(tài)。
MySQL:連接到mysql服務(wù)器,接收問候響應(yīng)以診斷上游服務(wù)器是否處于活動(dòng)狀態(tài)。
ajp:發(fā)送AJP Cping數(shù)據(jù)包,接收并解析AJP Cpong響應(yīng),以診斷上游服務(wù)器是否處于活動(dòng)狀態(tài)。
port:在后端服務(wù)器中指定檢查端口。它可以與原始服務(wù)器端口不同。默認(rèn)端口為0,表示與原始后端服務(wù)器相同。在tengine-1.4.0之后添加此選項(xiàng)。
check_http_send "GET / HTTP/1.0\r\n\r\n";
而我沒有使用tengine,因?yàn)槲遗税雮€(gè)多小時(shí)就配置一個(gè)模塊命令,總是報(bào)錯(cuò),所以不得已只有開頭那里給nginx打補(bǔ)丁了....
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
location /nginxcon {
stub_status;
}
#access_log logs/host.access.log main;
location ^~ /XQZC {
proxy_pass http://ERP/XQZC;
}
location ^~ /BJ_CS {
proxy_pass http://ERP/BJ_CS;
}
location /status {
check_status;
access_log off;
# deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
還有兩項(xiàng)值得說明的
如下圖所示:
當(dāng)然它會(huì)一直在檢查的
所以上面設(shè)置的 check interval=1000 rise=1 fall=1 timeout=1000 type=http; 時(shí)間間隔完全沒有問題呢
在此以上就是Nginx的完整配置,但是其中有一個(gè)非常大的問題,就是在檢查后端服務(wù)器的時(shí)候,因?yàn)檫@里只設(shè)置了80端口的http的健康檢查,而我們?cè)谝粋€(gè)網(wǎng)站里面又添加了好多的應(yīng)用程序
那么問題來了:如果我們修改其中一個(gè)應(yīng)用程序的時(shí)候(一下簡(jiǎn)稱小網(wǎng)站),例如更新,勢(shì)必要停止此iis才能替換其中的一個(gè)小網(wǎng)站,如果停止了IIS則所有的session都會(huì)轉(zhuǎn)發(fā)到另外一臺(tái)服務(wù)器,而我們只是維護(hù)其中的一個(gè)小網(wǎng)站,加入說有10個(gè)小網(wǎng)站,那么剩下的9個(gè)是完全沒有問題的
這樣就造成了資源浪費(fèi)
所有要修改為,一個(gè)小網(wǎng)站建立一個(gè)站點(diǎn),使用不同的款口號(hào)
那么這樣的話 在維護(hù)一個(gè)小網(wǎng)站的時(shí)候只需要停止其中一個(gè)而不影響其他的,在定義Upstream的時(shí)候必須要按照端口號(hào)分開定義即可,那就變成下面這個(gè)樣子的
如圖所示,這樣就好多了,它也只檢測(cè)一個(gè)就好,這樣就成了下圖所示的
那個(gè)不能用 咱就停止那個(gè)................... 如此最好啊 呵呵...............
最后配置keepalived
這個(gè)就比較簡(jiǎn)單了,直接yum安裝keepalived
layer 3層檢測(cè):進(jìn)行ICMP ping包檢測(cè),確認(rèn)主機(jī)是否存活,如果異常,則會(huì)該主機(jī)從服務(wù)器集群中剔除;
layer 4層檢測(cè):進(jìn)行端口檢測(cè),例如80、3306等,端口不通時(shí),將服務(wù)器從集群中剔除;
layer 7層檢測(cè):這個(gè)就是基于應(yīng)用的了,如http返回碼是否為200,確認(rèn)主機(jī)是否正常。
在此我們使用第三個(gè)..
先說一下遇到的坑吧
1)、
此處剛開始一直直接使用的命令,網(wǎng)上所有的教程都讓直接使用命令,
但是新版本的在此配置段好像不支持直接使用命令檢查了,也不知道是我設(shè)置的不對(duì) 還是真的不能了,所以在此使用腳本檢查,腳本內(nèi)容還待優(yōu)化,暫且內(nèi)容如下:
keepalived健康檢查降權(quán)規(guī)則,默認(rèn)檢查結(jié)果失敗,失敗就會(huì)降權(quán),當(dāng)然我們也可以修改配置文件為成功則降權(quán)的,暫且使用默認(rèn)。如下圖:
如果兩個(gè)服務(wù)器都有vip的話 請(qǐng)繼續(xù)清空防火墻關(guān)閉selinux 就是他們引起的
備用keepalived直接復(fù)制過去主配置文件,修改 state和prioriy兩項(xiàng)即可
寫的有點(diǎn)著急了,不好的地方歡迎大家留言指正,謝謝??!