gpt4 book ai didi

Nginx memcached 回退到远程服务

转载 作者:行者123 更新时间:2023-12-04 15:40:22 25 4
gpt4 key购买 nike

我无法让 Nginx 与 memcached 模块一起使用,要求是查询远程服务,在 memcached 中缓存数据,并且在后端使缓存无效之前永远不要获取远程端点。我有 2 个装有 memcached 的容器v1.4.35 和 Nginx 之一v1.11.10。

配置如下:

upstream http_memcached {
server 172.17.0.6:11211;
server 172.17.0.7:11211;
}

upstream remote {
server api.example.com:443;
keepalive 16;
}

server {
listen 80;

location / {
set $memcached_key "$uri?$args";
memcached_pass http_memcached;
error_page 404 502 504 = @remote;
}

location @remote {
internal;
proxy_pass https://remote;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}

我试图错误地设置 memcached 上游,但我得到了 HTTP 499 和警告:

*3 upstream server temporarily disabled while connecting to upstream



使用描述的配置,Nginx 似乎可以成功访问 memcached,但无法对其进行写入或读取。我可以使用 telnet 成功地读写 memcached。

你能帮我吗?

最佳答案

我对您的配置发生了什么的猜测

1. 499码

HTTP 499 是 nginx 的自定义代码,表示客户端在收到响应之前终止连接 (http://lxr.nginx.org/source/src/http/ngx_http_request.h#0120)

我们可以很容易地复制它,只需

nc -k -l 172.17.0.6 172.17.0.6:11211

并 curl 您的资源 - curl 将挂起一段时间,然后按 Ctrl+C - 您将在访问日志中看到此消息

2. 连接上游时,上游服务器暂时禁用

这意味着 nginx 无法访问您的 memcached,只是将其从上游池中删除。关闭两个 memcached 服务器就足够了,您会经常在错误日志中看到它(我每次都看到它 error_log ... info )。
当您看到这些消息时,您认为 nginx 可以与 memcached 服务器自由通信的假设似乎并不正确。

考虑显式设置 http://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_bind
并使用 -b 使用 telnet 选项确保您通过 telnet 客户端正确测试 memcached 服务器的可用性

3. nginx 可以成功访问 memcached 但无法写入或读取

Nginx 只能通过其内置模块从 memcached 中读取
( http://nginx.org/en/docs/http/ngx_http_memcached_module.html):

The ngx_http_memcached_module module is used to obtain responses from a memcached server. The key is set in the $memcached_key variable. A response should be put in memcached in advance by means external to nginx.



4. 整体架构

您的问题尚不完全清楚整体架构应该如何工作。
  • nginx的上游使用weighted round-robin默认情况下。
    这意味着您的 memcached 服务器将被随机查询一次。
    您可以通过设置 memcached_next_upstream not_found 来更改它因此丢失的 key 将被视为错误,并且将轮询您的所有服务器。拥有 2 台服务器的场可能没问题,但对于 20 台服务器来说,这不太可能
  • memcached 客户端库通常也是如此——他们会根据一些散列方案从池中挑选一个服务器 => 所以你的 key 最终只会出现在池中的一台服务器上

  • 5. 做什么

    我已经设法在 10 分钟内在我的本地机器上设置了类似的配置 - 它按预期工作。为了减轻调试,我将摆脱 docker 容器以避免网络过于复杂,使用 -vv 选项在不同端口上以单线程模式运行 2 个 memcached 服务器,以查看请求何时到达它们( memcached -p 11211 -U o -vv ),然后使用 tail - f 和 curl 看看你的情况到底发生了什么。

    6.工作解决方案

    nginx 配置 :

    https 和 http/1.1 在这里没有用到但是没关系
    upstream http_memcached {                                                       
    server 127.0.0.1:11211;
    server 127.0.0.1:11212;
    }

    upstream remote {
    server 127.0.0.1:8080;
    }

    server {
    listen 80;
    server_name server.lan;
    access_log /var/log/nginx/server.access.log;
    error_log /var/log/nginx/server.error.log info;

    location / {
    set $memcached_key "$uri?$args";
    memcached_next_upstream not_found;
    memcached_pass http_memcached;
    error_page 404 = @remote;
    }

    location @remote {
    internal;
    access_log /var/log/nginx/server.fallback.access.log;
    proxy_pass http://remote;
    proxy_set_header Connection "";
    }
    }

    服务器.py :

    这是我的虚拟服务器(python):
    from random import randint

    from flask import Flask
    app = Flask(__name__)

    @app.route('/')
    def hello_world():
    return 'Hello: {}\n'.format(randint(1, 100000))

    这是如何运行它(只需要先安装flask)
    FLASK_APP=server.py [flask][2] run -p 8080    

    填写我的第一个 memcached 服务器 :
    $ telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    set /? 0 900 5
    cache
    STORED
    quit
    Connection closed by foreign host.

    检查:

    请注意,尽管我们存储了数据,但我们每次都会得到一个结果
    仅在第一台服务器中
    $ curl http://server.lan && echo                                  
    cache

    $ curl http://server.lan && echo
    cache

    $ curl http://server.lan && echo
    cache

    这个不在缓存中,所以我们会从 server.py 得到响应
    $ curl http://server.lan/?q=1 && echo
    Hello: 32337

    全图 :

    右边的 2 个窗口是
    memcached -p 11211 -U o -vv


    memcached -p 11212 -U o -vv

    enter image description here

    关于Nginx memcached 回退到远程服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42846819/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com