導航:首頁 > 源碼編譯 > nginx負載均衡源碼

nginx負載均衡源碼

發布時間:2022-07-28 23:06:40

1. nginx怎麼實現負載均衡

proxy_pass http://server:port 這句話你見過吧,它的意思就是把請求轉發到其他的server,其他的server使用upstream捆綁的,這樣就實現了負載均衡。

2. nginx負載均衡策略是什麼

當一台伺服器的單位時間內的訪問量越大時,伺服器壓力就越大,大到超過自身承受能力時,伺服器就會崩潰。為了避免伺服器崩潰,讓用戶有更好的體驗,通過負載均衡的方式來分擔伺服器壓力。

建立很多很多伺服器,組成一個伺服器集群,當用戶訪問網站時,先訪問一個中間伺服器,在讓這個中間伺服器在伺服器集群中選擇一個壓力較小的伺服器,將該訪問請求引入該伺服器。

如此以來,用戶的每次訪問,都會保證伺服器集群中的每個伺服器壓力趨於平衡,分擔了伺服器壓力,避免了伺服器崩潰的情況。



nginx實現反向代理負載均衡

a、本地使用Windows系統,然後使用VirutalBox安裝一個虛擬的Linux系統。

在本地的Windows系統上分別安裝nginx(偵聽8080埠)和apache(偵聽80埠)。在虛擬的Linux系統上安裝apache(偵聽80埠)。這樣相當於擁有了1台nginx在前端作為反向代理伺服器;後面有2台apache作為應用程序伺服器,可以看作是小型的server cluster。

b、nginx用來作為反向代理伺服器,放置到兩台apache之前,作為用戶訪問的入口。

3. nginx配置負載均衡,訪問頁面不載入JS、CSS等靜態文件,F12查看源代碼發現,jsp獲取basePath錯誤

在NGINX.CONF文件中配置地址和IP:

proxy_set_header Host $host; #從header頭中獲取的主機名
proxy_set_header X-Real-IP $remote_addr;
#獲取header頭中獲取的主機的真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#獲取header頭中獲取代理者的真實ip

4. 用nginx作為負載均衡伺服器,php代碼放在哪

lnmp架構 直接放nginx的web文件夾中,通過cgi解析php返回給nginx,如果是lnmpa架構,就是多了個apache,nginx負責分發請求,然後apache調用php_mod解析php,最後返回給nginx

如果是負載均衡,nginx分發請求,每個請求可能請求不同的伺服器,但是每個伺服器的網站程序應該是一致的,並且每個伺服器上都部署了php環境和程序,然後返回給請求者nginx輸出頁面。

5. 接觸過的Nginx的負載均衡演算法有哪些

Nginx 官方默認的幾種負載均衡的演算法
①Round-Robin RR輪詢(默認) 一次一個的來(理論上的,實際實驗可能會有間隔)
②weight 權重 權重高多分發一些 伺服器硬體更好的設置權重更高一些
③ip_hash 同一個IP,所有的訪問都分發到同一個web伺服器
第三方模塊實現的調度演算法 需要編譯安裝第三方模塊
④fair 根據後端伺服器的繁忙程度 將請求發到非繁忙的後端伺服器
⑤url_hash 如果客戶端訪問的url是同一個,將轉發到同一台後端伺服器
看你在學習Nginx的知識,推薦你去看黑馬程序員視頻庫,裡面有它的學習視頻,講解的很詳細哦!

6. nginx實現tomcat集群的負載均衡有幾種方式

一,如果僅是對外提供一個頁面訪問,不用區分單一用戶(不區分每個訪問session,不涉及用戶許可權,用戶資料等內容),僅僅配置nginx負載均衡策略即可。
nginx負載均衡策略主要分一下四種:
1)、輪詢(默認)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器宕機,能自動剔除。
2)、ip_hash 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器。
3)、fair 按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
4)、url_hash 按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為緩存時比較有效。
二,如果涉及到用戶session,做一些鑒權緩存、存放臨時信息時,就必須做tomcat的session共享。
目前可參考到的session共享方式主要分為兩種。
1)利用tomcat自帶的組播機制,實現session復制。
對tomcat及應用的若干配置文件進行配置即可實現,網上有很多資料可參考。但這種方式些弊端,看過一些資料,不建議用session復制的方式。在實際使用過程中,也發現有存在session莫名失蹤的現象。
2)利用第三方機制存儲session。
比較常見的是tomcat集成memcached伺服器來存儲session。實際項目中,我們採用過利用redis實現session存儲,redis高效的存取性能為高效的訪問提供了保障,但是目前redis的集群功能似乎沒有發布,如何解決redis的單點故障需要研究。

7. 集群和負載均衡的區別 nginx

