Nginx

文件不存在時代理到“後端”服務

  • January 23, 2012

我正在使用 NGINX 來提供靜態文件。

每當文件不存在時,我希望 NGINX 訪問 nodejs 後端服務,該服務將嘗試非同步檢索該文件。

後端服務需要 3 個參數:GUID、文件的大小副檔名。所有這些參數都是使用正則表達式從原始請求中檢索的。

這是我目前的 NGINX 配置文件:

server {
 listen 80;
 server_name .example.com;
 root /var/www;

 ## Serves file (matching pattern: /<size>/<MEDIA>/<file na-me><.ext>)
 location / {
   location ~* ^/(\d+x\d+)/(([\w])([\w])([\w])[-\w]+)/[^\.]+\.(\w+)$ {
     try_files /$3/$4/$5/$2/$1.$6 @backend/$2/$1/$6;
   }
 }

 ## backend service
 location @backend {
   proxy_pass http://127.0.0.1:8080;
 }
}

但我不斷收到此錯誤:

2012/01/23 11:53:31 [error] 28354#0: *1 could not find named location "@backend/ed3269d1-f9ef-4Ffc-dbea-5982969846c0/200x240/jpg", client: XXX.XXX.XXX.XXX, server: example.com, request: "GET /200x240/ed3269d1-f9ef-4Ffc-dbea-5982969846c0/my%20fil.jpg HTTP/1.1", host: "3.example.com"

知道如何讓 NGINX 將請求“代理”到後端服務而不是查找文件嗎?

如果您對擷取使用命名擷取,則可以使用它們在您的命名位置重寫請求:

server {
 listen 80;
 server_name .example.com;
 root /var/www;

 ## Serves file (matching pattern: /<size>/<MEDIA>/<file na-me><.ext>)
 location / {
   ## ?<name> assigns the capture to variable $name
   location ~* ^/(?<size>\d+x\d+)/(?<guid>([\w])([\w])([\w])[-\w]+)/[^\.]+\.(?<ext>\w+)$ {
     try_files /$3/$4/$5/$2/$1.$6 @backend;
   }
 }

 ## backend service
 location @backend {
   ## rewrite ... break; just sets $uri and doesn't perform a redirect.
   rewrite ^ /$guid/$size/$ext break;
   proxy_pass http://127.0.0.1:8080;
 }
}

引用自:https://serverfault.com/questions/352669