今天在配置一個location的時候,但願使用一個變量如$host來指示nginx代理:nginx
- location /test/
- {
- proxy_pass http:
- }
如你想不到,這個配置是不能使用的,查看error.log,打出來的信息也沒法幫助解決問題。
但相同狀況下,root標籤就工做得很好:web
- locatin /test/
- {
- root /dev/shm/$host;
- }
使人匪夷所思,估計這是nginx的一個bug,或者是一個攪不清的邏輯?
把上面的錯誤配置改爲正則表達式
- location /test/
- {
- proxy_pass http:
- }
或者apache
- set $vhost "test.sudone.com";
- location /test/
- {
- proxy_pass http:
- }
等等,都不能解決問題,最後是用了個奇怪的配置方式,竟然能工做……後端
- location /test/ {
- proxy_pass http:
- proxy_set_header Host $host;
- }
這個配置就能工做正常,但上面這個配置只支持單ip的後端,能不能支持upstream呢?
再改一下測測服務器
- upstream backend.sudone.com
- {
- server 127.0.0.1:80;
- }
- location /test/
- {
- proxy_pass http:
- proxy_set_header Host $host;#$host=test.sudone.com;
- }
嗯?能用!
有了這個辦法,我便不用在數十個主機配置內把/test/這個location貼上數十次,另外,它也能夠支持這樣的寫法:fetch
- location /test/
- {
- proxy_pass http:
- proxy_set_header Host fetch.$host;
- }
還能夠用正則表達式對host進行匹配:spa
- set $vhost $host;
- if ($host ~* "([^\.]+)\.92csz\.com")
- {
- set $vhost $1.92csz.com;
- }
- location /test/
- {
- proxy_pass http:
- proxy_set_header Host fetch.$host;
- }
可用的方面就廣了。代理
---------------------------------------------------server
補充:
在這個配置裏,個人nginx代理的後端(backend)也是nginx,目前尚不清楚其它的web服務器如apache等是否能在這樣的配置下工做正常。