負載均衡叢集解決方案 Nginx
阿新 • • 發佈:2019-01-22
Nginx是一個免費的,開源的,高效能的伺服器和反向代理伺服器軟體,同時它也可以為IMAP和POP3伺服器代理,以其高效能,穩定性,豐富的功能,結構簡單,低資源消耗的特性換來廣大運維者所喜愛。
Nginx與傳統的伺服器不同,不依賴執行緒來處理請求。相反,它使用一個更可擴充套件事件驅動架構(非同步)。這種結構資源消耗較小,但更重要的是,可以承受較大的請求負荷。即使你不希望處理成千上萬的請求,你仍然可以受益於Nginx的高效能和小的記憶體佔用,以及其豐富的功能。 Nginx的反向代理: 反向代理指以代理伺服器來接受Internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給Internet上請求連線到客戶端,此時代理伺服器對外就表現為一個伺服器,而此種工作模式類似於LVS-NET模型。 反向代理也可以理解為web伺服器加速,它是一種通過在繁忙的web伺服器和外部網路之間增加的 一個高速web緩衝伺服器,用來降低實際的web伺服器的負載的一種技術。反向代理是針對web伺服器提高加速功能,所有外部網路要訪問伺服器時的所有請求都要通過它,這樣反向代理伺服器負責接收客戶端的請求,然後到源伺服器上獲取內容,把內容返回給使用者,並把內容儲存在本地,以便日後再收到同樣的資訊請求時,它會將本地快取裡的內容直接發給使用者,已減少後端web伺服器的壓力,提高響應速度。因此Nginx還具有快取功能。 反向代理的工作流程:$args, 請求中的引數; $is_args, 如果已經設定$args,則該變數的值為“?”,否則為“”。 $content_length, HTTP請求資訊頭裡的"Content-Length"; $content_type, 請求資訊頭裡的"Content-Type"; $document_root, 針對當前請求所屬的root指令設定的根目錄路徑; $document_uri, 與$uri相同; $host, 請求資訊中的"Host",如果請求中沒有Host行,則等於設定的伺服器名; $limit_rate, 對連線速率的限制; $request_method, 請求的方法,比如"GET"、"POST"等; $remote_addr, 客戶端地址; $remote_port, 客戶端埠號; $remote_user, 客戶端使用者名稱,認證用; $request_filename, 當前請求的檔案路徑名 $request_body_file, 客戶端請求主體的臨時檔名。 $request_uri, 請求的URI,帶引數; $query_string, 與$args相同; $scheme, 所用的協議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect; $server_protocol, 請求的協議版本,"HTTP/1.0"或"HTTP/1.1"; $server_addr, 伺服器地址,如果沒有用listen指明伺服器地址,使用這個變數將發起一次系統呼叫以取得地址(造成資源浪費); $server_name, 請求到達的伺服器名; $server_port, 請求到達的伺服器埠號; $uri, 請求的URI,可能和最初的值有不同,比如經過重定向之類的。 |
(三)、功能完善 安裝配置第三方模組,實現upstream中對後端web server的健康狀態檢測: 安裝配置方法: 1、首先解壓healcheck模組到某路徑下,這裡假設為/tmp/healthcheck_nginx_upstreams #tar -xvf cep21-healthcheck_nginx_upstreams-16d6ae7.tar.gz -C /tmp/healthcheck_nginx_upstreams 2、對nginx打補丁 首先解壓nginx,並進入nginx原始碼目錄: # tar xf nginx-1.3.4.tar.gz # cd nginx-1.0.11 # patch -p1 < /tmp/healthcheck_nginx_upstreams/nginx.patch 而後編譯nginx,在執行configure時新增類似下面的選項: --add-module=/tmp/healthcheck_nginx_upstreams 所以,這裡就使用如下命令:
# ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --with-pcre \ --add-module=/tmp/healthcheck_nginx_upstreams # make && make install |
ngx_http_healthcheck_module模組的使用方法: 1、此模組支援的指令有: healthcheck_enabled##啟用此模組 healthcheck_delay##對同一臺後端伺服器兩次檢測之間的時間間隔,單位毫秒,預設為1000; healthcheck_timeout##進行一次健康檢測的超時時間,單位為毫秒,預設值2000; healthcheck_failcount##對一臺後端伺服器檢測成功或失敗多少次之後方才確定其為成功或失敗,並實現啟用或禁用此伺服器; healthcheck_send##為了檢測後端伺服器的健康狀態所傳送的檢測請求;如:healthcheck_send "GET /health HTTP/1.0" 'Host: coolinuz.9966.org'; healthcheck_expected##期望從後端伺服器收到的響應內容;如果未設定,則表示從後端伺服器收到200狀態碼即為正確; healthcheck_buffer##健康狀態檢查所使用的buffer空間大小; healthcheck_status 通過類似stub_status的方式輸出檢測資訊,使用方法如下: location /stat { healthcheck_status; }
(四)、配置與實現 配置程式碼如下:
http { upstream web_pool { server 172.23.136.148:80 weight=10; server 172.23.136.149:80 weight=5; healthcheck_enabled; healthcheck_delay 1000; healthcheck_timeout 1000; healthcheck_failcount 2; healthcheck_send "GET /.health HTTP/1.0"; } server { listen 80; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://web_pool; proxy_connect_timeout 3; } location /stat { healthcheck_status; } }} |
(五)、小結 通過以上我們可以看出Nginx的配置其實是比較其他的web伺服器軟體是比較簡單的,但是其實現的功能確實相當強大豐富的。通過Nginx的反向代理已經支援靈活的正則表示式匹配,可以實現網站的動、靜分離,讓動態的php等程式網頁去訪問php web伺服器,讓快取頁、圖片、javascript、css、flash去訪問Squid等快取伺服器或檔案伺服器。加之Nginx對靜態內容的高效能,高併發量,Nginx作為前端代理負載均衡成為越來越多架構師的首先方案。