Rumah Operasi dan penyelenggaraan Nginx Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502

Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502

May 21, 2023 am 08:07 AM
php nginx fpm

Untuk salah satu projek web kami, disebabkan peningkatan dalam bandar baharu, bilangan lawatan telah meningkat dan tekanan terhadap db telah meningkat Sebagai pihak perniagaan yang menyediakan antara muka, sejumlah besar permintaan "502". telah dilaporkan baru-baru ini oleh maklum balas hiliran.

502, gerbang buruk, biasanya ralat di hulu (ini adalah PHP, sebab biasa 502 ialah pelaksanaan skrip melebihi masa tetapan tamat masa, atau tetapan tamat masa terlalu besar). menyebabkan proses PHP mengambil masa yang lama Ia tidak boleh dikeluarkan dan tiada proses pekerja terbiar untuk mengambil tetamu.

Projek kami disebabkan oleh tetapan masa pelaksanaan PHP yang terlalu singkat Dalam kes ini, anda boleh terlebih dahulu meningkatkan masa pelaksanaan PHP dengan sewajarnya dan memastikan bahawa Pengoptimuman 502 akan mengambil lebih banyak masa.

Terdapat dua pilihan untuk mengawal masa pelaksanaan php, max_execution_time dalam php.ini dan request_terminate_timeout dalam php-fpm request_terminate_timeout boleh mengatasi max_execution_time, jadi jika anda tidak mahu menukar php.ini global, tukar sahaja. php- Konfigurasi fpm sudah memadai.

Di bawah saya akan menganalisis secara terperinci mengapa nginx mengembalikan 502 apabila pelaksanaan skrip php melebihi masa yang ditetapkan.

Mari kita tetapkan adegan dahulu dan hasilkan semula masalah:

nginx dan php masing-masing memulakan hanya seorang pekerja untuk penjejakan yang mudah.

permintaan_terminate_timeout php-fpm ditetapkan kepada 3s.

Uji skrip test.php

sleep(20);
echo 'ok';
Salin selepas log masuk

go go go:

Lawati www.v.com/test.php dalam penyemak imbas, dan ia akan muncul seperti yang dijangkakan selepas 3 saat...404 ? ? ? apa? ? ?

Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502

Permulaan yang buruk, cepat lihat fail konfigurasi nginx

Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502

Konfigurasi lokasi ini apabila Ralat 5xx berlaku Lompat ke antara muka yang kelihatan bagus, tetapi saya tidak mempunyai fail 50x.html di bawah /usr/share/nginx/html. Jadi saya mendapat 404. Tidakkah ini menjejaskan ketepatan penghakiman saya terhadap masalah itu? Komen sahaja! Lawati lagi, tunggu 3 saat, dan akhirnya antara muka 'biasa' keluar.

Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502

Memandangkan persekitaran sudah sedia, mari ikut rutin dan ikut rutin penyelesaian masalah untuk masalah web dahulu:

nginx:

Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502

Ralat yang dilaporkan adalah recv() gagal (104: sambungan ditetapkan semula oleh rakan sebaya.

Recv gagal dan sambungan telah ditetapkan semula. Mengapakah tetapan semula sambungan? Adakah ia benar? daripada php. dalam php.ini Tetapi di sini kita tidak melihat ralat php, tetapi pada ralat php-fpm ditentukan oleh pilihan error_log dalam php-fpm.conf)

Setiap permintaan menjana 2 amaran dan 1 notis:

Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502amaran: Pelaksanaan skrip tamat masa dan ditamatkan

amaran: Proses anak menerima sigterm. Isyarat telah keluar.

Notis: Memulakan sub-proses baharu (kerana saya menetapkan pm.min_spare_servers = 1)

Nampaknya jika proses pekerja php tamat, ia bukan sahaja akan ditamatkan pelaksanaan skrip , dan proses pekerja juga akan keluar Nampaknya sambungan ralat nginx ditetapkan semula kerana proses pekerja php keluar (jika satu pihak dalam sambungan tcp diputuskan, pertama akan dihantar kepada pihak lain)

Melalui log Telah diketahui bahawa pelaksanaan skrip php tamat dan sub-proses pekerja keluar, menyebabkan nginx melaporkan tetapan semula sambungan ralat oleh rakan sebaya Mari kita gunakan strace untuk melihat situasi php dan nginx:

php:

1.Terima permintaan sambungan nginx (soket, ikat dan dengar semuanya selesai dalam induk). port nginx ialah 47039. Membaca data daripada fd0 adalah daripada input standard Ini ditetapkan oleh protokol fast-cgi , dan menerima 856 bait dalam format protokol fastcgi. Bagaimana pula dengan masa

