웹 서버는 무작위로 다른 가상 호스트를 제공합니다


9

우분투 트러스티에서 nginx를 실행하고 있습니다. 하나의 IP 주소에서 실행되는 https를 통해 여러 웹 사이트를 제공합니다.

무작위로 작업 부하와 약간 관련이있는 것처럼 보이지만 때때로 단일 요청이 잘못된 가상 호스트를 켤 수 있습니다. 이로 인해 요청이 처리 lustrum.thalia.nu되고 thalia.nu그 반대도 마찬가지입니다. 그러면 사용자가 갑자기 다른 웹 사이트로 연결될 때 불쾌한 오류 페이지가 표시됩니다. 를 누르면 F5사용자가 원래 대상을 다시 종료합니다.

브라우저 나 운영 체제와 관련이없는 것 같습니다. Firefox (Linux, Windows, Mac), Edge (Windows) 및 Chrome (Linux, Windows, Android) 및 Safari (iOS)에서 발생하는 것으로 확인되었습니다.

시스템이로드 될 때 문제가 더 자주 발생하여 일종의 경쟁 조건을 제안합니다.

lustrum.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;
        }
}

thalia.nu

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 풀을 실행하고 있습니다. 이 풀은 다른 폴더로 루트되며 다른 사용자로 실행됩니다. 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
도메인의 DNS 설정을 확인하십시오.
다이아몬드

1
@bangal 그들은 동일한 IP를 가리키는 A 및 CNAME 레코드입니다. 그러나 이것이 어떻게 관련되어 있는지 알 수 없습니다. 이것들은 잘 해결되며 DNS 문제가 일관되게 나타나지 않을 것 같습니다.
Joost

2
@ThomWiggers, 로그 파일에 Host:http 헤더 및 사용자 에이전트 의 내용을 추가 할 수 있습니까? 방법은 serverfault.com/questions/636790/…을 참조하십시오 . 실제로 귀하의 웹 사이트에 일부 요청을 시도했지만 문제를 재현하지 못했습니다. 이것을 재현하기 위해 어떤 클라이언트를 사용하고 있습니까?
Fredi

3
방금 "타사 콘텐츠가 설치되지 않았습니다"라는 메시지가 있거나 작업 중이기 때문에 다른 PHP 풀이나 다른 버그가 발생 했습니까 (같은 버그가 발생 했습니까)? 또한 config.php찾을 수 없다는 간단한 오류가 발생했습니다 .
Halfgaar

2
@kasperd serverfault.com/questions/737349/… . PHP 스크립트에만 영향을 미치는 것으로 보입니다.
Thom Wiggers

답변:


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

1

Apache2.4.25 및 PHP7.1-FPM과 동일한 문제가 있지만 데비안에 있습니다. 다음은 프로세스를 분리하는 방법입니다 https://ma.ttias.be/a-better-way-to-run-php-fpm/

이 솔루션이 소규모 웹 사이트에 비해 너무 무거울 수 있다고 생각하는 사람들에게는 php_admin_value[opcache.revalidate_freq] = 0php-fpm 풀 구성 파일 끝에 추가 하십시오. 그러나 이는 성능에 심각한 영향을 줄 수 있습니다 ...

공식 버그 보고서는 다음과 같습니다. https://bugs.php.net/bug.php?id=67141


0

Nginx는 SNI를 지원합니까? nginx -V를 실행할 수 있으며 TLS SNI 지원 활성화와 같은 것이 표시되어야합니다. 그렇게하지 않으면, 그 수도 호스트 이름이 악수를 한 후 전송되고 내가 있으리라 믿고있어 때문에 * .thalia.nu에 대한 와일드 카드 인증서가 이유가 될


물론 SNI가 없으면 매우 가끔 시간의 100 %가 잘못 될 수 있습니다. (그리고 이것도 확인했습니다. 확실히 활성화되어 있습니다)
Thom Wiggers

FWIW에서는 와일드 카드 인증서를 제공하지 않지만 별도의 하위 도메인에 개별 인증서를 사용합니다. 이것은 질문에 나열된 구성에 포함되어 있습니다.
Joost

..although lustrum.thalia.nu 인증서 Thalia.nu에도 유효
톰 Wiggers

이와 같이 includeSubDomains 매개 변수를 추가 할 수 있습니까? add_header 엄격한 전송 보안 "max-age = 63072000; includeSubDomains; 사전로드";
Mugurel

@ThomWiggers 인증서가 여러 도메인에 유효한 경우 SNI가 없어도 단일 IP에서 여러 도메인을 지원할 수 있습니다.
kasperd

-1

인증서가 옳지 않은 것 같습니다 : firefox는 thalia.nu가 아니라 www.thalia.nu에 대해 발행되었다고 알려줍니다.

이것이 문제를 일으키는 IMHO입니다. 다른 인증서로 시도하거나 SSL없이 HTTP 연결을 활성화하십시오.


우리는 그것을 재현 할 수 없습니다. 인증서에 봉사 www.thalia.nuthalia.nu함께 및없이, 두 도메인을 포함한다 www. 어떤 Firefox 버전을 어떤 플랫폼에서 사용하고 있습니까?
Joost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.