Tho*_*ers 10 ssl nginx virtualhost php-fpm tls
我们已经在 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;
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我们正在为这两个域运行不同的 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"
Run Code Online (Sandbox Code Playgroud)
在这一行中,您可以看到对页面的请求/committees
突然被重定向到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
Run Code Online (Sandbox Code Playgroud)
经过几个小时的调试这个问题,我们终于能够找到原因。看来原因不是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 和套接字似乎不足以使事物保持足够的分离。