Nginx學習筆記——場景實踐之《代理服務》
代理服務
Nginx可以做【HTTP、HTTPS】、【ICMP、POP、IMAP】郵件、【RTMP】流媒體的代理。
正向代理
比如:公司內只有一臺電腦可以連入公網,所有的計算機一個代理,通過這臺計算機(代理)都可以連入公網。
反向代理
比如:一個客戶端請求一個網站,往往請求的是代理,通過代理給你分配一個伺服器,讓你訪問。
正反向的區別
正向代理代理的物件是客戶端。 反向代理代理的物件是服務端。
反向代理
配置語法
通過該代理,在通過代理訪問
Syntax:proxy_pass URL; Default:預設無 Context:location,if in location,limit_expect
URL寫法
(1)HTTP,http://localhost:8000/uri/
(2)HTTPS,https://localhost:8000/uri/
(3)Socket的方式(Linux下程序間通訊的方式),http://unix:/tmp/backend.socket:/uri/;
測試
在/etc/nginx/conf.d/
中配置如下兩個配置檔案:
realserver.conf
server { listen 8080; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { allow 127.0.0.1; deny all; root /opt/app/code2; index index.html index.htm; } #....... }
注:該檔案配置了8080埠,並使用allow與deny配置成伺服器私有訪問(模擬伺服器內網)。 fx_proxy.conf
server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } location ~ /test_proxy.html$ { proxy_pass http://127.0.0.1:8080; } #....... }
注:該配置配置了公網的80埠,並對test_proxy.html
設定了代理訪問內網8080埠。
效果
訪問http://192.168.174.132:8080/test_proxy.html
,顯示404找不到頁面。
訪問http://192.168.174.132/test_proxy.html
,預設是80埠,跳轉到指定頁面,但對於客戶端來說,訪問的連結(IP)還是80埠的,即對客戶是透明的,所以反向代理是服務於伺服器。
正向代理
配置語法
與反向代理一樣。
測試
在/opt/app/code
,新建shen.html,用於測試。
在/etc/nginx/conf.d/
中配置如下兩個配置檔案:
admin.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
if ( $http_x_fowwarded_for !~* "^192\.168\.174\.132") {
return 403;
}
root /opt/app/code;
index index.html index.htm;
}
#...
}
注:132為Nginx的IP,此處篩選非本機訪問均拒絕。 zx_proxy.conf
server {
listen 8081;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://$http_host$request_uri;
}
#....
}
注:此處配置正向代理,埠為8081,模擬代理伺服器,訪問的請求均通過代理伺服器訪問。
效果
宿主機IP192.168.174.1,直接訪問http://192.168.174.132/shen.html
,顯示403禁止訪問。
宿主機,設定HTTP代理(192.168.174.132,埠8081),訪問http://192.168.174.132/shen.html
成功。
即正向代理為客戶端服務,對伺服器透明。
代理配置語法補充
緩衝區
儘可能接收多的資訊,再返回給客戶端,減少IO操作。
Syntax:proxy_buffering on | off;
Default:proxy_buffering on;
Context:http,server,location
擴充套件:proxy_buffer_size、proxy_buffers、proxy_busy_buffers_size
跳轉重定向
Nginx作為代理伺服器,返回301,重定向到另外一個地址,返回給客戶端。預設即可。
Syntax:proxy_redirect default(預設);
proxy_redict off(關閉);proxy_redirect redirect replacement(對301地址修改);
Default:proxy_redirect default;
Context:http,server,location
頭資訊
代理訪問時,設定的頭資訊(如,訪問控制章節的remote_addr,伺服器是獲取不到客戶端IP的,可通過頭資訊去一步一步設定,再獲取)。
Syntax:proxy_set_header field value;
Default:proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context:http,server,location
擴充套件:proxy_hide_header、proxy_set_body
超時
作為代理,到後端的一個超時。
Syntax:proxy_connect_timeout time;
Default:proxy_connect_timeout 60s;
Context:http,server,location
擴充套件:proxy_read_timeout(已經建立連線,Nginx與後端互動,讀超過time,則超時)、proxy_send_timeout(接收資訊,傳送給客戶端的超時)
常用代理配置和規範
proxy_pass http://127.0.0.1:8080;(反向代理)
proxy_redirect default;(重定向,301,預設配置)
proxy_set_header Host $http_host;(頭資訊,HOST)
proxy_set_header X-Real-IP $remote_addr;(真實IP,remote_addr)
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;(優先記憶體)
proxy_max_temp_file_size 256k;(臨時檔案,記憶體置換)(--http-proxy-temp-path=/var/cache/nginx/proxy_temp)
配置太多且通用的情況,可以使用檔案存放,如proxy_params,使用include filename;
進行包含。