Durdurma ve Yeniden Başlatma

Bu belge Apache HTTPd’nin Unix benzeri sistemlerde durdurulması ve yeniden başlatılması konularını kapsar. Windows NT, 2000 ve XP kullanıcıları Apache HTTPd’yi bu platformlarda nasıl denetimlerine alacaklarını öğrenmek için Apache HTTPd’nin Bir Hizmet Olarak Çalıştırılması sayfasına, Windows 9x ve ME kullanıcıları ise Apache HTTPd’nin Bir Konsol Uygulaması Olarak Çalıştırılması sayfasına bakabilirler.

httpd apachectl Başlatma
Giriş

Apache HTTPd’yi durdurmak ve yeniden başlatmak için çalışan httpd süreçlerine bir sinyal göndermeniz gerekir. Sinyal göndermek için iki yol vardır. İlki, süreçlere doğrudan sinyal göndermek için unix kill komutunun kullanımıdır. Bu suretle, sisteminizde çalışmakta olan bir çok httpd sürecini uyarabilirsiniz ama süreç kimliği PidFile yönergesi ile belirtilen dosyada tutulan ana süreç dışında hiçbirine sinyal göndermemelisiniz. Başka bir deyişle, ana süreç haricinde hiçbir sürece sinyal göndermeye normal olarak ihtiyacınız olmaması gerekir. Ana sürece gönderebileceğiniz dört çeşit sinyal vardır: TERM, USR1, HUP ve WINCH. Bunlar yeri geldikçe açıklanacaktır.

Ana sürece kill ile sinyal göndermek için şöyle bir komut verebilirsiniz:

kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

httpd süreçlerine sinyal göndermenin ikinci yolu -k komut satırı seçeneğini şu değerlerden biri ile kullanmaktır: stop, restart, graceful ve graceful-stop. Bunlar aşağıda açıklanacaktır. -k komut satırı seçeneği httpd’ye ait olsa da ana sürece bu sinyalleri göndermek için apachectl betiğini kullanmanızı öneririz. apachectl, komut satırı seçeneklerini httpd’ye aktaracaktır.

httpd’ye sinyal gönderdikten sonra olup biteni şu komutla izleyebilirsiniz:

tail -f /usr/local/apache2/logs/error_log

Bu örnekleri, kendi ServerRoot ve PidFile yönergelerinizdeki ayarlara uygun olarak değiştirdikten sonra kullanınız.

Hemen Durdur
Sinyal: TERM
apachectl -k stop

Ana sürece TERM veya stop sinyali göndererek tüm çocukların bir an önce öldürülmeye çalışılmasını sağlamış olursunuz. Tüm çocukların öldürülmesi bir kaç saniye sürebilir. Son olarak ana süreç çıkacaktır. Yanıtlanmakta olan istekler hemen sonlandırılacak ve artık isteklere yanıt verilmeyecektir.

Nazikçe Yeniden Başlat
Sinyal: USR1
apachectl -k graceful

Ana sürece USR1 veya graceful sinyalinin gönderilmesi, çocuklara ellerindeki mevcut işleri bitirdikten sonra (veya sundukları bir şey yoksa hemen) çıkmalarının önerilmesi demektir. Ana süreç kendi yapılandırma dosyalarını yeniden okur ve kendi günlük dosyalarını yeniden açar. Ana sürecin öldürdüğü her sürecin yerine yeni yapılandırma kuşağından bir süreç başlatır ve hemen yeni isteklere hizmet sunulmaya başlanır.

Bu kod MPM’lerin süreçleri denetleyen yönergelerine daima uyacak şekilde tasarlanmıştır. Bu suretle, istemcilere hizmet sunacak çocuk süreçler ve evreler, yeniden başlatma işleminde de uygun sayıda sağlanmış olur. Bununla birlikte, StartServers yönergesinde şöyle davranılır: İlk saniye içinde en azından StartServers sayıda yeni çocuk oluşturulmamışsa iş olmayan bir devreyi geçiştirecek kadarı oluşturulur. Ardından sunucunun mevcut yükünü karşılamak için gereken sayıda çocuk süreç oluşturulur. Bu suretle, kod her ikisi için de gereğini yerine getirmeye çalışmış olur.

mod_status kullanıcıları USR1 gönderildiği zaman sunucu istatistiklerinin sıfırlanmadığı konusunda uyarılacaktır. Kod, sunucunun yeni isteklere yanıt veremediği zamanı en aza indirmenin yanısıra ayar parametrelerinize de uymak üzere tasarlanmıştır (yeni istekler işletim sistemi tarafından kuyruğa alınacağından bir istek kaybı olayı yaşanmaz). Bunu sağlamak için, her iki kuşağın çocuklarının izini sürecek bir çetele tutulur.

mod_status modülü, nazikçe yeniden başlat komutunun verilmesinden önce başlamış ve sunulmaya devam eden isteklere bakan çocukları imlemek için ayrıca bir G (Graceful’un baş harfi) kullanır.

