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


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.nu와 thalia.nu함께 및없이, 두 도메인을 포함한다 www. 어떤 Firefox 버전을 어떤 플랫폼에서 사용하고 있습니까?
— Joost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.