nginx的proxy_pass到$host的問題

今天在配置一個location的時候,但願使用一個變量如$host來指示nginx代理:nginx

  1. location /test/
  2. {
  3. proxy_pass http://$host;
  4. }

如你想不到,這個配置是不能使用的,查看error.log,打出來的信息也沒法幫助解決問題。
但相同狀況下,root標籤就工做得很好:web

  1. locatin /test/
  2. {
  3. root /dev/shm/$host;
  4. }

使人匪夷所思,估計這是nginx的一個bug,或者是一個攪不清的邏輯?
把上面的錯誤配置改爲
正則表達式

  1. location /test/
  2. {
  3. proxy_pass http://$host/;
  4. }

或者apache

  1. set $vhost "test.sudone.com";
  2. location /test/
  3. {
  4. proxy_pass http://$vhost;
  5. }

等等,都不能解決問題,最後是用了個奇怪的配置方式,竟然能工做……後端

  1. location /test/ {
  2. proxy_pass http://127.0.0.1:80;
  3. proxy_set_header Host $host;
  4. }

這個配置就能工做正常,但上面這個配置只支持單ip的後端,能不能支持upstream呢?
再改一下測測服務器

  1. upstream backend.sudone.com
  2. {
  3. server 127.0.0.1:80;
  4. }
  1. location /test/
  2. {
  3. proxy_pass http://backend.sudone.com;#固定寫的後端upstream
  4. proxy_set_header Host $host;#$host=test.sudone.com;
  5. }

嗯?能用!
有了這個辦法,我便不用在數十個主機配置內把/test/這個location貼上數十次,另外,它也能夠支持這樣的寫法:fetch

  1. location /test/
  2. {
  3. proxy_pass http://127.0.0.1:80;
  4. proxy_set_header Host fetch.$host;
  5. }

還能夠用正則表達式對host進行匹配:spa

  1. set $vhost $host;
  2. if ($host ~* "([^\.]+)\.92csz\.com")
  3. {
  4. set $vhost $1.92csz.com;
  5. }
  6. location /test/
  7. {
  8. proxy_pass http://127.0.0.1:80;
  9. proxy_set_header Host fetch.$host;
  10. }

可用的方面就廣了。代理

---------------------------------------------------server

補充:

在這個配置裏,個人nginx代理的後端(backend)也是nginx,目前尚不清楚其它的web服務器如apache等是否能在這樣的配置下工做正常。

相關文章
相關標籤/搜索