1. 程式人生 > >Ngnix技術研究系列1-通過應用場景看Nginx的反向代理

Ngnix技術研究系列1-通過應用場景看Nginx的反向代理

emca pid 開頭 plain 性能 xxx md5 重新 行數

隨著我們業務規模的不斷增長,整個系統規模由兩年前的幾十臺服務器,井噴到現在2個數據中心,接近400臺服務器,上百個WebApi站點,上百個域名。

這麽多的WebApi站點這麽多的域名,管理和維護成本很高。

後續隨著系統規模的繼續擴張,必須實現域名的統一規劃,使用Nginx實現請求的反向代理和動態路由。

從實際場景出發,看一看實際的場景是什麽?

http://api.***.com/action => http://192.168.0.11/api/action
Header: *** Header: ***
Body: *** Body: ***

根據請求的Action動態解析對應的內網服務器地址,再實現服務的轉發。

一、 工欲善其事必先利其器,先科普一下Nginx

1. HTTP基礎功能

  • 處理靜態文件,索引文件以及自動索引;
  • 反向代理加速(無緩存),簡單的負載均衡和容錯;
  • FastCGI,簡單的負載均衡和容錯;
  • 模塊化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求並發處理;
  • SSL 和 TLS SNI 支持;
  • 基於IP 和名稱的虛擬主機服務;
  • Memcached 的 GET 接口;
  • 支持 keep-alive 和管道連接;
  • 靈活簡單的配置;
  • 重新配置和在線升級而無須中斷客戶的工作進程;
  • 可定制的訪問日誌,日誌寫入緩存,以及快捷的日誌回卷;
  • 4xx-5xx 錯誤代碼重定向;
  • 基於 PCRE 的 rewrite 重寫模塊;
  • 基於客戶端 IP 地址和 HTTP 基本認證的訪問控制;
  • PUT, DELETE, 和 MKCOL 方法;
  • 支持 FLV (Flash 視頻);
  • 帶寬限制;

2. IMAP/POP3 代理服務功能

  • 使用外部 HTTP 認證服務器重定向用戶到 IMAP/POP3 後端;
  • 使用外部 HTTP 認證服務器認證用戶後連接重定向到內部的 SMTP 後端;
  • 認證方法:
  • POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
  • IMAP: IMAP LOGIN;
  • SMTP: AUTH LOGIN PLAIN CRAM-MD5;
  • SSL 支持;
  • 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

3. 支持的操作系統

  • FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;
  • Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;
  • Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
  • MacOS X (10.4) PPC;

二、Nginx的核心應用場景

1. 作為 Web 服務器:相比 Apache,Nginx 使用更少的資源,支持更多的並發連接,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。能夠支持高達 50,000 個並發連接數的響應,Nginx 為選擇了 epoll and kqueue 作為開發模型.
2. 作為負載均衡服務器:Nginx 既可以在內部直接支持 Rails 和 PHP,也可以支持作為 HTTP代理服務器 對外進行服務。Nginx 用 C 編寫, 不論是系統資源開銷還是 CPU 使用效率都比 Perlbal 要好的多。
作為郵件代理服務器: Nginx 同時也是一個非常優秀的郵件代理服務器

3. Nginx 安裝簡單,配置文件非常簡潔(還能夠支持perl語法),Bugs非常少的服務器: Nginx 啟動特別容易,並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。支持不間斷服務的情況下進行軟件版本的升級。

我們對Nginix的實際應用場景:

我們遷移.Net Core之後,前端使用Vue,我們將使用Nginx作為反向代理服務器和Http服務器

WebApi站點反向代理用

三、CentOS下安裝部署Nginx

1. 安裝Make

yum -y install gcc automake autoconf libtool make

2. 安裝g++

yum install gcc gcc-c++

3. 安裝PCRE庫

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz 
tar -zxvf pcre-8.38.tar.gz
cd pcre-8.34
./configure
make
make install

4. 安裝Zlib

cd /usr/local/src
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.8
./configure
make
make install

5. 下載解壓SSL

wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
tar -zxvf openssl-1.0.2l.tar.gz

6. 安裝Nginx

cd /usr/local/src
wget http://nginx.org/download/nginx-1.4.2.tar.gz

cd nginx-1.4.2
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=/opt/app/openet/oetal1/chenhe/pcre-8.37 --with-zlib=/opt/app/openet/oetal1/chenhe/zlib-1.2.8 --with-openssl=/opt/app/openet/oetal1/chenhe/openssl-1.0.1t
make
make install

7. 啟動Nginx,使用默認的Nginx.Conf文件

sudo /usr/local/nginx/nginx

四、 Nginx反向代理設置

在設置Nginx反向代理之前,我們需要謹慎的規劃URL的使用!!!
為後續的業務擴展、水平伸縮打好基礎,否則雜亂無章的URL使用,會導致路由配置極其復雜難用。
先看Nginx的HTTP負載均衡的標準配置:

技術分享

Nginx中location對url匹配;

語法:location [=|~|~*|^~] /uri/ { … }

當匹配中符合條件的location,則執行內部指令;

如果使用正則表達式,必須使用~*表明不區分大小寫或者~區分大小寫匹配;

當匹配成功後,將停止往下匹配;如果沒有找到,則使用常規自字符串處理結果;

  • =開頭表示精確匹配
  • ^~ 開頭表示uri以某個常規字符串開頭,不是正則匹配
  • ~ 開頭表示區分大小寫的正則匹配;
  • ~* 開頭表示不區分大小寫的正則匹配
  • / 通用匹配, 如果沒有其它匹配,任何請求都會匹配到

舉個示例:

技術分享

把xxx123.tk域名指向靜態IP,這樣就實現了在瀏覽器中
輸入xxx123.tk訪問192.168.10.38的3000端口,
輸入xxx456.tk訪問192.168.10.40的80端口的作用。

同時,示例一個Nginx負載均衡配置

技術分享

五、Nginx動態路由

在Nginx的設計中,每一個upstream維護了一張靜態路由表,存儲了backend的ip、port以及其他的meta信息。

每次請求到達後,會依據location檢索路由表,然後依據具體的調度算法(如round robin )選擇一個backend轉發請求。

但這張路由表是靜態的,如果變更後,則必須reload,經常reload的話這對SLA有較大影響。

為了達到減少reload的目的,大多通過動態更新維護路由表來解決這個問題。

各種google、百度之後,找到了幾個線索:Nginx、Lua、Redis

然後又發現了新大陸OpenResty:

OpenResty 是一個基於 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用於方便地搭建能夠處理超高並發、擴展性極高的動態 Web 應用、Web 服務和動態網關。

技術分享

下面幾篇文章,我們繼續研究上面這個新大陸。

周國慶

2017/10/1

Ngnix技術研究系列1-通過應用場景看Nginx的反向代理