Oleh kerana paket data protokol fastcgi adalah sejajar 8-bait dan terdiri daripada pengepala paket dan badan paket. Dan ia mula-mula akan menghantar paket permintaan, termasuk beberapa id permintaan, versi, jenis dan maklumat lain (pengepala dan badan masing-masing menduduki 8 bait), dan kemudian menghantar paket params untuk lulus get parameter dan pembolehubah persekitaran (header ialah 8 bytes), badan paket menjadi lebih panjang), dan akhirnya paket data params tanpa badan paket dan hanya pengepala paket dihantar, menunjukkan penghujung penghantaran parameter (8 bait pengepala paket). Jadi tiga bacaan pertama digunakan untuk membaca pengepala dan badan paket permintaan, serta pengepala paket params Bacaan keempat adalah untuk membaca data sebenar, dan bacaan terakhir adalah untuk membaca pengepala yang terakhir paket params. Oleh itu, data yang dihantar oleh nginx hendaklah 8+8+8+856+8=896 bait (yang sepadan dengan bait penghantaran nginx di bawah). Ambil perhatian bahawa jika ia adalah mod pos, paket data stdin juga akan dihantar.

3. Tetapkan tidur selama 20s, iaitu tidur(20) dalam program php Selepas itu, kerana proses ditamatkan, tidak akan ada lagi. Program strace juga telah dikeluarkan.

nginx:

Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502

1.Terima permintaan kepada penyemak imbas Anda boleh melihat bahawa port pada bahagian penyemak imbas ialah 56434, ip ialah 192.168. 1.105, dan ia telah ditubuhkan Fd yang disambungkan ialah 3.

2. Terima data daripada fd3, protokol http.

3. Cipta soket, fd21, untuk mewujudkan sambungan dengan php.

4. Sambungkan ke fd21, anda boleh melihat bahawa sambungan adalah port 9000 mesin tempatan Di sini nginx dan php-fpm menggunakan kaedah sambungan soket ip Jika nginx dan php-fpm digunakan pada satu mesin , unix boleh dipertimbangkan.

5. Tulis data ke fd21, format protokol cepat-cgi, kita lihat bahawa panjang bertulis ialah 896, yang sepadan dengan panjang yang diterima oleh php di atas.

6. Fungsi recvfrom mengembalikan econnreset (tetapan semula sambungan oleh rakan sebaya) daripada fd21

7. Tulis maklumat ralat ke fd9. Ia boleh disimpulkan bahawa fd9 ialah deskriptor fail log ralat .

8. Tutup sambungan dengan fd21.

9 Tulis 502 gerbang buruk ke fd3, iaitu maklumat yang dikembalikan kepada penyemak imbas.

10 Tulis log akses kepada fd8. Dapat disimpulkan bahawa fd8 ialah deskriptor fail log akses nginx.

Mari sahkan inferens log akses nginx dan log ralat. Anda boleh melihat bahawa ia sememangnya fd8, fd9, dan dalam mod tulis.

Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502

Kemudian kita juga boleh melihat pada penghantaran keseluruhan paket rangkaian semasa proses ini:

Tangkap paket melalui tcpdump Ia lebih mudah menggunakan artifak untuk melihatnya.

Oleh kerana saya hanya mahu melihat komunikasi antara nginx dan php, dan saya tahu di atas bahawa port nginx ialah 47039, saya boleh menapis pakej yang sepadan melalui tcp.srcport==47039.

Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502

Anda boleh melihat proses interaksi data antara nginx dan php-fpm: 47039->9000 mewujudkan jabat tangan tiga hala, kemudian menghantar data ke 9000, 9000 balasan dengan ack, dan 9000 selepas 3 saat Balas kepada yang pertama. Tak salah pun.

Nota:

syn, setiap sirip menduduki nombor siri

ack, pertama tidak menduduki nombor siri (reqnum dan acknum bagi dua pakej 28 dan 29 ialah yang sama )

Nombor jujukan ditambah 1 untuk setiap bait (896 bait dihantar dalam 29 paket, manakala seq 29 paket ialah 4219146879, dan ack 30 paket ialah 4219147775, yang betul-betul berbeza daripada 896)

Pertama Tiada Balasan diperlukan.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan kod status HTTP perkhidmatan nginx+php-fpm 502. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara memeriksa sama ada nginx dimulakan Cara memeriksa sama ada nginx dimulakan Apr 14, 2025 pm 01:03 PM

Bagaimana untuk mengesahkan sama ada nginx dimulakan: 1. Gunakan baris arahan: status sistem sistem nginx (linux/unix), netstat -ano | Findstr 80 (Windows); 2. Periksa sama ada port 80 dibuka; 3. Semak mesej permulaan Nginx dalam log sistem; 4. Gunakan alat pihak ketiga, seperti Nagios, Zabbix, dan Icinga.

Bagaimana untuk memeriksa sama ada Nginx dimulakan? Bagaimana untuk memeriksa sama ada Nginx dimulakan? Apr 14, 2025 pm 12:48 PM

