1. 程式人生 > 實用技巧 >分散式系統系列--(二)使用Nginx實現負載均衡

分散式系統系列--(二)使用Nginx實現負載均衡

Nginx負載均衡

Nginx是一款輕量級的web伺服器/反向代理伺服器以及電子郵件代理伺服器,並在BSD協議下發行,可以在Unit、GNU/Linux、BSD、macos x、windows等作業系統中執行。其特點是佔有記憶體少,高效能,併發能力強(10k併發),並且還能夠提供強大的反向代理功能,它的併發能力在同類型的網路伺服器中表現很好。
基於反向代理的功能,Nginx作為負載均衡主要有以下幾點理由:

  • 高併發連線
  • 記憶體消耗少
  • 配置檔案非常簡單
  • 支援Rewrite重寫規則
  • 內建的健康監測功能
  • 節省頻寬
  • 穩定性高

正向代理和反向代理

正向代理
正向代理類似一個跳板機,代理訪問外部資源。(客戶端->正向代理伺服器->網際網路->正向代理伺服器->客戶端)
反向代理


實際執行方式是指代理伺服器來接受Internet網際網路上的連線請求,然後將請求轉發給內部網路上的伺服器(也就是說反向代理伺服器與內網的伺服器在同一個內網中,它是客戶端訪問內網的入口),並將從伺服器上得到的結果返回給Internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。(客戶端->反向代理伺服器->內網伺服器->反向代理伺服器->客戶端)
反向代理的作用:

  • 保證內網的安全,可以使用反向代理提供WAF功能,阻止web攻擊。大型網站,通常將反向代理作為公網範文地址,web伺服器是內網。
  • 負載均衡,通過反向代理伺服器來優化網站的負載。

Nginx負載均衡的4種方案配置

  1. 輪詢
    輪詢即Round Robin,這是Nginx預設的配置策略。根據Nginx配置檔案中的順序,依次把客戶端的web請求分發到不同的後端伺服器上。
    它的配置檔案如下:
user www-data;
worker_processes auto;
pid/run/nginx.pid;

events{
        #epoll是Linux上的事件模型,如果是其他系統,請註釋掉
	use epoll;
	worker_connections 65535;
}

http{
        # 指定被反向代理轉發的網址以及負載均衡後的IP+port
	upstream www.young.com {
		server 127.0.0.1:8881;
		server 127.0.0.1:8882;
		server 127.0.0.1:8883;
	}

	server{
		listen 80;
                 #指定虛擬主機的地址,通常是使用者訪問的網址
		server_name www.young.com;

		location / {
                         # 指定反向代理的網址
			proxy_pass http://www.young.com;
			proxy_set_header Host $host;
			proxy_set_header X-Real-Ip $remote_addr;
		}
	}
}

注意:需要在本機的hosts中新增"127.0.0.1 www.young.com"的網址對映。

注意事項

  • 在http的配置項中配置負載均衡策略,如果不寫,預設為輪詢模式
  • Nginx負載均衡支援http和https協議,只需要修改proxy_pass後協議即可。
  • Nginx支援FastCGI,SCGI,uwsgi,memcached的負載均衡,只需將proxy_pass改為fastcgi_pass,uwsgi_pass,scgi_pass,memcached_pass即可。
  • 輪詢策略適合伺服器配置相當,無狀態且短平快的服務使用
  1. 最少連線least_conn
    web請求會被轉發到連線數最少的伺服器上。它適合請求處理時間長短不一造成伺服器過載的情況。配置時需要在upstream中新增least_conn;即開啟此策略。

  2. IP地址雜湊
    上邊的兩種負載均衡方案中,同一客戶端連線的web請求可能會被分發到不同的後端伺服器進行處理,因此會涉及到會話session,因為不同伺服器的會話session是不一樣的,所以要想識別當前請求是否與上次會話為同一使用者,那麼需要將session會話儲存在Redis、memcached、MySQL等快取伺服器上去。而另外一種解決session一致的方法就是使用IP地址雜湊的分發方案,使同一使用者的請求一直被分發到同一伺服器。
    配置檔案中,在upstream中新增ip_hash的配置引數即開啟了此策略。
    注意事項

  • 它使用ip_hash指令定義
  • Nginx使用客戶端的ip地址進行雜湊計算,確保使用同一個伺服器響應請求。
  • 此策略適合有狀態服務,比如session。
  1. 基於權重的分發
    對不同的伺服器設定不同的權重,權重越高接收到的請求數量越多。配置檔案中,在upstream的每個server後邊新增weight=權重值即可。
    注意事項
  • 權重越高分配到需要處理的請求越多。
  • 它可以與最少連線負載和ip雜湊策略結合使用。
  • 它適合伺服器硬體配置差別比較大的情況。

關於Nginx具體的配置檔案的引數說明,請看下一節分散式系統系列--(三)Nginx配置檔案的相關引數說明