Bagaimana cara mendapatkan Apache2 untuk menunggu inisialisasi jaringan?

2

Server baru saja ditingkatkan dari Squeeze ke Wheezy. Setelah reboot, saya mencatat bahwa apache2 tidak memulai, jadi instal bootlogd untuk memeriksa output skrip init.

Output kesalahan dari awal apache adalah,

Tue Feb  3 08:49:55 2015: [....] Starting web server: apache2(99)Cannot assign requested address: make_sock: could not bind to address [0123:4567:890:abc::d]:80
Tue Feb  3 08:49:55 2015: no listening sockets available, shutting down
Tue Feb  3 08:49:55 2015: Unable to open logs
Tue Feb  3 08:49:55 2015: Action 'start' failed.
Tue Feb  3 08:49:55 2015: The Apache error log may have more information.

Stempel waktu di keluaran boot menunjukkan 4s antara "Konfigurasi antarmuka jaringan" (08:49:51) dan mulai apache.

Saya telah mengatasi ini dengan memasukkan sleep 5ke dalam /etc/init.d/apache2setelah apache2 mulai baik-baik saja, jadi saya membacanya sebagai inisialisasi jaringan lambat (mungkin khusus untuk jaringan IPv6). Server berjalan di VMWare, dan saya hanya memiliki akses ke VM.

  • Metode apa yang lebih baik yang bisa saya gunakan untuk membuat Apache menunggu beberapa detik dan memeriksa alamatnya sudah berjalan sebelum mulai?
  • Atau untuk membuat skrip init jaringan tidak keluar sampai alamatnya siap?
Chris Burgess
sumber
“Server baru saja ditingkatkan dari Squeeze ke Wheezy.” Saya punya perasaan lucu yang menjadi masalah. Mungkin instalasi yang lebih lama dari Apache berjuang untuk mendapatkan koneksi jaringan? Berarti dua set konfigurasi Apache? Inisialisasi jaringan dapat menjadi "herring merah" karena Anda terhubung ke kotak dan saya menganggap itu melalui jaringan?
JakeGould
Jaringan init karena output init Apache mengeluhkan ketidakmampuan untuk mengambil alamat ... kecuali ditunda beberapa detik. Hanya satu Apache yang memasang hadiah melalui paket Debian stok, tidak ada layanan lain di port 80/443.
Chris Burgess
Wow. Masih terdengar aneh. Anda tidak harus melakukan apa pun untuk mengatasinya. Tetapi saya memiliki alat pemantauan mandiri yang saya gunakan yang saya percaya akan menjadi alternatif yang bagus untuk init.dmeretas. Baru saja memposting jawaban lengkap. Semoga ini bisa membantu!
JakeGould

Jawaban:

0

Metode apa yang lebih baik yang bisa saya gunakan untuk membuat Apache menunggu beberapa detik dan memeriksa alamatnya sudah berjalan sebelum mulai?

Nah, metode yang saya uraikan jelas tidak menyelesaikan masalah mendasar. Tapi saya percaya menggunakan alat pemantauan mandiri yang dapat menangani tugas "menendang Apache ke layanan" tanpa harus meretas init.dskrip adalah solusi yang lebih stabil. Kuncinya adalah menggunakan monityang digambarkan sendiri sebagai:

Monit adalah utilitas Open Source kecil untuk mengelola dan memantau sistem Unix. Monit melakukan pemeliharaan dan perbaikan otomatis dan dapat melakukan tindakan kausal yang bermakna dalam situasi kesalahan.

Untuk menginstalnya di Ubuntu, lakukan saja ini; Saya menggunakan aptitudedan ini di Ubuntu 12,04 FWIW:

sudo aptitude install monit

Setelah terinstal, saya ingin mengatur server email default untuk mengirim peringatan. Ini mengasumsikan Anda memiliki postfixatau sendmailaktif di server Anda. Buka monitfile kontrol dengan editor teks favorit Anda; Saya suka menggunakan nano:

sudo nano /etc/monit/monitrc

Cari set mailserverbaris dan atur baris ini dan simpan monitfile kontrol:

set mailserver localhost

Sekarang periksa dan pastikan ada monit conf.dpengaturan direktori; disinilah monittugas individu diatur:

ls -la /etc/monit/conf.d

Jika entah bagaimana /etc/monit/conf.ditu tidak diatur, buat seperti ini:

sudo mkdir /etc/monit/conf.d

Sekarang setelah itu selesai, mari kita buat monitaturan Apache. Pertama, cari tahu di mana .pidfile Apache diatur dan periksa apakah sudah diatur. Ini biasanya di mana ia diatur pada Ubuntu 12.04 menggunakan instalasi paket Apache default:

ls -la /var/run/apache2.pid

Jika .pidfilepath itu benar, mari kita buat aturan monitApache yang sebenarnya dengan nanoseperti ini:

sudo nano /etc/monit/conf.d/apache2.conf

Dan tempatkan kode ini di file itu dan simpan:

check process apache with pidfile /var/run/apache2.pid
        start "/etc/init.d/apache2 start"
        stop  "/etc/init.d/apache2 stop"
        if failed host 127.0.0.1 port 80
                with timeout 15 seconds
        then restart
        alert [email protected] only on { timeout, nonexist }

Logika ke skrip cukup sederhana: monitApache ruleset akan memeriksa /var/run/apache2.pidfile dan ia tahu untuk menggunakan init.darahan khusus startdan stoplogika. Sihir berasal dari if/ thenblok yang pada dasarnya memonitor port Apache 80di localhost 127.0.0.1dan akan mengambil tindakan untuk memulihkan Apache jika ada batas waktu 15 detik atau lebih. Dan alertsaluran akan mengirimkan peringatan email ke alamat email yang ditentukan jika kondisi timeoutatau nonexistterpenuhi; itu opsional jadi jangan ragu untuk berkomentar jika Anda tidak perlu dibanjiri oleh peringatan email.

Sekarang restart monit:

sudo service monit restart

Dan Anda dapat mengikuti monitlog di sini untuk melihatnya melakukan hal itu dan men-debugnya jika sesuatu tidak berfungsi seperti yang diharapkan:

sudo tail -f -n 200 /var/log/monit.log

Jadi ketika debu mengendap di server itu, Anda akan memiliki monitpengaturan untuk memastikan Apache berjalan. Sangat berguna sebagai alat umum "jaga agar server web Apache tetap hidup", tetapi dalam kasus Anda monitdapat mengambil alih tugas untuk memastikan Apache muncul saat reboot / startup sehingga Anda tidak perlu repot-repot dengan init.dskrip Apache inti yang benar-benar agak berantakan dan mudah dilupakan di masa depan saat upgrade.

Juga perhatikan, saya dapat melihat bahwa Anda mengikat Apache secara eksplisit ke IPv6, tetapi skrip pemantauan ini mengasumsikan bahwa jika tidak dapat mencapai 127.0.0.1maka ia harus mengambil tindakan. Mungkin Anda perlu mengubah alamat localhost IPv4 dari 127.0.0.1ke alamat setara IPv6 ::1. Eksperimen dan lihat apa yang berhasil.

JakeGould
sumber