我们已经在Ubuntu Trusty上运行了nginx。 它通过https服务于多个网站,在一个IP地址上运行。
随机地,虽然它似乎与工作负载稍有关系,有时单个请求出现在错误的虚拟主机上。 这导致请求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池。 这些池被chrooted到不同的文件夹,并作为不同的用户运行。 据我所知,PHP-FPM的configuration是相当标准的。
我们已经尝试了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的请求突然被redirect到wp-admin 。 这似乎是/committees的请求被thalia-lustrum PHP-fpm池处理…
我们不知道这可能是相关的,但…
;; 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
经过几个小时的debugging这个问题,我们终于能够追查到原因。 看起来原因不是nginx ,而是PHP-fpm。 我们正在运行php5-fpm版本5.5.9-1ubuntu4.14 。 看起来,当分派新工人时,有时会出现错误,工人们(不同工作者)的代码运行(部分)。
我们的解决scheme是将/etc/php5/fpm/php5-fpm.conf复制到具有自己的pool.d文件夹的不同副本,然后复制/etc/init.d/php5-fpm以启动新的configuration文件(也在/etc/init/创build文件)。 这意味着我们现在每个池都有一个php5-fpm进程pipe理器。 有单独的chroots和套接字似乎没有把事情分开。
我面临同样的问题,但在Debian上使用Apache2.4.25和PHP7.1-FPM。 这是一个分离进程的方法https://ma.ttias.be/a-better-way-to-run-php-fpm/
对于像我这样的人,可能会发现这个解决scheme对于小型网站来说太重了,请在php-fpm池configuration文件的末尾添加php_admin_value[opcache.revalidate_freq] = 0 。 但是,这可能会对表演造成严重的影响。
这是官方的错误报告: https : //bugs.php.net/bug.php?id = 67141
Nginx是否支持SNI? 您可以运行nginx -V,并应该看到类似TLS SNI支持启用。 如果你不这样做,这可能是为什么,因为在握手后发送主机名,我假设你有* .thalia.nu的通配符证书
看来证书是不正确的:firefox告诉我,它是为www.thalia.nu而不是thalia.nu发行的。
这是恕我直言,什么是造成麻烦。 尝试使用另一个证书或尝试激活没有SSL的HTTP连接。