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