网络服务器随机提供不同的虚拟主机


9

我们已经在Ubuntu Trusty上运行了nginx。它通过一个IP地址上的https服务多个网站。

随机地,尽管它似乎与工作量有些关系,但有时单个请求会出现在错误的虚拟主机上。这导致要求lustrum.thalia.nu由服务,thalia.nu反之亦然。然后,当用户突然进入另一个网站时,这将产生令人讨厌的错误页面。按时F5,用户将再次回到原始目标。

似乎与浏览器或操作系统无关。已经确认它会在Firefox(Linux,Windows,Mac),Edge(Windows)和Chrome(Linux,Windows,Android)和Safari(iOS)上发生。

当系统处于负载状态时,此问题似乎更经常发生,这表明存在某种竞争状况。

芦荟

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。看来,请求/committees已由thalia-lustrumPHP-fpm池处理...

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
Plesse检查域的DNS设置。
2015年

1
@bangal它们是A和CNAME记录,指向相同的IP。不过,我看不出这有什么关系。这些解决方法很好,而且DNS问题似乎不太可能如此不一致。
Joost

2
@ThomWiggers,可以将Host:http标头和用户代理的内容添加到日志文件中吗?有关详情,请参见此处:serverfault.com/questions/636790/…。实际上,我尝试向您的网站提出一些要求,但不会重现您的问题。您正在使用哪个客户端来重现此内容?
弗雷迪

3
是我刚刚得到“未安装第三方内容”之类的事实,还是因为您正在使用该内容,还是我最终到达了另一个PHP池之类的东西(触发了相同的错误)?我也收到关于config.php找不到的简短错误。
Halfgaar 2015年

2
@kasperd serverfault.com/questions/737349/...。它似乎只影响PHP脚本。
Thom Wiggers 2015年

Answers:


4

经过数小时的调试,我们终于可以找到原因了。看来原因不是nginx,而是PHP-fpm。我们正在运行php5-fpmversion 5.5.9-1ubuntu4.14。看来,在分叉新员工时,有时会出问题,并且这些员工运行(部分?)不同员工的代码。

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


请注意,目前尚不清楚这是我们配置中还是php5-fpm(此版本)中的问题,尽管由于缺乏类似报告,后者似乎不太可能。如果最终找到出现此问题的原因,则将更新此答案。
Joost 2015年


0

Nginx是否支持SNI?您可以运行nginx -V,并且应该看到启用了TLS SNI支持之类的信息。如果您不这样做,那可能就是原因,因为主机名是在握手之后发送的,并且我假设您具有* .thalia.nu的通配符证书。


当然,如果没有SNI,它确实会100%地出错,而不是偶尔出错。(而且我也检查了这一点,它肯定是启用的)
Thom Wiggers

FWIW,请注意,我们不提供通配符证书,但是将单独的证书用于单独的子域。这包括在问题中列出的配置中。
Joost

..although的lustrum.thalia.nu证书也适用于Thalia.nu
汤姆·威格斯

您可以尝试像这样添加includeSubDomains参数吗?add_header Strict-Transport-Security“ max-age = 63072000; includeSubDomains; preload”;
Mugurel

@ThomWiggers如果证书对多个域有效,则可以在单个IP上支持多个域,而无需SNI。
kasperd

-1

该证书似乎不正确:firefox告诉我该证书是为www.thalia.nu而不是thalia.nu颁发的。

恕我直言,这是引起麻烦的原因。尝试使用其他证书或尝试在不使用SSL的情况下激活HTTP连接。


我们无法复制。该证书在www.thalia.nuthalia.nu包含和不包含的两个域中提供www。您正在使用哪个Firefox版本以及在哪个平台上使用?
Joost
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.