Penghasilan Semula Senario
Di bawah saya akan menggunakan nginx asli untuk menghasilkan semula proses ini pada mesin maya saya dengan fedora26 dipasang Versi nginx yang saya gunakan ialah 1.13.4 terbaharu
Nginx mula pertama.
Anda dapat melihat bahawa kedua-dua tuan dan pekerja sudah berjalan.
Kemudian kami menghantar isyarat sigusr2 kepada master Apabila teras nginx menerima isyarat ini, kemas kini panas akan dicetuskan.
Anda dapat melihat bahawa tuan baru dan pekerja yang dicabang oleh tuan sudah berjalan pada masa ini, kami kemudian menghantar isyarat sigwinch kepada tuan lama, dan tuan lama menerima ini Selepas isyarat, sigquit akan dihantar kepada pekerjanya, jadi proses pekerja tuan lama akan keluar:
Pada masa ini, hanya tuan lama , tuan baru dan tuan baru ditinggalkan Pekerja tuan sedang berjalan, yang serupa dengan operasi dalam talian pada masa itu.
Kemudian kita menggunakan arahan berhenti:
Kita akan dapati tuan baru dan pekerjanya telah keluar, sementara tuan lama masih berjalan Dan pekerja yang dihasilkan. Inilah keadaan dalam talian pada masa itu.
Sebenarnya, fenomena ini berkaitan dengan reka bentuk nginx itu sendiri: apabila tuan lama bersedia untuk memotong tuan baharu, ia akan menamakan semula fail nginx.pid kepada nginx.pid.oldbin, dan kemudian menggunakan Master baharu daripada fork akan mencipta nginx.pid baharu Fail ini akan merekodkan pid master baharu. nginx percaya bahawa selepas kemas kini panas selesai, misi tuan lama hampir tamat, dan ia akan keluar pada bila-bila masa, jadi semua operasi berikutnya harus diambil alih oleh tuan baru. Sudah tentu, adalah tidak sah untuk mencuba kemas kini panas yang lain dengan menghantar sigusr2 kepada master baru tanpa master lama keluar dari master baru hanya akan mengabaikan isyarat ini dan meneruskan kerjanya sendiri.
Analisis Masalah
Apa yang lebih malang ialah jadual lua yang kami nyatakan di atas, fail lua yang mentakrifkannya, telah dimuatkan ke dalam ingatan oleh luajit seawal apabila cangkuk init_by_lua dijalankan. Dan disusun ke dalam kod bait, maka jelaslah tuan lama tidak boleh mempunyai jadual lua ini, kerana bahagian kod lua yang dimuatkannya ialah versi lama.
Kod Lua yang mengindeks jadual tidak digunakan semasa init_by_lua Kod ini dimuatkan dalam proses pekerja Pada masa ini, kod dalam direktori projek adalah yang terkini, jadi kod pekerja yang terkini dimuatkan. Jika proses pekerja ini mengendalikan permintaan yang berkaitan, ralat masa jalan Lua akan berlaku dan manifestasi luaran akan menjadi http 500 yang sepadan.
Selepas menyerap pelajaran ini, kami perlu menutup perkhidmatan nginx kami dengan lebih rasional. Oleh itu, skrip permulaan dan penutupan perkhidmatan nginx yang lebih munasabah diperlukan Sesetengah skrip yang beredar di Internet tidak menangani fenomena ini.
Kod ini dipetik daripada nginx official /etc/init.d/nginx .
set isyarat nginx
Seterusnya kami akan menyusun set isyarat nginx secara menyeluruh Butiran kod sumber tidak akan terlibat di sini. Pelajar yang berminat boleh membaca sendiri kod sumber yang berkaitan.
Kami mempunyai dua cara untuk menghantar isyarat kepada proses induk, satu adalah untuk beroperasi melalui isyarat nginx -s, dan satu lagi adalah untuk menghantarnya secara manual melalui arahan bunuh.
Prinsip kaedah pertama ialah menjana proses baharu, yang mendapat pid proses induk melalui fail nginx.pid, kemudian menghantar isyarat yang sepadan kepada induk, dan kemudian keluar Proses ini dipanggil pemberi isyarat.
Cara kedua memerlukan kita memahami pemetaan isyarat nginx -s kepada isyarat sebenar. Jadual berikut ialah hubungan pemetaan mereka:
isyarat operasi
reload sighup
buka semula sigusr1
stop sigterm
quit sigquit
hot update sigusr2 & sigwinch & sigquit
stop vs quit
stop menghantar isyarat sigterm untuk menunjukkan keluar paksa, dan quit menghantar sigquit untuk menunjukkan keluar yang anggun. Perbezaan khusus ialah selepas proses pekerja menerima mesej sigquit (perhatikan bahawa isyarat tidak dihantar terus, jadi mesej digunakan sebaliknya), ia akan menutup soket mendengar, menutup sambungan terbiar yang sedang terbiar (sambungan yang boleh didahulukan ), dan kemudian memprosesnya terlebih dahulu Semua acara pemasa keluar pada penghujungnya. Melainkan terdapat keadaan khusus, berhenti harus digunakan dan bukannya berhenti.
muat semula
Selepas proses induk menerima sighup, ia akan menghuraikan semula fail konfigurasi, memohon memori dikongsi dan satu siri tugas lain, dan kemudian menjana sekumpulan pekerja baharu proses, dan akhirnya menghantarnya kepada yang lama Proses pekerja menghantar mesej yang sepadan dengan sigquit, dan akhirnya operasi restart direalisasikan dengan lancar.
buka semula
Selepas proses induk menerima sigusr1, ia akan membuka semula semua fail yang terbuka (seperti log), dan kemudian menghantar maklumat sigusr1 kepada setiap proses pekerja Selepas proses pekerja menerima isyarat, ia akan melakukan operasi yang sama. Buka semula boleh digunakan untuk pemotongan log Contohnya, nginx secara rasmi menyediakan penyelesaian:
Tidur 1 diperlukan di sini kerana proses induk menghantar mesej sigusr1 kepada proses pekerja. Terdapat tetingkap masa antara membuka semula akses.log Pada masa ini, proses pekerja masih menulis log ke akses fail.log.0. Dengan tidur 1s, integriti maklumat log access.log.0 dipastikan (jika pemampatan dilakukan terus tanpa tidur, kehilangan log mungkin berlaku).
kemas kini panas
Kadangkala kita perlu melakukan kemas kini panas binari nginx menyertakan fungsi ini semasa mereka bentuk, tetapi ia tidak boleh diselesaikan melalui baris arahan yang disediakan oleh nginx .
Melalui masalah berulang di atas, anda sepatutnya memahami cara melakukan kemas kini panas Kita perlu menghantar sigusr2 ke proses induk semasa, dan kemudian induk akan menamakan nginx.pid kepada nginx.pid.oldbin. Kemudian buat proses baharu Proses baharu akan menggunakan panggilan sistem execve untuk menggantikan imej proses semasa dengan fail nginx elf baharu dan menjadi proses induk baharu. Selepas proses induk baharu dimulakan, ia akan melaksanakan penghuraian fail konfigurasi dan operasi lain, dan kemudian menghentikan proses pekerja baharu untuk mula bekerja.
Kemudian kami menghantar isyarat sigwinch kepada tuan lama, dan kemudian proses tuan lama akan menghantar mesej sigquit kepada proses pekerjanya, menyebabkan proses pekerja keluar. Menghantar sigwinch dan sigquit ke proses induk akan menyebabkan proses pekerja terkeluar, tetapi yang pertama tidak akan menyebabkan proses induk terkeluar juga.
Akhir sekali, jika kami merasakan bahawa proses tuan lama telah menyelesaikan misinya, kami boleh menghantar isyarat sigquit untuk membiarkannya keluar.
Bagaimana proses pekerja mengendalikan mesej isyarat daripada tuan
Malah, proses induk berkomunikasi dengan proses pekerja, bukan dengan menggunakan fungsi bunuh, tetapi dengan menggunakan saluran nginx yang dilaksanakan melalui saluran paip, proses induk Tulis maklumat (seperti maklumat isyarat) ke satu hujung paip, dan proses pekerja menerima maklumat dari hujung yang satu lagi Acara saluran nginx ditambahkan pada penjadual acara (seperti epoll, kqueue) apabila proses pekerja baru sahaja bermula, jadi apabila terdapat Apabila data dihantar daripada induk, ia boleh dimaklumkan oleh penjadual acara.
Terdapat sebab mengapa nginx direka bentuk dengan cara ini Sebagai pelayan proksi terbalik yang sangat baik, nginx mengejar prestasi tinggi yang melampau, dan pengendali isyarat akan mengganggu perjalanan proses pekerja, menyebabkan semua acara digantung selama. tempoh masa tetingkap masa, yang mempunyai kehilangan prestasi tertentu.
Ramai orang mungkin berfikir bahawa apabila proses induk menghantar maklumat kepada proses pekerja, proses pekerja akan bertindak balas dengan serta-merta dengan operasi yang sepadan Namun, proses pekerja sentiasa sibuk memproses acara rangkaian dan pemasa . Selepas memanggil pengendali acara saluran nginx, nginx hanya memproses beberapa bendera. Tindakan ini sebenarnya dilaksanakan selepas pusingan penjadualan acara selesai. Oleh itu, terdapat tetingkap masa di antaranya Terutama apabila perniagaan adalah kompleks dan trafik yang besar, tetingkap ini mungkin diperbesarkan Ini sebabnya pelan pemotongan log yang disediakan oleh nginx secara rasmi memerlukan tidur 1s.
Sudah tentu, kami juga boleh memintas proses induk dan menghantar isyarat terus kepada proses pekerja Isyarat yang boleh dikendalikan oleh pekerja termasuk
kesan isyarat
tanda keluar paksa
. sigterm force exit
sigquit anggun keluar
sigusr1 membuka semula fail
Atas ialah kandungan terperinci analisis contoh set isyarat nginx. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!