您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何搭建Nginx服務器做到負載均衡”,在日常操作中,相信很多人在如何搭建Nginx服務器做到負載均衡問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何搭建Nginx服務器做到負載均衡”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
1.什么是Nginx?
Nginx也是一款服務器,我們常用它做:如反向代理、負載均衡、動態與靜態資源的分離的工作。
反向代理:相對應的是正向代理,如果你使用過代理服務器的話就明白,我們訪問某一個網站并非直接訪問目標網站,而是告訴代理服務器我需要訪問什么目標網站,由代理服務器發出請求給目標網站,將目標網站訪問結果再轉發給你,此時,你是請求代理方。而反向代理是此時代理服務器做服務器的代理,我們的訪問請求并非直接訪問到目標服務器上,而是訪問代理服務器,由代理服務器決定什么樣的請求以什么樣的方式訪問正式服務器。
負載均衡:目前大多數的網站都會采用負載均衡手段來針對目前用戶的指數級增長來減少對單點服務器的負載壓力,比如目前我們擁有3臺真實服務器,我們需要根據相應策略決定什么樣的用戶請求分配到哪個真實服務器,比如按照輪詢的方式,用戶請求挨個到達代理服務器,此時代理服務器按照***個請求轉發至***臺真實服務器,第二個請求轉發到第二個服務器上,依次類推,這樣可以防止大量的用戶請求全部訪問到同一臺物理機上,單點物理機的性能始終有限的,當然這可能對服務器數據訪問時候造成事務性的失效,在Web方面可能造成Session訪問的問題,這不在本文討論方面內。
動態靜態資源分離:最方便列舉就是Java的JSP和靜態資源如:.js/.css/.html/.png方面的資源分離,之前開發web方面的程序時候我們習慣將html、css等資源文件也放置于Tomcat之中,用戶訪問后tomcat需要將請求的這些靜態資源文件一并返回給用戶,再者如果有多臺同業務邏輯的tomcat服務器的話,同樣的資源還需要在每個服務器上放一份,同時也增加了tomcat服務器的網絡IO,十分不合算的,如果我們只講JSP之類的請求交給tomcat,而代理服務器上存放靜態資源,當用戶的請求非動態資源的時候,我們完全可以將代理服務器的靜態資源直接返回給用戶,而不去增大Tomcat的壓力,tomcat只需要負責邏輯處理和動態資源的加載就可以了。
基于上述的Nginx優勢,決定搭建一下Nginx+Tomcat的組合來進行測試,包括參數傳遞,post、get傳遞參數是否有影響,還有Nginx的工作模式master和worker的工作方式進行一些淺薄的總結。如有錯誤,懇請大家指出。
2.Nginx的安裝問題?
安裝部分這里就不在細說了,網上的教程很多,我們直接從配置文件開始吧
3.配置文件
#user nobody; #這里是核心worker數,一般設置為與cpu核心數相同的數目,避免進程切換造成的上下文切換耗費資源,cpu信息可以從/proc/cpuinfo中查看 worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { #use epoll model使用epoll模型,采用異步非阻塞模型加快處理速度 use epoll; worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; #設定通過nginx上傳文件的大小 client_max_body_size 300m; #使用sendfile函數在兩個文件描述符之間直接傳遞數據(完全在內核中操作,傳送),從而避免了內核緩沖區數據和用戶緩沖區數據之間的拷貝,操作效率很高,被稱之為零拷貝。 sendfile on; #tcp_nopush on; #keepalive_timeout 0; #連接活躍時間 keepalive_timeout 65;#使用壓縮數據減少IO量,但是在不支持數據解壓瀏覽器可能產生亂碼 #gzip on; #靜態服務器組 #設定靜態資源服務器訪問接口 upstream static.zh-jieli.com { server localhost:808 weight=1; } #動態服務器組 upstream zh-jieli.com { #設置Hash輪詢規則 #ip_hash; #weight: server ip:port weight=10#默認 輪詢# fair:按照后端服務器的響應時間來分配 #url_hash:按照url規則進行分配,使得固定的請求分配到固定的服務器上 server localhost:8080; server localhost:8081; } server{ listen 808; server_name static; location / { } location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) { #所有靜態文件直接讀取硬盤內容:讀取的靜態資源存放位置 root /apache-tomcat-8.5.24/webapps/ROOT ; #資源是否進行緩存與緩存時間 expires 30d; #緩存30天 } } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index1.html index.htm; } location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) { #proxy_cache cache_one; proxy_cache_valid 200 304 302 5d; proxy_cache_valid any 5d; proxy_cache_key '$host:$server_port$request_uri'; add_header X-Cache '$upstream_cache_status from $host'; proxy_pass http://static.zh-jieli.com; # 所有靜態文件直接讀取硬盤 root /apache-tomcat-8.5.24/webapps/ROOT; expires 30d; #緩存30天 } #其他頁面反向代理到tomcat容器 location ^~ /tomcat { index index; # proxy_pass http://localhost:8080/; #設定代理服務器組 proxy_pass http://zh-jieli.com/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
總結
整個nginx工作時當http請求到來時,由nginx針對nginx.conf配置好的規則,對location進行正則匹配,匹配到相應的正則,進行location內部的處理 關于Nginx的location配置附上一篇博客,很nice http://seanlook.com/2015/05/17/nginx-location-rewrite/
里面很詳細列出了各種要求的location匹配規則,
值得注意的一點是: location匹配遵循最長原則,即滿足了之前的匹配規則后,除了遇見^會終止向下繼續匹配,其他情況會依次向下搜索,知道找到合適的location匹配規則然后進行處理 Nginx在模塊功能上分三個模塊:
Handlers(處理器模塊)。此類模塊直接處理請求,并進行輸出內容和修改headers信息等操作。Handlers處理器模塊一般只能有一個。
Filters (過濾器模塊)。此類模塊主要對其他處理器模塊輸出的內容進行修改操作,***由Nginx輸出。
Proxies (代理類模塊)。此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與后端一些服務比如FastCGI等進行交互,實現服務代理和負載均衡等功能。 因為是測試,所以我的兩個tomcat都安裝到了同一臺本地機器上 生產環境中根據需要進行配置相應的IP就好了 本地寫好相應的測試代碼+log4j將信息日志打到相應的位置用來觀察參數是否傳遞過來。
TestOne.java
package com.nginx.controllers; import com.nginx.utils.Log4jUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller @RequestMapping("/test") public class TestOne { @RequestMapping("/getname") public void test(@RequestParam(value = "name") String name) { //用來記錄獲取的參數name,可以通過查看日志進行確認 Log4jUtils.getLogger().info("my name is" + name); } }
Log4jUtils.java
package com.nginx.utils; import org.apache.log4j.Logger; public class Log4jUtils { private static final Logger logger = Logger.getLogger(Logger.class); public static Logger getLogger() { return logger; } }
demo
這里簡單做了兩個的demo程序,做相應的測試,將項目打成war包后上傳至Linux服務器,移動到tomcat/webapps中,tomcat進行熱部署 先測試當前的tomcat是否能正常運行,由于沒有做區別頁面,就直接看日志來判斷了。
如圖:以輪詢方式進行訪問8080和8081監聽的tomcat 上述方式是get請求進行的測試,我們來試試post。
到此,關于“如何搭建Nginx服務器做到負載均衡”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。