一、proxy_pass的nginx官方指南
nginx中有兩個模塊都有proxy_pass指令。
ngx_http_proxy_module的proxy_pass:
語法:?proxy_pass?URL; 場景:?location,?if?in?location,?limit_except 說明:?設置后端代理服務器的?協議(protocol)和地址(address),以及location中可以匹配的一個可選的URI。協議可以是"http"或"https"。地址可以是一個域名或ip地址和端口,或者一個?unix-domain?socket?路徑。?? 詳見官方文檔:?http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_passURI的匹配,本文第四部分?重點討論。
ngx_stream_proxy_module的proxy_pass:
語法:?proxy_pass?address; 場景:?server 說明:?設置后端代理服務器的地址。這個地址(address)可以是一個域名或ip地址和端口,或者一個?unix-domain?socket路徑。?? 詳見官方文檔:?http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_pass
二、兩個proxy_pass的關系和區別
在兩個模塊中,兩個proxy_pass都是用來做后端代理的指令。
ngx_stream_proxy_module模塊的proxy_pass指令只能在server段使用使用, 只需要提供域名或ip地址和端口。可以理解為端口轉發,可以是tcp端口,也可以是udp端口。
ngx_http_proxy_module模塊的proxy_pass指令需要在location段,location中的if段,limit_except段中使用,處理需要提供域名或ip地址和端口外,還需要提供協議,如”http”或”https”,還有一個可選的uri可以配置。
三、proxy_pass的具體用法
ngx_stream_proxy_module模塊的proxy_pass指令
server?{ ???listen?127.0.0.1:12345; ???proxy_pass?127.0.0.1:8080; } server?{ ???listen?12345; ???proxy_connect_timeout?1s; ???proxy_timeout?1m; ???proxy_pass?example.com:12345; } server?{ ???listen?53?udp; ???proxy_responses?1; ???proxy_timeout?20s; ???proxy_pass?dns.example.com:53; } server?{ ???listen?[::1]:12345; ???proxy_pass?unix:/tmp/stream.socket; }
ngx_http_proxy_module模塊的proxy_pass指令
server?{ ???listen??????80; ???server_name?www.test.com; ???#?正常代理,不修改后端url的???location?/some/path/?{ ???????proxy_pass?http://127.0.0.1; ???} ???#?修改后端url地址的代理(本例后端地址中,最后帶了一個斜線)???location?/testb?{ ???????proxy_pass?http://www.other.com:8801/; ???} ???#?使用?if?in?location???location?/google?{ ???????if?(?$geoip_country_code?~?(RU|CN)?)?{ ???????????proxy_pass?http://www.google.hk; ???????} ???} ???location?/yongfu/?{ ???????#?沒有匹配?limit_except?的,代理到?unix:/tmp/backend.socket:/uri/???????proxy_pass?http://unix:/tmp/backend.socket:/uri/;; ???????#?匹配到請求方法為:?PUT?or?DELETE,?代理到9080???????limit_except?PUT?DELETE?{ ???????????proxy_pass?http://127.0.0.1:9080; ???????} ???} }
四、proxy_pass后,后端服務器的url(request_uri)情況分析
server?{ ???listen??????80; ???server_name?www.test.com; ???#?情形A???#?訪問?http://www.test.com/testa/aaaa???#?后端的request_uri為:?/testa/aaaa???location?^~?/testa/?{ ???????proxy_pass?http://127.0.0.1:8801; ???} ??? ???#?情形B???#?訪問?http://www.test.com/testb/bbbb???#?后端的request_uri為:?/bbbb???location?^~?/testb/?{ ???????proxy_pass?http://127.0.0.1:8801/; ???} ???#?情形C???#?下面這段location是正確的???location?~?/testc?{ ???????proxy_pass?http://127.0.0.1:8801; ???} ???#?情形D???#?下面這段location是錯誤的???#???#?nginx?-t?時,會報如下錯誤:???#???#?nginx:?[emerg]?"proxy_pass"?cannot?have?URI?part?in?location?given?by?regular???#?expression,?or?inside?named?location,?or?inside?"if"?statement,?or?inside???#?"limit_except"?block?in?/opt/app/nginx/conf/vhost/test.conf:17???#???#?當location為正則表達式時,proxy_pass?不能包含URI部分。本例中包含了"/"???location?~?/testd?{ ???????proxy_pass?http://127.0.0.1:8801/;???#?記住,location為正則表達式時,不能這樣寫!!!???} ???#?情形E???#?訪問?http://www.test.com/ccc/bbbb???#?后端的request_uri為:?/aaa/ccc/bbbb???location?/ccc/?{ ???????proxy_pass?http://127.0.0.1:8801/aaa$request_uri; ???} ???#?情形F???#?訪問?http://www.test.com/namea/ddd???#?后端的request_uri為:?/yongfu?namea=ddd???location?/namea/?{ ???????rewrite????/namea/([^/]+)?/yongfu?namea=$1?break; ???????proxy_pass?http://127.0.0.1:8801; ???} ???#?情形G???#?訪問?http://www.test.com/nameb/eee???#?后端的request_uri為:?/yongfu?nameb=eee???location?/nameb/?{ ???????rewrite????/nameb/([^/]+)?/yongfu?nameb=$1?break; ???????proxy_pass?http://127.0.0.1:8801/; ???} ???access_log?/data/logs/www/www.test.com.log; } server?{ ???listen??????8801; ???server_name?www.test.com; ??? ???root????????/data/www/test; ???index???????index.php?index.html; ???rewrite?^(.*)$?/test.php?u=$1?last; ???location?~?.php$?{ ???????try_files?$uri?=404; ???????fastcgi_pass?unix:/tmp/php-cgi.sock; ???????fastcgi_index?index.php; ???????include?fastcgi.conf; ???} ???access_log?/data/logs/www/www.test.com.8801.log; }
文件: /data/www/test/test.php
echo?'$_SERVER[REQUEST_URI]:'?.?$_SERVER['REQUEST_URI'];
通過查看 $_SERVER[‘REQUEST_URI’] 的值,我們可以看到每次請求的后端的request_uri的值,進行驗證。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END