Günlük dosyası döndürme betiğine, yeniden başlatma öncesi günlüğe yazan tüm çocukların işini bitirdiğini USR1 kullanarak bildirmenin bir yolu yoktur. Önerimiz, eski günlük kaydı üzerinde bir işlem yapmaya başlamadan önce USR1 sinyali gönderilmesinin ardından belli bir süre beklenilmesi olacaktır. Örneğin, düşük band genişliğine sahip istemcilere hizmet sunan çoğu sürecin işinin 10 dakikadan önce bitmeyeceğini gözönüne alarak eski günlük üzerinde işlem yapmaya başlamak için 15 dakika beklenebilir.

Bir yeniden başlatma isteğinde, yapılandırma dosyalarında bir hata olmadığından emin olmak için önce bir sözdizimi denetimi yapılır. Eğer yapılandırma dosyalarınızda bir hata varsa bu sözdizimi hatasıyla ilgili bir hata iletisi alırsınız ve sunucu yeniden başlamayı reddeder. Bu yolla, bir hata sonucu sunucunun çökerek yeniden başlamaması nedeniyle işlevsiz bir sunucuyla başbaşa kalmanız önlenmiştir.

Ancak, bu hala sunucunuzun düzgünce yeniden başlatılmasını garanti etmeyecektir. Yapılandırma dosyalarınızı sözdizimi denetiminin yanında anlamlandırılması bakımından da sınamak için httpd’nin root olmayan bir kullanıcı tarafından çalıştırılmasını deneyebilirsiniz. Eğer yapılandırma dosyalarında bir hata yoksa soketleri ve günlük dosyalarını açmaya çalışırken root aidiyetinde çalışmadığından veya çalışmakta olan asıl sunucu bu portları zaten dinlediğinden başarısız olacaktır. Eğer başka bir sebeple başarısız olursa olası sebep bir yapılandırma dosyası hatasıdır ve asıl sunucuya ‘nazikçe yeniden başla’ komutunu vermeden önce bu hatayı düzeltmeniz gerekir.

Hemen Yeniden Başlat
Sinyal: HUP
apachectl -k restart

Ana sürece HUP veya restart sinyalinin gönderilmesi tüm çocukların TERM sinyali gönderilmiş gibi öldürülmesine sebep olur fakat ana sürecin çıkmasını sağlamaz. Ana süreç yapılandırma dosyalarını yeniden okur ve günlük kayıt dosyalarını yeniden açar. Bunların ardından isteklere yanıt verecek yeni kuşak çocukları oluşturmaya başlar.

mod_status kullanıcıları bir HUP sinyalı gönderildiğinde sunucu istatistiklerinin sıfırlandığı konusunda uyarılırlar.

‘Nazikçe yeniden başlat’ komutundaki gibi yeniden başlatma öncesi bir sözdizimi denetimi yapılır. Eğer yapılandırma dosyalarınızda sözdizimi hatası varsa yeniden başlatma işlemi gerçekleşmez ve sözdizimi hatalarıyla ilgili bildirim alırsınız.
Nazikçe Durdur
Sinyal: WINCH
apachectl -k graceful-stop

Ana sürecin WINCH veya graceful-stop sinyalini alması, çocuklara ellerindeki mevcut işleri bitirdikten sonra (veya sundukları bir şey yoksa hemen) çıkmalarının önerilmesine sebep olur. Ana süreç bunun hemen ardından PidFile dosyasını siler ve port dinlemeyi keser. Ana süreç çalışmaya ve isteklere yanıt vermekte olan çocuk süreçleri izlemeye devam eder. Tüm çocuklar işlerini bitirip çıktığında veya GracefulShutdownTimeout ile belirtilen zaman aşımı dolduğunda ana süreç de kendini sonlandırır. Eğer zaman aşımı devreye girmişse o an çalışmakta olan çocuk süreçlere TERM sinyali gönderilerek hemen çıkmaları sağlanır.

Bir TERM sinyali ile "graceful" durumundaki tüm çocuklar ve ana süreç hemen sonlandırılacaktır. Bununla birlikte, PidFile dosyası da silineceğinden, artık apachectl veya httpd’yi bu sinyali göndermek için kullanamayacaksınız.

graceful-stop sinyali, aynı anda, aynı yapılandırma ile çok sayıda httpd kopyasının çalıştırılabilmesine imkan verir. Bu, Apache nazikçe yükseltileceği zaman güçlü bir özellik haline gelmekteyse de, bazı yapılandırmalarda yarış koşullarının oluşmasına ve kısır çekişmelere (deadlock) sebep olabilir.

Sunucunun süreç kimliğini içeren Lockfile ve ScriptSock gibi dosyaların disk üzerindeki mevcudiyetlerinin sorunsuz olarak devam ettiğinden emin olunmaya çalışılmalıdır. Ayrıca, bir yapılandırma yönergesi, üçüncü parti bir modül veya kalıcı CGI uygulamalarına ait disk kilit veya durum dosyaları olabilir; httpd’nin birden fazla kopyasının çalışması nedeniyle bu dosyaların da üzerine yazılmadığından emin olunmaya çalışılmalıdır.

rotatelogs tarzı borulu günlükleme kullanımı gibi durumlarda yarış koşullarının oluşması olasılığına karşı uyanık olunmalıdır. Aynı günlük kayıt dosyalarını aynı anda döndürmeye çalışan birden fazla rotatelogs kopyasının çalıştırılması halinde bunların her biri diğerlerinin günlük kayıt dosyalarının kaybına sebep olabilir.