【问题标题】:nginx reverse proxy: How to implement?nginx反向代理:如何实现?
【发布时间】:2012-06-22 01:33:40
【问题描述】:

我正在尝试使用基于 URL 的 Nginx 进行反向代理。我希望将http://mydomain.example.com/client1/... 重定向到http://127.0.0.1:8193/...。我尝试了很多方法,但都没有奏效。请注意,应用程序可以进行重定向。这些是我上一个解决方案的配置文件:

默认

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;
    }

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,然后将流量重定向到适当的代理。对于后续查询,它应该使用此 cookie 进行重定向。我遇到的问题是它永远不会将$instance 变量设置为client1。不要忘记应用程序不知道前缀/client1。

你有什么想法吗?你知道更好的解决方案吗?

【问题讨论】:

  • 我认为问题在于用于获取 cookie 值的正则表达式。我不是正则表达式的专家。我从 Nginx 的文档文件中获取了这个。有人可以验证吗?

标签: configuration nginx reverse-proxy


【解决方案1】:

用于获取 cookie 的正则表达式错误。我已将其更改为

"instance=([^;][^ ]+)(?:;|$)"

现在可以使用了。

编辑:这只是最终解决方案的一部分。对不起。还有一个问题。请参阅下面的评论。

【讨论】:

  • 不...它已经工作了,因为我已经将一个值强制设置为 proxy_pass。但是现在当我手动将 cookie 设置到 Firefox 中时,它可以工作了!应该设置cookie的时候有问题。
【解决方案2】:

与你的问题无关,而是“proxy_connect_timeout”

“该指令为与上游服务器的连接分配了一个超时时间。需要注意的是,这个超时时间不能超过 75 秒。”

【讨论】:

  • 为什么与此相关?
【解决方案3】:

见 Nginx'map module

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;
}

请注意,将 /clientX 附加到 proxy_pass URI 的末尾会从请求中删除该部分 URI(这对我来说似乎很合理,但可能不是您想要的)。

【讨论】:

  • proxy_pass 不能在服务器指令中。
猜你喜欢
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2011-08-09
  • 2013-02-18
相关资源
最近更新 更多