nginx正向代理html
nginx反向代理linux
1、nginx正向代理nginx
用戶和代理服務器在同一個內網環境中,組合成一體去訪問外面的WEBserver後端
Nginx正向代理使用場景並很少見。緩存
需求場景1:
若是在機房中,只有一臺機器能夠聯網,其餘機器只有內網,內網的機器想用使用yum安裝軟件包,在能能聯網的機器上配置一個正向代理便可。服務器
Nginx正向代理配置文件:cookie
還能夠加訪問控制等負載均衡
server { listen 80 default_server; #要把默認虛擬主機配置上,做爲正向代理,任何域名解析過來都要訪問到這個虛擬主機上才能夠 resolver 119.29.29.29; #DNS location / { proxy_pass http://$host$request_uri; } }
Nginx正向代理配置執行說明:異步
resolver測試
語法:resolver address; address爲DNS服務器的地址,國內通用的DNS 119.29.29.29爲dnspod公司提供。 國際通用DNS 8.8.8.8或者8.8.4.4爲google提供。 其餘能夠參考 http://dns.lisect.com/ 示例:resolver 119.29.29.29;
default_server
之因此要設置爲默認虛擬主機,是由於這樣就不用設置server_name了,任何域名解析過來均可以正常訪問。
proxy_pass
該指令用來設置要代理的目標url,正向代理服務器設置就保持該固定值便可。關於該指令的詳細解釋在反向代理配置中。$host->域名,$request_uri->要訪問的連接
2、nginx反向代理
Nginx反向代理在生產環境中使用不少的。最多的是負載均衡。
場景1:
域名沒有備案,能夠把域名解析到香港一臺雲主機上,在香港雲主機作個代理,而真正的網站數據是在大陸的服務器上。
示例1:
server { listen 80; server_name www.apelearn.com; #代理的域名 location / { proxy_pass http://47.104.7.242; #此ip爲源網站的ip,以下圖 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
配置說明:
1. proxy_pass
在正向代理中,已經使用過該指令。 格式很簡單: proxy_pass URL; 其中URL包含:傳輸協議(http://, https://等)、主機名(域名或者IP:PORT)、uri。
示例以下:
proxy_pass http://www.aminglinux.com/; proxy_pass http://192.168.200.101:8080/uri; proxy_pass unix:/tmp/www.sock;
對於proxy_pass的配置有幾種狀況須要注意。
示例2:
location /tobe/ { proxy_pass http://192.168.246.128; ... }
示例3:
location /tobe/ { proxy_pass http://192.168.246.128/; ... }
示例4:
location /tobe/ { proxy_pass http://192.168.246.128/linux/; ... }
示例5:
location /tobe/ { proxy_pass http://192.168.246.128/linux; ... }
假設server_name爲www.aminglinux.com
當請求http://www.aminglinux.com/tobe/a.html的時候,以上示例2-5分別訪問的結果是
示例2:http://192.168.246.128/tobe/a.html 示例3:http://192.168.246.128/a.html 示例4:http://192.168.246.128/linux/a.html 示例5:http://192.168.246.128/linuxa.html
2. proxy_set_header
proxy_set_header用來設定被代理服務器接收到的header信息。 語法:proxy_set_header field value; field爲要更改的項目,也能夠理解爲變量的名字,好比host,value爲變量的值 若是不設置proxy_set_header,則默認host的值爲proxy_pass後面跟的那個域名或者IP(通常寫IP), 好比示例4,請求到後端的服務器上時,完整請求uri爲:http://192.168.246.128/linux/a.html 若是設置proxy_set_header,如 proxy_set_header host $host; 好比示例4,請求到後端的服務器完整uri爲:http://www.aminglinux.com/linux/a.html proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 用來設置被代理端接收到的遠程客戶端IP,若是不設置,則header信息中並不會透傳遠程真實客戶端的IP地址。
能夠用以下示例來測試:
示例6(被代理端)
server{ listen 8080; server_name www.aminglinux.com; root /tmp/123.com_8080; index index.html; location /linux/ { echo "$host"; echo $remote_addr; echo $proxy_add_x_forwarded_for; } }
示例7(代理服務器上)
server { listen 80; server_name www.aminglinux.com; location /aming/ { proxy_pass http://192.168.1.10:8080/linux/; proxy_set_header host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
3. proxy_redirect
該指令用來修改被代理服務器返回的響應頭中的Location頭域和「refresh」頭域。 語法結構爲: proxy_redirect redirect replacement; proxy_redirect default; proxy_redirect off;
示例8:
server { listen 80; server_name www.aminglinux.com; index index.html; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
當請求的連接爲 http://www.aminglinux.com/aming
結果會返回301,定向到了 http://www.aminglinux.com:8080/aming/
注意:返回301有幾個先決條件
1. location後面必須是/; 2. proxy_pass後面的URL不能加uri,只能是IP或者IP:port結尾,並不能以/結尾; 3. 訪問的uri必須是一個真實存在的目錄,如,這裏的aming必須是存在的 4. 訪問的時候,不能以/結尾,只能是 www.aminglinux.com/aming
雖然,這4個條件挺苛刻,但確實會遇到相似的請求。解決方法是,加一行proxy_redirect http://$host:8080/ /;
示例9:
server { listen 80; server_name www.aminglinux.com; index index.html; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header host $host; proxy_redirect http://$host:8080/ /; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
兩個都是nginx代理中內存設置相關的參數。
proxy_buffering設置
proxy_buffering主要是實現被代理服務器的數據和客戶端的請求異步。 爲了方便理解,咱們定義三個角色,A爲客戶端,B爲代理服務器,C爲被代理服務器。 當proxy_buffering開啓,A發起請求到B,B再到C,C反饋的數據先到B的buffer上, 而後B會根據proxy_busy_buffer_size來決定何時開始把數據傳輸給A。在此過程當中,若是全部的buffer被寫滿, 數據將會寫入到temp_file中。 相反,若是proxy_buffering關閉,C反饋的數據實時地經過B傳輸給A。
如下配置,都是針對每個http請求的。
1. proxy_buffering on; 該參數設置是否開啓proxy的buffer功能,參數的值爲on或者off。 若是這個設置爲off,那麼proxy_buffers和proxy_busy_buffers_size這兩個指令將會失效。 可是不管proxy_buffering是否開啓,proxy_buffer_size都是生效的 2. proxy_buffer_size 4k; 該參數用來設置一個特殊的buffer大小的。 從被代理服務器(C)上獲取到的第一部分響應數據內容到代理服務器(B)上,一般是header,就存到了這個buffer中。 若是該參數設置過小,會出現502錯誤碼,這是由於這部分buffer不夠存儲header信息。建議設置爲4k。 3. proxy_buffers 8 4k; 這個參數設置存儲被代理服務器上的數據所佔用的buffer的個數和每一個buffer的大小。 全部buffer的大小爲這兩個數字的乘積。 4. proxy_busy_buffer_size 16k; 在全部的buffer裏,咱們須要規定一部分buffer把本身存的數據傳給A,這部分buffer就叫作busy_buffer。 proxy_busy_buffer_size參數用來設置處於busy狀態的buffer有多大。 對於B上buffer裏的數據什麼時候傳輸給A,我我的的理解是這樣的: 1)若是完整數據大小小於busy_buffer大小,當數據傳輸完成後,立刻傳給A; 2)若是完整數據大小很多於busy_buffer大小,則裝滿busy_buffer後,立刻傳給A; 5. proxy_temp_path 語法:proxy_temp_path path [level1 level2 level3] 定義proxy的臨時文件存在目錄以及目錄的層級。 例:proxy_temp_path /usr/local/nginx/proxy_temp 1 2; 其中/usr/local/nginx/proxy_temp爲臨時文件所在目錄,1表示層級1的目錄名爲一個數字(0-9),2表示層級2目錄名爲2個數字(00-99) 6. proxy_max_temp_file_size 設置臨時文件的總大小,例如 proxy_max_temp_file_size 100M; 7. proxy_temp_file_wirte_size 設置同時寫入臨時文件的數據量的總大小。一般設置爲8k或者16k。
proxy_buffer示例
server { listen 80; server_name www.aminglinux.com; proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 2 4k; proxy_busy_buffers_size 4k; proxy_temp_path /tmp/nginx_proxy_tmp 1 2; proxy_max_temp_file_size 20M; proxy_temp_file_write_size 8k; location / { proxy_pass http://192.168.10.110:8080/; 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_cache設置
proxy_cache將從C上獲取到的數據根據預設規則存放到B上(內存+磁盤)留着備用, A請求B時,B會把緩存的這些數據直接給A,而不須要再去向C去獲取。 proxy_cache相關功能生效的前提是,須要設置proxy_buffering on;
proxy_cache主要參數
1. proxy_cache 語法:proxy_cache zone|off 默認爲off,即關閉proxy_cache功能,zone爲用於存放緩存的內存區域名稱。 例:proxy_cache my_zone; 從nginx 0.7.66版本開始,proxy_cache機制開啓後會檢測被代理端的HTTP響應頭中的"Cache-Control"、"Expire"頭域。 如,Cache-Control爲no-cache時,是不會緩存數據的。 2. proxy_cache_bypass 語法:proxy_cache_bypass string; 該參數設定,什麼狀況下的請求不讀取cache而是直接從後端的服務器上獲取資源。 這裏的string一般爲nginx的一些變量。 例:proxy_cahce_bypass $cookie_nocache $arg_nocache$arg_comment; 意思是,若是$cookie_nocache $arg_nocache$arg_comment這些變量的值只要任何一個不爲0或者不爲空時, 則響應數據不從cache中獲取,而是直接從後端的服務器上獲取。 3. proxy_no_cache 語法:proxy_no_cache string; 該參數和proxy_cache_bypass相似,用來設定什麼狀況下不緩存。 例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment; 表示,若是$cookie_nocache $arg_nocache $arg_comment的值只要有一項不爲0或者不爲空時,不緩存數據。 4. proxy_cache_key 語法:proxy_cache_key string; 定義cache key,如: proxy_cache_key $scheme$proxy_host$uri$is_args$args; (該值爲默認值,通常不用設置) 5. proxy_cache_path 語法:proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] path設置緩存數據存放的路徑; levels設置目錄層級,如levels=1:2,表示有兩級子目錄,第一個目錄名取md5值的倒數第一個值,第二個目錄名取md5值的第2和3個值。以下圖:
keys_zone設置內存zone的名字和大小,如keys_zone=my_zone:10m inactive設置緩存多長時間就失效,當硬盤上的緩存數據在該時間段內沒有被訪問過,就會失效了,該數據就會被刪除,默認爲10s。 max_size設置硬盤中最多能夠緩存多少數據,當到達該數值時,nginx會刪除最少訪問的數據。 例:proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g
proxy_cache示例
http { ...; proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g; #放到http中 ...; server { listen 80; server_name www.aminglinux.com; proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 2 4k; proxy_busy_buffers_size 4k; proxy_temp_path /tmp/nginx_proxy_tmp 1 2; proxy_max_temp_file_size 20M; proxy_temp_file_write_size 8k; location / { proxy_cache my_zone; proxy_pass http://192.168.10.110:8080/; 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_cache_path那一行。