一、nginx反向代理實現負載均衡
Nginx可以配置代理多臺服務器,當一臺服務器宕機之後,仍能保持系統可用(我現在是通過ip + 端口號進行學習)。
用Nginx做反向代理和負載均衡非常簡單,支持兩種用法:一個是proxy、另外一種是upstream,分別用來做反向代理和負載均衡。
流程也很簡單:
1 先客戶端發起請求到Nginx,Nginx會解析你請求地址是否需要轉發到其他地方處理
2 如果需要則通過proxy_pass進行轉發到相對應處理到地址。(處理的地址可能是不同的服務器、或者其他服務)
3 最後進行完成返回結果
具體配置過程如下:
1. 在http節點下,添加upstream節點。
#第一個集羣
upstream test1.com{
server 47.106.139.191:8082 weight=100;
server 47.106.139.191:8083 weight=200;
}
2.將server節點下的location節點中的proxy_pass配置爲:http:// + upstream名稱,即“http://test1.com”.
#符合gif後綴結尾的都會被分流到test1.com中
location ~* \.(gif)$ {
proxy_pass http://test1.com;
}
- 備註:我們默認的只是開通了服務器的80端口,8082,8083(我用的是阿里雲服務器,事先需要開啓防火牆)還沒有開通呢,所以下面羅列出http和server服務的代碼
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_80.log;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#第一個集羣
upstream test1.com{
server 47.106.139.191:8082 weight=100;
server 47.106.139.191:8083 weight=200;
}
#第二個集羣
upstream test2.com{
server 47.106.139.191:8084;
}
#第三個集羣
upstream test3.com{
server 47.106.139.191:8085;
}
server {
listen 80;
server_name sunjunxiain.top;
location / {
root html;
index index.html index.htm;
}
#第一集羣
location ~* \.(gif)$ {
proxy_pass http://test1.com;
}
#第二集羣
location ~* \.(png)$ {
proxy_pass http://test2.com;
}
#第三集羣
location ~* \.(jpg)$ {
proxy_pass http://test3.com;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
server {
listen 8082;
listen 8083;
server_name sunjunxian.top;
location / {
root html;
index index.html index.htm;
}
access_log logs/access_82_83.log;
}
server {
listen 8084;
listen 8085;
server_name sunjunxian.top;
location / {
root html;
index index.html index.htm;
}
access_log logs/access_84_85.log;
}
}
二、負載均衡的幾種常用方式
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。
#第一個集羣
upstream test1.com{
server 47.106.139.191;
server 47.106.139.192;
}
2、weight(權重)
指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的
情況。
upstream test1.com{
server 47.106.139.191:8082 weight=100;
server 47.106.139.191:8083 weight=200;
}
3、ip_hash
權重方式存在一個問題,在負載均衡系統中,假如用戶在某臺服務器上登錄了,那麼該用戶第二次請求的時候,因爲我們是負載均衡系統,每次請求都會重新定位到服務器集羣中的某一個,那麼已經登錄某一個服務器的用戶再重新定位到另一個服務器,其登錄信息將會丟失,這樣顯然是不妥的。
我們可以採用ip_hash指令解決這個問題,如果客戶已經訪問了某個服務器,當用戶再次訪問時,會將該請求通過哈希算法,自動定位到該服務器。
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
upstream test1.com{
ip_hash;
server 47.106.139.191:8082;
server 47.106.139.191:8083;
}
4、fair(第三方)
upstream test1.com{
server 47.106.139.191;
server 47.106.139.192;
fair;
}