我有一个带有多个服务器的 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 主控后,一切都稳定了