Nginx
文件不存在時代理到“後端”服務
我正在使用 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; } }