我正在尝试使用基于URL的Nginx进行反向代理。 我希望http://mydomain.example.com/client1/...
被redirect到http://127.0.0.1:8193/...
我尝试了很多方法,而且都没有工作。 请注意,该应用程序可以redirect。 这些是我最后解决scheme的configuration文件:
server { listen 80; server_name mydomain.example.com; location / { set $instance none; if ($request_uri ~ ^/(.*)/$) { set $instance $1; } set $no_cookie true; if ($http_cookie ~ "instance=([^;] +)(?:;|$)") { set $instance $1; set $no_cookie false; } if ($no_cookie = true) { add_header Set-Cookie "instance=$instance;Domain=$host;Path=/"; rewrite ^ / break; } include instances.conf; }
proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 90; proxy_send_timeout 60; # Installation of language packs, etc. can take a long time proxy_read_timeout 10800; if ($instance = client1) { proxy_pass http://127.0.0.1:8193; } if ($instance = client2) { proxy_pass http://127.0.0.1:8194 } ...
当浏览器请求http://mydomain.example.com/client1/
,Nginx应该设置一个名为instance
的cookie,其值为client1
然后将stream量redirect到相应的代理。 对于后续的查询,它应该使用这个cookie来进行redirect。 我有的问题是它从不设置$instance
variablesclient1
。 不要忘记,应用程序不知道前缀/client1
。
你有好主意吗? 你知道更好的解决scheme吗?
用于获取cookie的正则表达式是错误的。 我已经改变了
"instance=([^;][^ ]+)(?:;|$)"
现在它工作。
编辑:这只是解决方案的一部分。 对不起。 还有一个问题。 看到我下面的评论。
这与你的问题没有关系,但是“proxy_connect_timeout”
“这个指令为连接上游服务器分配一个超时值,要记住这个时间不能超过75秒。
查看Nginx的地图模块
map $uri $proxy { /client1 http://127.0.0.1:8193/client1; /client2 http://127.0.0.1:8194/client2; } server { server_name my.domain.com; proxy_pass $proxy; }
请注意,在proxy_pass URI的末尾添加/ clientX将从请求中去除这部分URI(这对我来说似乎是理性的,但可能不是您想要的)。