Nginx是一個免費的,開源的,高性能的伺服器和反向代理伺服器軟體,同時它也可以為IMAP和POP3伺服器代理,以其高性能,穩定性,豐富的功能,結構簡單,低資源消耗的特性換來廣大運維者所喜愛。
Nginx與傳統的伺服器不同,不依賴線程來處理請求。相反,它使用一個更可擴展事件驅動架構(非同步)。這種結構資源消耗較小,但更重要的是,可以承受較大的請求負荷。即使你不希望處理成千上萬的請求,你仍然可以受益於Nginx的高性能和小的內存佔用,以及其豐富的功能。

Nginx的反向代理:
反向代理指以代理伺服器來接受Internet上的連接請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給Internet上請求連接到客戶端,此時代理伺服器對外就表現為一個伺服器,而此種工作模式類似於LVS-NET模型。
反向代理也可以理解為web伺服器加速,它是一種通過在繁忙的web伺服器和外部網路之間增加的 一個高速web緩沖伺服器,用來降低實際的web伺服器的負載的一種技術。反向代理是針對web伺服器提高加速功能,所有外部網路要訪問伺服器時的所有請求都要通過它,這樣反向代理伺服器負責接收客戶端的請求,然後到源伺服器上獲取內容,把內容返回給用戶,並把內容保存在本地,以便日後再收到同樣的信息請求時,它會將本地緩存里的內容直接發給用戶,已減少後端web伺服器的壓力,提高響應速度。因此Nginx還具有緩存功能。

反向代理的工作流程:
1)用戶通過域名發出訪問請求,該域名被解析為反向代理伺服器的IP地址;
2)反向代理伺服器接收用戶的請求;
3)反向代理伺服器在本地緩存查找是否存在當前用戶所請求的內容,找到則直接把內容返回給用戶;
4)如果本地沒有用戶請求的內容,反向代理伺服器會以自己的身份去後端伺服器請求同樣的信息內容,並把信息內容發給用戶,如果信息內容是可以被緩存的,則會將該內容緩存在代理伺服器的本地緩存中。

反向代理的好處:
1)解決了網站伺服器對外可見的問題,提高了網站伺服器的安全性;
2)節約了有限的IP地址資源,後端伺服器均可使用私有IP地址與代理伺服器進行通信;
3)加速了網站的訪問速度,減輕了真是web伺服器的負荷。

