講述反向七層代理的配置文件以及解釋
Nginx官網:https://www.nginx.com/
Centos yum安裝nginx
yum install nginx -y
so,我們先提個問題,What?爲何要用Nginx實現七層代理,什麼是七層代理?
1、有無nginx proxy的區別
傳統無nginx web架構:
看下面一張圖:
首先,我們有一個域名 www.test_app.com,後端有三臺服務器,都運行PHP+Nginx服務,如果要實現三臺服務器都提供網站服務,我們需要具備下面幾個條件(缺點)。
1、每臺web服務器都需要有固定的公網IP地址(成本高)
2、一個域名需要對應多個公網IP(擴展性差)
3、每添加一臺web服務器都需要動用dns配置以及購買固定公網IP(靈活性差)
so,缺點很明顯了
nginx proxy架構:
這時,我們在前端部署一臺nginx proxy(反向代理),就可以解決剛纔上面所說的問題,可以在nginx proxy配置proxy pool,稱爲代理池,裏面填寫後端web節點的IP:PORT,每次擴展一臺Web節點的時候,只需要在該proxy pool中添加IP:PORT,然後在reload一下nginx即可,並且該nginx proxy只需要有一個固定的公網IP即可,DNS只需要綁定該公網IP
2、Nginx Proxy簡介
Nginx的負載均衡功能依賴於ngx_http_upsteam_module模塊,所支持的代理方式包括proxy_pass,fastcgi_pass,memcached_pass等,新版Nginx軟件支持的方式有所增加。本文主要講解proxy_pass代理方式。
ngx_http_upstream_module模塊允許Nginx定義一組或多組節點服務器組,使用時可以通過proxy_pass代理方式把網站的請求發送到事先定義好的對應Upstream組的名字上,具體寫法爲“proxy_pass http:// www_server_pools”,其中www_server_pools就是一個Upstream節點服務器組名字。
upstream模塊內部server標籤部分參數說明:
模塊參數 | 說明 |
---|---|
server | 負載均衡後面的RS地址,可域名或IP |
weight | 服務器權重,權重數字越大表示請求越多,默認爲1 |
max_fils | 嘗試連接後端節點失敗的次數,默認爲1 |
backup | 表示節點作爲備份服務器 |
fail_timeout | 在max_fails定義次數失敗後,距離下次檢查間隔時間 |
3、Nginx Proxy調度算法
靜態調度算法:
算法 | 說明 |
---|---|
rr | 輪詢,默認調度算法,將請求按順序分配到不同的後端節點 |
wrr | 權重輪詢,權重值越大,後端節點接受的請求也就越多 |
ip_hash | 會話保持,每個請求按照客戶端的IP的Hash結果來分配後端節點 |
動態調度算法:
算法 | 說明 |
---|---|
fair | 響應時間,根據後端節點的響應時間來分配請求 |
least_conn | 最小連接數,根據後端節點的連接數來分配請求 |
url_hash | web緩存節點,根據訪問的URL的hash結果來分配請求 |
注意調度算法只能使用一種
nginx proxy常見配置文件(多域名):
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 這是代理池,池子名:blog_server_pools,將web節點的IP:PORT/域名 添加到此即可
upstream blog_server_pools {
server 172.16.1.7:80 weight=3 max_fils=3 fail_timeout=5;
server 172.16.1.8:80 weight=2 max_fils=3 fail_timeout=5;
server 172.16.1.9:80 weight=1 backup max_fils=3 fail_timeout=5;
}
upstream www_server_pools {
# 使用調度算法:ip_hash
ip_hash
server 172.16.1.10:80 max_fils=3 fail_timeout=5;
server 172.16.1.11:80 max_fils=3 fail_timeout=5;
server 172.16.1.12:80 weight=1 backup max_fils=3 fail_timeout=5;
}
server {
listen 80;
server_name blog.youngboy.org;
location / {
# 通過proxy_pass 調用對應的代理池
proxy_pass http://blog_server_pools;
# proxy優化參數(下面有解釋)
proxy_redirect default;
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_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
}
}
server {
listen 80;
server_name www.youngboy.org;
location / {
proxy_pass http://www_server_pools;
proxy_redirect default;
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_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
}
}
}
我們會發現。每添加一個server標籤(一個站點),都需要將nginx proxy參數粘貼一遍,這樣會導致配置冗餘
我們可以將proxy優化參數配置寫到一個文件中
# vim /etc/nginx/conf.d/http.proxy
proxy_redirect default;
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_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
在nginx http標籤下,使用include來引入剛剛創建的proxy文件
....
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/http.proxy;
....
}
平滑重啓nginx
nginx -s reload
4、Nginx Proxy優化參數
# 設置http請求header項傳給後端服務器節點
proxy_set_header
# 用於指定客戶端請求主體緩衝區大小
client_body_buffer_size
# 表示反向代理與後端節點服務器連接的超時時間,即發起握手等待響應的超時時間
proxy_connect_timeout
# 表示代理後端服務器的數據回傳時間,即在規定時間內服務器必須傳完所有的數據,否則,Nginx將斷開這個連接
proxy_sed_simeout
# 設置Nginx從從代理的後端服務器獲取信息的時間,表示連接建立成功後,Nginx等待後端服務器的響應時間,其實是Nginx已經進入後端的派對之中等候處理的時間
proxy_read_timeout
# 設置緩衝區大小,默認該緩衝區大小等於指令proxy_buffers設置的大小
proxy_buffer_size
# 設置緩衝區的數量和大小。Nginx從代理後端的服務器獲取的響應信息,會防止緩衝區
proxy_buffers
# 用於設置系統很忙時可以使用的proxy_buffers大小,官方推薦的大小爲proxy_buffers*2
proxy_busy_buffers_size
# 指定proxy緩存臨時文件的大小
proxy_temp_file_write_size