Di Linux, gunakan arahan berikut untuk memeriksa sama ada nginx dimulakan: Hakim status SistemCTL Nginx berdasarkan output arahan: Jika "Aktif: Aktif (Running)" dipaparkan, Nginx dimulakan. Jika "aktif: tidak aktif (mati)" dipaparkan, nginx dihentikan.

Cara Mengkonfigurasi Nginx di Windows Cara Mengkonfigurasi Nginx di Windows Apr 14, 2025 pm 12:57 PM

Bagaimana cara mengkonfigurasi nginx di Windows? Pasang Nginx dan buat konfigurasi hos maya. Ubah suai fail konfigurasi utama dan sertakan konfigurasi hos maya. Mulakan atau Muat semula Nginx. Uji konfigurasi dan lihat laman web. Selektif membolehkan SSL dan mengkonfigurasi sijil SSL. Selektif tetapkan firewall untuk membolehkan trafik port 80 dan 443.

Cara memulakan nginx di linux Cara memulakan nginx di linux Apr 14, 2025 pm 12:51 PM

Langkah -langkah untuk memulakan Nginx di Linux: Periksa sama ada Nginx dipasang. Gunakan SistemCTL Mula Nginx untuk memulakan perkhidmatan Nginx. Gunakan SistemCTL Dayakan NGINX untuk membolehkan permulaan automatik Nginx pada permulaan sistem. Gunakan Status SistemCTL Nginx untuk mengesahkan bahawa permulaan berjaya. Lawati http: // localhost dalam pelayar web untuk melihat halaman selamat datang lalai.

Cara memulakan pelayan nginx Cara memulakan pelayan nginx Apr 14, 2025 pm 12:27 PM

Memulakan pelayan Nginx memerlukan langkah-langkah yang berbeza mengikut sistem operasi yang berbeza: Sistem Linux/Unix: Pasang pakej Nginx (contohnya, menggunakan apt-get atau yum). Gunakan SystemCTL untuk memulakan perkhidmatan Nginx (contohnya, SUDO SystemCTL Mula Nginx). Sistem Windows: Muat turun dan pasang fail binari Windows. Mula Nginx menggunakan nginx.exe executable (contohnya, nginx.exe -c conf \ nginx.conf). Tidak kira sistem operasi yang anda gunakan, anda boleh mengakses IP pelayan

PHP: Pengendalian pangkalan data dan logik sisi pelayan PHP: Pengendalian pangkalan data dan logik sisi pelayan Apr 15, 2025 am 12:15 AM

PHP menggunakan sambungan MySQLI dan PDO untuk berinteraksi dalam operasi pangkalan data dan pemprosesan logik sisi pelayan, dan memproses logik sisi pelayan melalui fungsi seperti pengurusan sesi. 1) Gunakan MySQLI atau PDO untuk menyambung ke pangkalan data dan laksanakan pertanyaan SQL. 2) Mengendalikan permintaan HTTP dan status pengguna melalui pengurusan sesi dan fungsi lain. 3) Gunakan urus niaga untuk memastikan atomik operasi pangkalan data. 4) Mencegah suntikan SQL, gunakan pengendalian pengecualian dan sambungan penutup untuk debugging. 5) Mengoptimumkan prestasi melalui pengindeksan dan cache, tulis kod yang sangat mudah dibaca dan lakukan pengendalian ralat.

Cara menyelesaikan ralat nginx403 Cara menyelesaikan ralat nginx403 Apr 14, 2025 pm 12:54 PM

Pelayan tidak mempunyai kebenaran untuk mengakses sumber yang diminta, mengakibatkan ralat NGINX 403. Penyelesaian termasuk: Periksa keizinan fail. Semak konfigurasi .htaccess. Semak konfigurasi Nginx. Konfigurasikan keizinan Selinux. Semak peraturan firewall. Menyelesaikan masalah lain seperti masalah penyemak imbas, kegagalan pelayan, atau kesilapan lain yang mungkin.

Tujuan PHP: Membina Laman Web Dinamik Tujuan PHP: Membina Laman Web Dinamik Apr 15, 2025 am 12:18 AM

PHP digunakan untuk membina laman web dinamik, dan fungsi terasnya termasuk: 1. Menjana kandungan dinamik dan menghasilkan laman web secara real time dengan menyambung dengan pangkalan data; 2. Proses Interaksi Pengguna dan Penyerahan Bentuk, Sahkan Input dan Menanggapi Operasi; 3. Menguruskan sesi dan pengesahan pengguna untuk memberikan pengalaman yang diperibadikan; 4. Mengoptimumkan prestasi dan ikuti amalan terbaik untuk meningkatkan kecekapan dan keselamatan laman web.

See all articles