(一)、調度演算法
Nginx的upstream指令用於指定proxy_pass和fastcgi_pass所使用的後端伺服器,即nginx的反向代理功能,因此可以將兩者結合起來使用以達到負載均衡的目的,而Nginx也支持多種調度演算法:
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,則會跳過該伺服器分配至下一個監控的伺服器。並且它無需記錄當前所有連接的狀態,所以它是一種無狀態調度。
2、weight
指定在輪詢的基礎上加上權重,weight和訪問比率成正比,即用於表明後端伺服器的性能好壞,若後端伺服器性能較好則可將大部分請求分配給它,已實現其力所能及。
例如:
我後端伺服器172.23.136.148配置:E5520*2 CPU,8G內存
後端伺服器172.23.136.148配置:Xeon(TM)2.80GHz * 2,4G內存
我希望在有30個請求到達前端時,其中20個請求交給172.23.136.148處理,剩餘10個請求交給172.23.136.149處理,就可做如下配置
upstream web_poll {
server 172.23.136.148 weight=10;
server 172.23.136.149 weight=5;
}
3、ip_hash
每個請求按訪問ip的hash結果分配,當新的請求到達時,先將其客戶端IP通過哈希演算法進行哈希出一個值,在隨後的請求客戶端IP的哈希值只要相同,就會被分配至同一個後端伺服器,該調度演算法可以解決session的問題,但有時會導致分配不均即無法保證負載均衡。
例如:
upstream web_pool {
ip_hash;
server 172.23.136.148:80;
server 172.23.136.149:80;
}
4、fair(第三方)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
upstream web_pool {
server 172.23.136.148;
server 172.23.136.149;
fair;
}
5、url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為緩存時比較有效。
例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash演算法
upstream web_pool {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

每個設備的狀態設置為:
1.down 表示當前的server不參與負載,用於ip_hash中
2.weight 默認為1.weight越大,負載的權重就越大。
3.max_fails 允許請求失敗的次數默認為1.設為0則表示關閉該項功能,當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
4.fail_timeout 在max_fails定義的失敗次數後,暫停的時間。
5.backup 可以將其理解為備機,其它所有的非backup機器down或者忙的時候,才會將請求分配給backup機器。所以這台機器壓力會最輕。

nginx支持同時設置多組的負載均衡,用來給不用的server來使用。

(二)、指令的使用
1、upstream
聲明一組可以被proxy_pass和fastcgi_pass引用的伺服器;這些伺服器可以使用不同的埠,並且也可以使用Unix Socket;也可以為伺服器指定不同的權重。如:
upstream web_pool {
server coolinuz.9966.org weight=5;
server 172.23.136.148:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
2、server
語法:server name [parameters]
其中的name可以是FQDN,主機地址,埠或unix套接字;如果FQDN解析的結果為多個地址,則每個地址都會被用到。
3、proxy_pass
語法:proxy_pass URL;
該指令用於指定代理伺服器的地址和URL將被映射為的URL或地址和埠。即用來指定後端伺服器的地址或URL[埠]。
4、proxy_set_header
語法:proxy_set_header header value;
該指令允許重新定義和添加一些將被轉移到被代理伺服器的請求頭部信息。
例如:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
注意:$proxy_add_x_forwarded_for包含客戶端請求頭中的"X-Forwarded-For",與$remote_addr用逗號分開,如果沒有"X-Forwarded-For" 請求頭,則$proxy_add_x_forwarded_for等於$remote_addr

順便補上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,可能和最初的值有不同,比如經過重定向之類的。

5、proxy_read_timeout
語法:proxy_read_timeout time;
這個指令設置Nginx與後端伺服器建立連接後。等待後端伺服器的響應時間
6、proxy_send_timeout
語法:roxy_send_timeout time;
該指令指定請求轉移到後端伺服器的超時時間。整個傳輸的要求時間不超過超時時間,但只有兩次寫操作之間。如果在此時間之後的後端伺服器將不採取新的數據,然後nginx將關閉連接。
7、proxy_connect_timeout
語法:proxy_connect_timeout time;
該指令用來設置分配到後端伺服器的連接超時時間。
8、proxy_buffers
語法: proxy_buffers the_number is_size;
該指令設置緩沖區的數目和大小,預設情況下,一個緩沖區的大小和頁面大小相同。
9、proxy_buffer_size
語法:proxy_buffer_size buffer_size;
代理緩沖區,該指令用於保存用用戶的頭部信息。
10、proxy_busy_buffers_size
語法:proxy_busy_buffers_size size;
用於當系統負載較大,緩沖區不夠用時,可以申請更大的proxy_buffers
11、proxy_temp_file_write_size
語法:proxy_temp_file_write_size size;
用於指定緩存臨時文件的大小

(三)、功能完善
安裝配置第三方模塊,實現upstream中對後端web server的健康狀態檢測:
模塊下載地址:https://github.com/cep21/healthcheck_nginx_upstreams;模塊名稱:ngx_http_healthcheck_mole
安裝配置方法:
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-mole=/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_mole \
--with-http_flv_mole \
--with-http_stub_status_mole \
--with-http_gzip_static_mole \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--with-pcre \
--add-mole=/tmp/healthcheck_nginx_upstreams
# make && make install

ngx_http_healthcheck_mole模塊的使用方法:
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;
}
}

}
在這里設置「proxy_set_header」參數,是因為Nginx在做反向代理的時候,要代替客戶端去訪問伺服器,所以,當請求包經過反向代理後,在代理伺服器這里這個IP數據包的IP包頭做了修改,最終後端web伺服器得到的數據包的頭部的源IP地址是代理伺服器的IP地址,這樣一來,後端伺服器的程序給予IP的統計功能就沒有任何意義,或者後端web伺服器上有多個基於域名的虛擬主機時,就要通過添加Header頭信息Host,用於指定請求的域名,這樣後端web伺服器才能識別該反向代理訪問請求由哪個虛擬主機來處理。

(五)、小結
通過以上我們可以看出Nginx的配置其實是比較其他的web伺服器軟體是比較簡單的,但是其實現的功能確實相當強大豐富的。通過Nginx的反向代理已經支持靈活的正則表達式匹配,可以實現網站的動、靜分離,讓動態的php等程序網頁去訪問php web伺服器,讓緩存頁、圖片、javascript、css、flash去訪問Squid等緩存伺服器或文件伺服器。加之Nginx對靜態內容的高性能,高並發量,Nginx作為前端代理負載均衡成為越來越多架構師的首先方案。

8. nginx如何做負載均衡,求資料啊!跪謝!

可以利用Nginx反向代理實現負載均衡
詳細配置可參考(網路搜的)

http://www.php100.com/html/program/nginx/2013/0905/5525.html

閱讀全文

與nginx負載均衡源碼相關的資料

熱點內容
單片機6502 瀏覽:763
自助洗車有什麼app 瀏覽:935
程序員離職率多少 瀏覽:322
程序員那麼可愛電視劇今天沒更新 瀏覽:337
我的世界地形演算法 瀏覽:343
台灣dns的伺服器地址雲空間 瀏覽:288
音樂噴泉軟體要什麼加密狗 瀏覽:501
androidhttpmime 瀏覽:774
威科夫操盤法pdf 瀏覽:981
演算法可以用圖表表示 瀏覽:949
山西太原php 瀏覽:274
常用cmd網路命令 瀏覽:677
hashmap7源碼分析 瀏覽:899
搜索引擎原理技術與系統pdf 瀏覽:362
運動估計演算法python 瀏覽:861
java正則1 瀏覽:539
redhatlinux最新 瀏覽:182
python字典編程詞彙 瀏覽:147
微信和伺服器如何通訊 瀏覽:13
百家號伺服器配置有什麼用 瀏覽:601