nginx正向代理
proxy/pic.md - master - 代碼瀏覽 - nginx - aminglinux https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/pic.md?public=true
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/z_proxy.md?public=true
默認配置文件改名
測試
可以正常訪問
解析到本機
關閉文件改名後
nginx反向代理
代碼瀏覽 - nginx - aminglinux https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/f_proxy.md?public=true
添加8080虛擬機
創建目錄
測試
通過IP地址訪問
結果
去掉proxy
1在沒有設置 proxy_set_header Host $host的前提下 當 proxy_pass 後面跟的是什麼它就會訪問什麼 http://127.0.0.1:8080;
2設置 proxy_set_header Host $host 後就會 訪問server_name 後面跟的域名www.test.com 指定的IP地址是http://127.0.0.1:8080;
server_name www.apelearn.com;跟要訪問的域名
proxy_pass http://123.23.13.11/; // 填原站的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;
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/f_proxy.md?public=true
示例1新建文件
最終訪問到一個後端虛擬主機
加入日誌
IP後去掉斜杆
加入/Linux/
linux 不加跟號
結論:不管什麼情況下都要加根號
$remote_addr;和 $proxy_add_x_forwarded_for; 屬於nginx的內置變量
$remote_addr;是遠程客戶端的地址
$proxy_add_x_forwarded_for;會記錄遠程客戶端的地址和真實的IP地址
測試:
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反向代理-buffer
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/bu_ca.md
nginx的proxy_buffering和proxy_cache
兩個都是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;
...;
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那一行。
未生成文件可能權限不夠