Maxim Dounin Wrote:
-------------------------------------------------------
> Errors suggest you don't have $backend set, and
> resulting
> proxy_pass tries to go to "http://" which is
> invalid.
Yup, I am just curious how to accomplish that if you want to perform some rewriting before, for example to strip off some leading parts of the URL path. I came up with following test case:
worker_processes 3;
events {
worker_connections 1024;
}
http {
server_tokens off;
include nginx.mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 15;
server {
listen 0.0.0.0:90;
server_name _;
location / {
root html;
index index.html;
}
}
server {
listen 0.0.0.0:91;
server_name _;
location / {
rewrite ^/foo/(.*)$ /$1 break;
proxy_pass http://localhost:90;
proxy_redirect off;
}
}
server {
listen 0.0.0.0:92;
server_name _;
location / {
rewrite ^/foo/(.*)$ /$1 break;
resolver 127.0.0.1;
set $backend "localhost:90";
proxy_pass http://$backend;
proxy_redirect off;
}
error_log /var/log/nginx/error.log debug;
}
}
The port 91 server is a reverse proxy to the port 90 server with static upstream (DNS lookup only on startup/reload). I delivers happily the index.html of the port 90 server, regardless if I request http://localhost:91/ of http://localhost:91/foo/.
Bringing the resolver into play doesn't seem to be that straight forward if you look at the port 92 reverse proxy. It works when no rewriting has to be performed, i.e., http://localhost:92/ works. But if I want to strip off the leading /foo/ URL path segment of the request http://localhost:92/foo/.
2011/09/28 17:55:51 [notice] 1490#0: *2 "^/foo/(.*)$" matches "/foo/", client: 127.0.0.1, server: _, request: "GET /foo/ HTTP/1.1", host: "localhost:92"
2011/09/28 17:55:51 [notice] 1490#0: *2 rewritten data: "/", args: "", client: 127.0.0.1, server: _, request: "GET /foo/ HTTP/1.1", host: "localhost:92"
2011/09/28 17:55:51 [warn] 1490#0: *2 using uninitialized "backend" variable, client: 127.0.0.1, server: _, request: "GET /foo/ HTTP/1.1", host: "localhost:92"
2011/09/28 17:55:51 [error] 1490#0: *2 invalid URL prefix in "http://", client: 127.0.0.1, server: _, request: "GET /foo/ HTTP/1.1", host: "localhost:92"
Any hints how to solve this the easiest way? Basically me requirement is to reverse proxy http://proxy.example.com/foo/bar/quux to http://upstream.example.com/bar/quux (so strip off "foo/") while the IP of upstream.example.com can change over time without prior announcement.