【问题标题】:How to solve nginx - no live upstreams while connecting to upstream client?如何解决 nginx - 连接到上游客户端时没有实时上游?
【发布时间】:2018-09-20 20:41:53
【问题描述】:

目前,我正在我们的系统上使用 JMeter 运行负载测试,该系统构建在运行在 tomcat 上的 grails 3 上。每秒发送 20k 请求后,我在 nginx 错误日志中得到“连接上游客户端时没有实时上游”。我们的应用程序是多租户基础,所以我需要执行高负载。这是我的 nginx 配置。

worker_processes  16;
worker_rlimit_nofile 262144;
error_log  /var/log/nginx/error.log;

events {
    worker_connections  24576;
    use epoll;
    multi_accept on;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  600;
    keepalive_requests 100000;
    access_log off;
    server_names_hash_max_size  4096;
    underscores_in_headers  on;
    client_max_body_size 8192m;
    log_format vhost '$remote_addr - $remote_user [$time_local] $status "$request" $body_bytes_sent "$http_referer" "$http_user_agent" "http_x_forwarded_for"';

    proxy_connect_timeout      120;
    proxy_send_timeout         120;
    proxy_read_timeout         120;


    gzip  on;
    gzip_types text/plain application/xml text/css text/js text/xml application/x-javascript text/javascript application/json application/xml+rss image application/javascript;
    gzip_min_length  1000;
    gzip_static on;
    gzip_vary on;
    gzip_buffers 16 8k;
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_disable "msie6";

    proxy_intercept_errors on;
    recursive_error_pages on;

    ssl_prefer_server_ciphers On;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:RC4-SHA;
    include /etc/nginx/conf.d/*.conf;
}

如何配置高并发负载?

【问题讨论】:

    标签: nginx


    【解决方案1】:

    对我来说,问题在于我的 proxy_pass 条目。我有

    location / {
            ...
            proxy_pass    http://localhost:5001;
        }
    

    这导致上游请求使用 IP4 本地主机 IP 或 IP6 本地主机 IP,但它有时会使用本地主机 DNS 而不使用端口号,从而导致上游错误,如下面的日志所示。

    [27/Sep/2018:16:23:37 +0100] <request IP> - - - <requested URI>  to: [::1]:5001: GET /api/hc response_status 200
    [27/Sep/2018:16:24:37 +0100] <request IP> - - - <requested URI>  to: 127.0.0.1:5001: GET /api/hc response_status 200
    [27/Sep/2018:16:25:38 +0100] <request IP> - - - <requested URI>  to: localhost: GET /api/hc response_status 502
    [27/Sep/2018:16:26:37 +0100] <request IP> - - - <requested URI>  to: 127.0.0.1:5001: GET /api/hc response_status 200
    [27/Sep/2018:16:27:37 +0100] <request IP> - - - <requested URI>  to: [::1]:5001: GET /api/hc response_status 200
    

    如您所见,我得到“localhost:”的 502 状态

    将我的 proxy_pass 更改为 127.0.0.1:5001 意味着所有请求现在都使用 IP4 和端口。

    StackOverflow 回复对查找问题有很大帮助,因为它详细说明了更改日志格式以使查看问题成为可能。

    【讨论】:

    【解决方案2】:

    我在 perf 期间多次看到这种行为。测试。

    在繁重的工作负载下,您的上游服务器的性能可能不够,upstream module 可能会将上游服务器标记为不可用。

    相关参数(服务器指令)为:

    max_fails=number
    

    设置在fail_timeout 参数设置的持续时间内与服务器通信的不成功尝试次数,以考虑服务器在fail_timeout 参数设置的持续时间内不可用。默认情况下,不成功的尝试次数设置为 1。零值禁用尝试记帐。被认为是不成功的尝试由 proxy_next_upstream, 指令定义。

    fail_timeout=time
    

    套:

    • 指定次数的不成功尝试的时间 与服务器通信应该碰巧考虑服务器 不可用;

    • 以及服务器将被视为不可用的时间段。

    默认情况下,该参数设置为 10 秒。

    【讨论】:

    • 我对系统进行了更深入的诊断,发现MySQL由于open_file_limit而无法打开文件。然后增加这个限制,现在问题就解决了。但不要认为这是问题所在。
    • 你很有趣——你的帖子中哪里提到了 MySQL?但无论如何这是后端问题,上游被 nginx 列入​​黑名单。
    猜你喜欢
    • 2018-03-18
    • 2012-10-24
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多