1

内部系统

硬件:Xeon E-2236 x 32GB x 1TB SSD ),带 4 个服务器。仅用于负载平衡,用于执行x 2ea,用于db CRUD

软件:centos 7,nginx 1.18,节点 v12.22.1

当外部连接到服务器时,负载均衡服务器发送到反向代理(性能服务器)并计算它。计算完成后,发送到db-server进行记录。它

这项工作需要低性能,所以总是CPU 使用率是 0~2%,RAM 使用率是 3~7%,IO WAIT 是 0%

问题是

当外部请求到达负载服务器时,请求会随机延迟 完美 1 分钟,然后发送到反向代理服务器。并且当请求延迟 1 分钟时,重新启动负载服务器的 nginx ( systemctl restart nginx ) 立即完成请求而没有错误。它处理得很好。

神奇的是,这个问题完美延迟了 1 分钟(花费了 1min 0.02s ~ 1min 0.1s)。当 1 分钟后,它似乎正常(在 50 毫秒内响应几次)但是当来自同一设备的请求时,它每 5 分钟延迟 1 分钟

但是外部 http 连接 x 5000 个请求的完美副本通过 curl 将其从加载服务器发送到加载服务器,

load-server 发送到 perform-server 和 perform-server 到 db-server 花费低于平均 50ms 检查所有 nginx 到反向代理端口和响应,它也低于平均 50ms

nuxt-serverapi-server中相同。它们从 perform-server 运行 - 每个 localhost:3000, localhost:3001 ~ 3012

加载-nginx.conf:

#user  nobody;
worker_processes  auto;
            
error_log  logs/error.log;
events {
use epoll;
worker_connections  4096;
multi_accept   off;
}


http {
client_max_body_size 300M;
include       mime.types;
default_type  application/octet-stream;
sendfile        on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout  0;
keepalive_timeout  35;
reset_timedout_connection on;
send_timeout 15;


upstream nuxtserver-ssl {
    ip_hash;
    server 10.10.10.21:500;
    server 10.10.10.22:500;
}
upstream apiserver-ssl {
   server 10.10.10.21:465;
   server 10.10.10.22:465;
   server 10.10.10.21:466;
   server 10.10.10.22:466;
   server 10.10.10.21:467;
   server 10.10.10.22:467;
}

# HTTPS server
#
server {
    include /usr/local/nginx/conf/ipdeny.conf;

    listen       443 ssl;
    server_name  subdomain.example.com;

    ssl_certificate      /usr/local/nginx/ssl/__example_com.crt;
    ssl_certificate_key  /usr/local/nginx/ssl/__example_com.key;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    access_log /usr/local/nginx/logs/ssl-access.log combined;
    error_log /usr/local/nginx/logs/ssl-error.log;
    location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://nuxtserver-ssl;
    }
    location /api/ {
            proxy_set_header Upgrade $http_upgrade;
            proxy_http_version 1.1;
            proxy_set_header Connection upgrade;
            proxy_set_header Accept-Encoding gzip;
            proxy_cache_bypass $http_upgrade;
            proxy_pass http://apiserver-ssl;
            proxy_connect_timeout 3;
            proxy_buffering off;
    }
}
4

1 回答 1

0

我不知道这是 OP 的问题,但我在我的 docker swarm 中遇到了类似的问题,这些问题都与 IPV6 支持有关。

我的方法是确保我始终代理到 IPV4 地址,而不是任凭运气。

与本地主机相关:

server {
    ...
    location / {
        # This would occasionally take 1 minute:
        # proxy_pass  http://localhost:8000;

        # This is always quick:
        proxy_pass  http://127.0.0.1:8000;
    }
}

与 docker-internal DNS 查询有关:

server {
    ...

    # This would occasionally take 1 minute:
    # resolver 127.0.0.11 valid=30s;

    # This is always quick:
    resolver 127.0.0.11 valid=30s ipv6=off;

    location / {
        set $target myproject-web;
        proxy_pass  http://$target:8000;
    }
}
于 2022-02-16T16:39:12.367 回答