关于proxy_http_version 1.1 和proxy_pass $target的疑问

862 views
Skip to first unread message

Weiqiang

unread,
Aug 2, 2013, 12:43:02 AM8/2/13
to open...@googlegroups.com
HI,
关于proxy_http_version 1.1 和proxy_pass $target想跟大家请教:

用ngx_lua做的动态反向代理和负载均衡。实现时,在lua代码里动态配置nginx变量($target),然后proxy_pass $target转发请求。

这种情况如果用proxy_http_version 1.1会生效么?nginx和upstream server是否能实现长连接?

先谢谢大家了。


--

From William LI


Yichun Zhang (agentzh)

unread,
Aug 2, 2013, 2:50:12 PM8/2/13
to openresty
Hello!

2013/8/1 Weiqiang:
> 关于proxy_http_version 1.1 和proxy_pass $target想跟大家请教:
>
> 用ngx_lua做的动态反向代理和负载均衡。实现时,在lua代码里动态配置nginx变量($target),然后proxy_pass
> $target转发请求。
>
> 这种情况如果用proxy_http_version 1.1会生效么?nginx和upstream server是否能实现长连接?
>

HTTP 1.1 总会生效,因为你配置了 proxy_http_version 1.1;但长连接和连接池未必会生效,因为取决于你是否正确配置了

1. upstream 配置块中的 keepalive 指令。具体来说,你需要事先为 $target 变量的所有可能取值配置相应的
upstream {} 配置块,例如:

upstream foo {
server ...;
keepalive ...;
}

upstream bar {
server ...;
keepalive ...;
}

这里假设 $target 的取值只会是 foo 和 bar 这两种。

2. 是否在对应的 location 中配置了 proxy_set_header Connection "";

由于你没有给出具体的 nginx 配置,所以我无法确定是否可以工作。

建议养成查看 nginx 官方文档的好习惯,以节约时间。例如这个问题的文档在这里:

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive

Regards,
-agentzh

Weiqiang

unread,
Aug 2, 2013, 8:13:38 PM8/2/13
to open...@googlegroups.com
感谢春哥解惑.

实际的配置与openresty官网的一个sample很像:
http {
    server {
        listen 8080;
        location / {
            resolver 8.8.4.4;  # use Google's open DNS server
            set $target '';
            access_by_lua '
                ......
                local host = ......
                ngx.var.target = host
            ';
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_pass http://$target;
        }
    }
}

nginx官方文档介绍说需要配合upstream keepalive指令可以实现长连接, 但我没有找到使用Nginx变量指定proxy_pass地址时如何保持长连接的说明.

用nginx变量指定proxy_pass的目的地, 可以实现长连接么?

感谢:)


William LI




2013/8/3 Yichun Zhang (agentzh) <age...@gmail.com>

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html





--

From William LI


Yichun Zhang (agentzh)

unread,
Aug 2, 2013, 8:40:44 PM8/2/13
to openresty
Hello!

2013/8/2 Weiqiang:
>
> 用nginx变量指定proxy_pass的目的地, 可以实现长连接么?
>

我上一封邮件已经说了,“你需要事先为 $target 变量的所有可能取值配置相应的 upstream {} 配置块”,而不应在
$target 变量里直接指定域名。同时你应去掉 resolver 配置指令。可以参考我上一封邮件中的配置示例。

openresty.org 上的“DynamicRoutingBasedOnRedis”样例没有配置 upstream {} 和
keepalive,所以不支持长连接池。

Best regards,
-agentzh

Weiqiang

unread,
Aug 2, 2013, 8:48:36 PM8/2/13
to open...@googlegroups.com

明白了。

我的需求与 DynamicRoutingBasedOnRedis一样。

如果能用lua动态创建和调整upstream里的地址池就好了。

期待这样的特性。

感谢!

Regards.

William LI

Yichun Zhang (agentzh)

unread,
Aug 2, 2013, 8:54:49 PM8/2/13
to openresty
Hello!

2013/8/2 Weiqiang:
>
> 我的需求与 DynamicRoutingBasedOnRedis一样。
>
> 如果能用lua动态创建和调整upstream里的地址池就好了。
>

从技术上应当是可能实现的。欢迎贡献一个 nginx C 模块来扩展 ngx_lua 以提供这样的 Lua API :)

Regards,
-agentzh
Reply all
Reply to author
Forward
0 new messages