nginx“随机”为错误的服务器提供服务

nginx“随机”为错误的服务器提供服务

我有一个带有多个服务器的 nginx 服务器,基本上配置文件如下所示:

http {
    server {
        listen              [::]:80;
        listen              80;
        server_name         DOMAIN1.com www.DOMAIN1.com;

        location ~ \.php$ {
            // ...
            fastcgi_pass            unix:/run/php/DOMAIN1-php7.3-fpm.sock;
        }

        listen [::]:443 ssl http2 ipv6only=on; 
        listen 443 ssl http2; 
        ssl_certificate /etc/letsencrypt/live/DOMAIN1/fullchain.pem; 
        ssl_certificate_key /etc/letsencrypt/live/DOMAIN1/privkey.pem; 
        include /etc/letsencrypt/options-ssl-nginx.conf; 
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
    }

    server {
        listen              [::]:80;
        listen              80;
        server_name         DOMAIN2.com www.DOMAIN2.com;

        location ~ \.php$ {
            // ...
            fastcgi_pass            unix:/run/php/DOMAIN2-php7.3-fpm.sock;
        }

        listen [::]:443 ssl http2 ipv6only=on; 
        listen 443 ssl http2; 
        ssl_certificate /etc/letsencrypt/live/DOMAIN2/fullchain.pem; 
        ssl_certificate_key /etc/letsencrypt/live/DOMAIN2/privkey.pem; 
        include /etc/letsencrypt/options-ssl-nginx.conf; 
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
    }
}

当我打开 DOMAIN1.com 时,页面通常会加载。但是当我多次刷新页面时,我最终会得到 DOMAIN2.com 的内容 - DOMAIN2.com 上也发生了同样的情况

我总共有 10 个域,没有“默认”域;即,当提供错误的站点时,它总是一个不同的站点。

我实际上可以观察到一种模式:当我向某个域发出请求时,它会正常工作。然后我打开另一个浏览器并加载另一个域。然后我刷新第一个浏览器,它会为我刚刚在第二个浏览器上打开的域提供服务。

我知道该如何调试/修复这个问题,或者什么配置实际上会触发这种行为?

答案1

记录:事实上,这不是 nginx 的问题,而是 PHP 的问题。

我将以下行添加到 nginx 中的所有服务器块中:

add_header X-Source-Server <DOMAIN>-$server_addr;

在这里我可以清楚地看到,选择了正确的 nginx 服务器块,并且它将进程正确地转发到 PHP FPM 池。但是,由于某种原因,PHP 池选择了错误的数据库/Docroot。

实际上,这个问题描述了我的问题:
FPM 有时从错误的池提供服务-> 这可能是由 opcache 或类似问题引起的问题。

按照我发现的建议在这篇博文中我可以解决这个问题(“为什么多个 PHP-FPM 主控更好”)。为每个域创建一个新的 PHP-FPM 主控后,一切都稳定了

相关内容