Web 服务器随机为不同的虚拟主机提供服务

Web 服务器随机为不同的虚拟主机提供服务

我们在 Ubuntu Trusty 上运行了 nginx。它通过 https 为多个网站提供服务,运行在一个 IP 地址上。

随机地,虽然这似乎与工作负载略有关系,但有时单个请求会出现在错误的虚拟主机上。这会导致请求由lustrum.thalia.nu提供服务thalia.nu,反之亦然。然后,当用户突然进入不同的网站时,就会出现令人讨厌的错误页面。当您按 时F5,用户会再次进入原始目标。

这似乎与浏览器或操作系统无关。已确认在 Firefox (Linux、Windows、Mac)、Edge (Windows)、Chrome (Linux、Windows、Android) 和 Safari (iOS) 上发生这种情况。

当系统承受负载时,该问题似乎会更频繁地发生,这表明存在某种竞争情况。

卢斯特鲁姆.thalia.nu

server {
        server_name lustrum.thalia.nu;

        listen 443 ssl;

        ssl on;
        ssl_certificate /etc/nginx/certs/lustrum.thalia.nu.crt;
        ssl_certificate_key /etc/nginx/certs/lustrum.thalia.nu.key;

        add_header Strict-Transport-Security "max-age=63072000; preload";

        root /var/www/thalia-lustrum/public_html;

        location / {
                index index.php;
                try_files $uri $uri/ /index.php?$args;
        }

        # Add trailing slash to */wp-admin requests.
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        # Pass all .php files onto a php-fpm/php-fcgi server.
        location ~ [^/]\.php(/|$) {
                include         /etc/nginx/fastcgi_params;

                fastcgi_split_path_info ^(.+?\.php)(/.*)$;

                if (!-f $document_root$fastcgi_script_name) {
                        return 404;
                }

                fastcgi_pass    unix:/var/run/php5-fpm-thalia-lustrum.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME  /public_html$fastcgi_script_name;
        }
}

塔利亚

server {
        server_name thalia.nu;    
        listen 443 ssl;

        ssl on;
        ssl_certificate /etc/nginx/certs/www.thalia.nu.crt;
        ssl_certificate_key /etc/nginx/certs/www.thalia.nu.key;

        add_header Strict-Transport-Security "max-age=63072000; preload";

        root /var/www/thalia/public_html;

        location / {
                try_files $uri $uri/ /index.php/$request_uri;
                index index.php index.html index.htm;
        }

        location ~ \.php($|/) {
                include         /etc/nginx/fastcgi_params;
                set  $script     $uri;
                set  $path_info  "";
                if ($uri ~ "^(.+\.php)(/.+)") {
                                set  $script     $1;
                                set  $path_info  $2;
                }
                fastcgi_read_timeout    120;
                fastcgi_pass    unix:/var/run/php5-fpm-thalia-www.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME  /public_html$fastcgi_script_name;
        }
}

如您所见,我们为这两个域运行不同的 PHP5-FPM 池。这些池被 chroot 到不同的文件夹并以不同的用户身份运行。据我所知,PHP-FPM 的配置相当标准。

我们已经尝试了 nginx 1.4.6-ubuntu3 和 nginx 1.8.0-1+trusty。

记录遥测

266.266.266.266 - - [25/Nov/2015:09:24:40 +0100] "GET /committees/175 HTTP/1.1" 302 5 "https://thalia.nu/committees" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0" Host: "thalia.nu" Location: "https://thalia.nu/index.php//committees/wp-admin/setup-config.php"

在这一行中,您可以看到页面的请求/committees突然被重定向到wp-admin。这似乎请求已由PHP-fpm 池/committees处理...thalia-lustrum

DNS 区域文件

我们不明白这可能有什么关联,但是......

;; MX Records
thalia.nu.    300    IN    MX    20    relay.transip.nl.
thalia.nu.    300    IN    MX    10    ivo.thalia.nu.

;; TXT Records
thalia.nu.    300    IN    TXT    "v=spf1 a mx a:mulgore.hexon-is.nl a:moonray.hexon-is.nl a:fred.thalia.nu a:ivo.thalia.nu ~all"

;; SPF Records (Sender Policy Framework)
thalia.nu.    300    IN    SPF    "v=spf1 a mx a:mulgore.hexon-is.nl a:moonray.hexon-is.nl a:fred.thalia.nu a:ivo.thalia.nu ~all"

;; CNAME Records
lustrum.thalia.nu.    300    IN    CNAME    thalia.nu.

;; A Records (IPv4 addresses)
thalia.nu.    300    IN    A    131.174.31.8
www.thalia.nu.    300    IN    A    131.174.31.8
ivo.thalia.nu.    300    IN    A    131.174.31.8

答案1

经过几个小时的调试,我们终于能够找到原因。看来原因不是nginx,而是 PHP-fpm。我们正在运行php5-fpm版本5.5.9-1ubuntu4.14。看来,在分叉新的工作程序时,有时会出错,工作程序会运行不同工作程序的(部分?)代码。

我们的解决方案是复制/etc/php5/fpm/php5-fpm.conf到具有各自pool.d文件夹的不同副本,然后复制到/etc/init.d/php5-fpm使用新配置文件启动的副本(也在中创建文件/etc/init/)。这意味着我们现在php5-fpm每个池都有一个进程管理器。单独的 chroot 和套接字似乎不足以将事物分开。

答案2

我在 Debian 上遇到了同样的问题,使用的是 Apache2.4.25 和 PHP7.1-FPM。这是一种分离进程的方法https://ma.ttias.be/a-better-way-to-run-php-fpm/

对于像我这样可能觉得此解决方案对于小型网站来说太过繁重的人,请php_admin_value[opcache.revalidate_freq] = 0在 php-fpm 池配置文件的末尾添加。但是,这可能会对性能产生严重影响...

以下是官方的错误报告:https://bugs.php.net/bug.php?id=67141

答案3

Nginx 支持 SNI 吗?您可以运行 nginx -V,应该会看到类似“TLS SNI 支持已启用”的内容。如果没有,那么可能这是因为主机名是在握手后发送的,并且我假设您有一个 *.thalia.nu 的通配符证书

答案4

看来证书不正确:firefox 告诉我它是为 www.thalia.nu 颁发的,而不是 thalia.nu。

在我看来这就是问题所在。尝试使用其他证书或尝试激活不使用 SSL 的 HTTP 连接。

相关内容