Server web secara acak melayani vhost yang berbeda

9

Kami menjalankan nginx di Ubuntu Trusty. Ini melayani beberapa situs web melalui https, berjalan pada satu alamat ip.

Secara acak, meskipun tampaknya sedikit terkait dengan beban kerja, kadang-kadang satu permintaan muncul di vhost yang salah. Ini mengarah pada permintaan untuk lustrum.thalia.nudilayani oleh thalia.nudan sebaliknya. Ini kemudian memberikan halaman kesalahan yang buruk karena pengguna tiba-tiba berakhir di situs web yang berbeda. Saat Anda menekan F5, pengguna kemudian berakhir pada target asli lagi.

Tampaknya tidak terkait browser atau sistem operasi. Sudah dikonfirmasi untuk terjadi di Firefox (Linux, Windows, Mac), Edge (Windows) dan Chrome (Linux, Windows, Android) dan Safari (iOS).

Masalah ini muncul lebih sering terjadi ketika sistem berada di bawah beban, menunjukkan semacam kondisi balapan.

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

Seperti yang Anda lihat, kami menjalankan kumpulan PHP5-FPM yang berbeda untuk kedua domain ini. Kumpulan ini chroot ke folder yang berbeda dan dijalankan sebagai pengguna yang berbeda. Konfigurasi PHP-FPM sebaliknya cukup standar sejauh yang saya tahu.

Kami telah mencoba nginx 1.4.6-ubuntu3 dan nginx 1.8.0-1 + trusty.

Log telemetri

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"

Di baris ini Anda dapat melihat bahwa permintaan halaman /committeestiba-tiba dialihkan ke wp-admin. Tampaknya permintaan untuk /committeesditangani oleh thalia-lustrumkumpulan PHP-fpm ...

File zona DNS

Kami tidak melihat bagaimana ini mungkin relevan, tetapi ...

;; 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
Thom Wiggers
sumber
1
Mohon periksa pengaturan DNS Anda untuk domain.
Berlian
1
@bangal mereka adalah catatan A dan CNAME, menunjuk ke IP yang sama. Saya tidak melihat bagaimana ini terkait; penyelesaian ini baik-baik saja, dan tampaknya tidak mungkin bahwa masalah DNS akan terwujud begitu tidak konsisten.
Joost
2
@ThomWiggers, dapatkah Anda menambahkan ke file log konten Host:header http dan agen pengguna? Lihat di sini untuk caranya: serverfault.com/questions/636790/… . Sebenarnya saya mencoba membuat beberapa permintaan ke situs web Anda tetapi tidak mereproduksi masalah Anda. Klien apa yang Anda gunakan untuk mereproduksi ini?
Fredi
3
Apakah fakta bahwa saya baru saja mendapatkan "konten pihak ketiga tidak diinstal" atau sesuatu karena Anda sedang mengerjakannya, atau apakah saya berakhir di kumpulan PHP lain atau sesuatu (memicu bug yang sama)? Saya juga mendapat kesalahan singkat tentang config.phptidak ditemukan.
Halfgaar
2
@kasperd serverfault.com/questions/737349/… . Tampaknya hanya mempengaruhi skrip PHP.
Thom Wiggers

Jawaban:

4

Setelah berjam-jam men-debug masalah ini, kami akhirnya dapat melacaknya sampai ke penyebabnya. Tampaknya penyebabnya bukan nginx, tetapi PHP-fpm. Kami sedang menjalankan php5-fpmversi 5.5.9-1ubuntu4.14. Tampaknya ketika mencari pekerja baru, kadang-kadang ada yang salah dan pekerja menjalankan (bagian?) Dari kode pekerja yang berbeda.

Solusi kami adalah menyalin /etc/php5/fpm/php5-fpm.confke berbagai salinan dengan pool.dfolder mereka sendiri , kemudian menyalin /etc/init.d/php5-fpmuntuk memulai dengan file konfigurasi baru (juga membuat file di /etc/init/). Ini berarti kami sekarang memiliki php5-fpmmanajer proses per kelompok. Memiliki chroot dan soket yang terpisah tampaknya tidak membuat hal-hal cukup terpisah.

Thom Wiggers
sumber
Perhatikan bahwa saat ini tidak jelas apakah ini merupakan masalah dalam konfigurasi kami atau dalam (versi ini) php5-fpm, meskipun yang terakhir tampaknya tidak mungkin karena kurangnya laporan yang sama. Jika akhirnya kami menemukan alasan mengapa masalah ini terjadi, jawaban ini akan diperbarui.
Joost
1

Saya menghadapi masalah yang sama tetapi pada Debian dengan Apache2.4.25 dan PHP7.1-FPM. Berikut adalah cara untuk memisahkan proses https://ma.ttias.be/a-better-way-to-run-php-fpm/

Bagi mereka seperti saya yang mungkin menganggap solusi ini terlalu berat untuk situs web kecil, tambahkan php_admin_value[opcache.revalidate_freq] = 0di akhir file konfigurasi kumpulan php-fpm. Namun, itu mungkin berdampak serius pada kinerja ...

Berikut adalah laporan bug resmi: https://bugs.php.net/bug.php?id=67141

Bagus
sumber
0

Apakah Nginx mendukung SNI? Anda dapat menjalankan nginx -V dan akan melihat sesuatu seperti dukungan TLS SNI diaktifkan. Jika tidak, mungkin itulah sebabnya karena nama host dikirim setelah jabat tangan dan saya berasumsi Anda memiliki sertifikat wildcard untuk * .thalia.nu

Mugurel
sumber
Tentu saja demikian, tanpa SNI ini akan salah 100% dari waktu, bukan sesekali. (dan saya juga sudah memeriksa ini, sudah pasti diaktifkan)
Thom Wiggers
FWIW, perhatikan bahwa kami tidak menayangkan sertifikat wildcard, tetapi menggunakan sertifikat individual untuk subdomain yang terpisah. Ini termasuk dalam konfigurasi yang tercantum dalam pertanyaan.
Joost
.. walaupun sertifikat lustrum.thalia.nu juga berlaku untuk Thalia.nu
Thom Wiggers
Bisakah Anda mencoba menambahkan parameter includeSubDomains seperti ini? add_header Strict-Transport-Security "max-age = 63072000; includeSubDomains; preload";
Mugurel
@ThomWiggers Jika sertifikat ini berlaku untuk beberapa domain, dimungkinkan untuk mendukung beberapa domain pada satu IP tanpa perlu SNI.
kasperd
-1

Tampaknya sertifikat itu tidak benar: firefox memberi tahu saya bahwa sertifikat ini dikeluarkan untuk www.thalia.nu, bukan thalia.nu.

Ini adalah IMHO yang menyebabkan masalah. Coba dengan sertifikat lain atau coba aktifkan koneksi HTTP tanpa SSL.

Xavier Nicollet
sumber
Kami tidak dapat mereproduksi itu. Sertifikat disajikan di www.thalia.nudan thalia.numencakup kedua domain, dengan dan tanpa domain www. Versi Firefox apa yang Anda gunakan, dan pada platform apa?
Joost