新聞中心
| 本博文出自博客waring_id博主,有任何問題請(qǐng)進(jìn)入博主頁面互動(dòng)討論! 博文地址:http://waringid.blog./65148/1606122 |
一、簡(jiǎn)介

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、石門網(wǎng)站維護(hù)、網(wǎng)站推廣。
最近新上了一個(gè)營(yíng)銷項(xiàng)目(和微信結(jié)合),后臺(tái)用的是Tomcat。開始上線的時(shí)候因?yàn)槿藬?shù)不多感覺沒太多問題,隨著正式環(huán)境的發(fā)布,開人有人反映服務(wù)器頁面無法打開,連入tomcat查看時(shí)發(fā)現(xiàn)連接數(shù)已滿且CPU也用到了極限,初始的架構(gòu)如下圖所示,其使用1臺(tái)tomcat和一臺(tái)數(shù)據(jù)庫服務(wù)器。
該業(yè)務(wù)系統(tǒng)主要用于微信營(yíng)銷,顧客在微信上下單購買(搶)對(duì)應(yīng)的商品,搶購成功后該商品(券)會(huì)自動(dòng)生成條形碼保存在該用戶的注冊(cè)信息中。用戶憑券到實(shí)體店完成支付和取貨操作。因?yàn)樯婕叭虽N的問題(支付完成后即時(shí)核銷),因此該業(yè)務(wù)無法放在云端(核銷的數(shù)據(jù)和實(shí)體店銷售數(shù)據(jù)需即時(shí)交互),最終只能通過本地的方案來解決。
首先考慮到的是將網(wǎng)上的連接通過負(fù)載均衡的方式分散來減輕服務(wù)器的壓力,這方面可以使用nginx代理來實(shí)現(xiàn);其次需要解決的問題是session,對(duì)比了幾種方案發(fā)現(xiàn)nginx內(nèi)置的ip_hash策略可以解決該問題,最終網(wǎng)絡(luò)的架構(gòu)變成了下圖所示,在該方案中增加了4臺(tái)服務(wù)器,其中一臺(tái)nginx負(fù)載轉(zhuǎn)發(fā),另外四臺(tái)為新增的tomcat服務(wù)。
二、安裝Nginx
Nginx的安裝配置十分簡(jiǎn)單,我這里實(shí)際用的是tengine版本,具體的安裝方法可以參考” nginx配置指南之一”。這里需要注意的是它的編譯參數(shù),記得它的配置文件和日志文件的存放位置。
三、優(yōu)化系統(tǒng)資源
文件限制
Linux系統(tǒng)中文件的打開個(gè)數(shù)及單用戶最多擁有的進(jìn)程數(shù)是有限制的,可以通過“ulimit -n”或“ulimit -u”來查看,詳細(xì)的設(shè)置可以參考“ORACLE 11G在Linux下的標(biāo)準(zhǔn)安裝方法(上)”。先修改/etc/security/limit.conf中的限制,如下圖所示。
內(nèi)核優(yōu)化
內(nèi)核中涉及的TCP相關(guān)的選項(xiàng)在大并發(fā)連接的情況下也需要做相應(yīng)的調(diào)整否則可以出“TCP: time wait bucket table overflow” 的錯(cuò)誤提示。具體修改/etc/sysctl.conf文件,如有特殊要求請(qǐng)結(jié)合實(shí)際情況修改。具體如下所示:
tcp_max_tw_buckets 系統(tǒng)在同時(shí)所處理的最大 timewait sockets 數(shù)目。如果超過此數(shù)的話﹐time-waitsocket 會(huì)被立即刪除并且顯示警告信息。
ip_local_port_range 用于向外連接的端口范圍。
netdev_max_backlog 每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目,對(duì)重負(fù)載服務(wù)器而言,該值需要調(diào)高一點(diǎn)。
tcp_max_orphans 處理不屬于任何進(jìn)程的套接字?jǐn)?shù)量,不屬于任程進(jìn)程的進(jìn)程就是“孤兒(orphans)進(jìn)程”,在快速、大量的連接中這種進(jìn)程會(huì)很多因此要適當(dāng)?shù)脑O(shè)置該參數(shù),也可以用來防御簡(jiǎn)單的DoS攻擊。
tcp_max_syn_backlog 用于記錄尚未收到客戶端確認(rèn)信息的連接請(qǐng)求的最大值。
四、優(yōu)化Nginx
epoll為linux下的必須模型,適用于2.6以后的內(nèi)核版本,如下圖所示:
優(yōu)化代理配置
需要注意的是“proxy_max_temp_file_size”,它主要用來設(shè)置臨時(shí)文件的最大值。當(dāng)被請(qǐng)求的文件內(nèi)容大于代理緩存的大小時(shí),該文件會(huì)被存儲(chǔ)到這個(gè)臨時(shí)文件,但是如果被請(qǐng)求文件的內(nèi)容大于這個(gè)值的時(shí)候,那么將會(huì)從上游的服務(wù)器(被代理的服務(wù)器)上直接同步傳遞,而不再使用代理緩存。該指令的默認(rèn)值為1GB,如果設(shè)置為0,那么意味著禁止使用臨時(shí)文件。
五、配置Nginx
Nginx配置如下所示,其中upstreambackend配置的是后端的tomcat應(yīng)用,ip_hash表示啟用該策略,用戶的目的是為了解決后端session不一致的問題(在nginx前端還有CDN或是局域網(wǎng)的環(huán)境中須慎用)。
server段配置的是轉(zhuǎn)發(fā)的路徑和端口,需要注意“proxy_set_header Host $host:8162;”的寫法。如果該變量后沒有加8162端口則實(shí)際的轉(zhuǎn)發(fā)會(huì)導(dǎo)致頁面無法正常顯示。其后的兩條語句可以參考nginx日志的記錄內(nèi)容,主要用來記錄外網(wǎng)實(shí)際的訪問請(qǐng)求。
log_format字段用來生成指定的日志格式文件,相應(yīng)的變量對(duì)應(yīng)日志文件中的訪問記錄,可以對(duì)照下圖來查看。
六、Nginx安全限制
隨著業(yè)務(wù)的增加,網(wǎng)絡(luò)連接的流量越來越大,合理的控制訪問請(qǐng)求及連接數(shù)非常重要,否則仍會(huì)出現(xiàn)失去響應(yīng)的情況。
七、增加IP限制功能
最簡(jiǎn)單也最容易實(shí)現(xiàn)的的方式是Nginx自帶的IP訪問控制,由模塊ngx_http_limit_conn_module和來ngx_http_limit_req_module實(shí)現(xiàn),通過它們可以實(shí)現(xiàn)對(duì)IP地址連接數(shù)及服務(wù)器訪問請(qǐng)求數(shù)的控制。
要限制連接,必須先有一個(gè)容器對(duì)連接進(jìn)行計(jì)數(shù),在http段加入如下代碼:"zone=" 給它一個(gè)名字,可以隨便叫,這個(gè)名字要跟下面的limit_conn 一致,$binary_remote_addr = 用二進(jìn)制來儲(chǔ)存客戶端的地址,1m 可以儲(chǔ)存 32000 個(gè)并發(fā)會(huì)話。
限制請(qǐng)求數(shù)的方式和限制連接數(shù)類似,其中“rate=10r/s”表示一秒中處理的請(qǐng)求為10個(gè),如果需要限制為每分鐘不超過30個(gè)則表示為“rate=30r/m”;一個(gè)具體的設(shè)定如下所示:
- http {
- limit_req_zone$binary_remote_addr zone=one:10m rate=10r/s;
- limit_conn_zone$binary_remote_addr zone=two:10m;
- }
在server段中加入以下內(nèi)容,其中“burst=5”表示同時(shí)允許超過頻率限制的請(qǐng)求數(shù)不多于5個(gè);“l(fā)imit_conn two 15”表示對(duì)于同一IP的連接數(shù)限制為15個(gè)。
- limit_req zone=one burst=5;
- limit_conn two 15;
后續(xù)WAF模塊的添加以及nginx相關(guān)的監(jiān)控待整理。PS:請(qǐng)關(guān)注官方博客。
文章題目:【博文推薦】微信營(yíng)銷業(yè)務(wù)生產(chǎn)環(huán)境下的負(fù)載均衡配置
當(dāng)前路徑:http://m.5511xx.com/article/djdscsd.html


咨詢
建站咨詢
