Linux'ta Node.js ile Amansız TCP Sunucu Kurulumu - 1

Web işleriyle uğraşanlar, projelerine elektronik unsurlar da eklediğinde, testlerini çabucak gerçekleştirebilmek için hızlıca iş görecek bir TCP, UDP, HTTP sunucuya ihtiyaç duyarlar.

Ben ise bu işler için Node.js kullanıyorum. Hızlıca bir şeyler yapmaya kalkıştığımız için de bazen aldığımız paketlerden dolayı yazdığımız script göçebiliyor. Bunu da Linux ortamında pek sevilen Monit ve Node.js scriptimizi /etc/init klasörüne ekleyeceğimiz birkaç satırlık bir dosya ile servis haline geterek çözebiliyoruz.

Evet, başlıyoruz:

Node.js ve npm - Kurulum

İlk adımımız Node.js ve npm kurulumunu gerçekleştirmek. Bunun için Ubuntu'da şu satırları çalıştırıyoruz12:


echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install # ok, fine, this step probably takes more than 30 seconds...
curl https://npmjs.org/install.sh | sh

npm Node.js kullanırken zaman zaman ihtiyacımız olan eklentileri kolaylıkla projemize eklememizi sağlayan bir paket yöneticisi. Uygulamamıza özel olarak istediğimiz eklentiyi3:

npm install socket.io

Şeklinde ekleyebilir, ya da eğer bu eklenti sürekli karşımıza çıkacak ise:

npm install socket.io -g

komutunu kullanarak global kütüphanemize ekleyebiliriz.

Node.js ve NPM - Uygulama Testleri

Kurulumumuzu tamamladığımıza göre artık ilk testlerimizi yapabiliriz. Önce bir modül kuralım. Ben socket.io'yu zaten kurmuş olduğum için, bolca kullanılan coffee-script4 eklentisini yüklüyorum.


[root@vnklnx korayal]# npm install coffee-script -g
/usr/local/bin/coffee -> /usr/local/lib/node_modules/coffee-script/bin/coffee
/usr/local/bin/cake -> /usr/local/lib/node_modules/coffee-script/bin/cake
coffee-script@1.4.0 /usr/local/lib/node_modules/coffee-script 

Evet, gördüğümüz üzere kurulum başarılı bir şekilde gerçekleşti.

Şimdi de Node.js kurulumumuz olmuş mu onu test edelim. Tek yapmamız gereken node yazıp gönderdikten sonra, herhangi bir JavaScript komutunu çalıştırmak:


[root@vnklnx korayal]# node
> 1+1
2
> 
(^C again to quit)
> [root@vnklnx korayal]# 

(İki kez *CTRL+C ile node konsolundan çıkış yapabiliyoruz.)*

Evet, Node.js de sorunsuz çalışıyor. Bundan sonra bir ornek-dosya.js dosyası oluşturup konsolda:
node ornek-dosya
komutunu göndererek istediğimiz scripti çalıştırabiliriz. (node.js otomatik olarak js uzantılarını göz ardı edebiliyor.)

Node.js - Örnek TCP Sunucu Uygulaması

Buraya da hemen şuradaki örneği kırpıp /var/www/apps/haydar/haydar.js dosyamıza koyuverelim:
(Türkçeleştirme ve port değişikliği)

Node.js Uygulamasının Servis Haline Getirilmesi

Diyelim ki uygulamamızı hazırladık ve bunu arka planda servis olarak çalıştırmak istiyoruz. Bu işlemi Ubuntu ile birlikte gelen Upstart5'ı kullanacağız.

Bunun için öncelikle /etc/init klasörüne haydar.conf dosyamızı aşağıdaki içerikle ekliyoruz:


#!upstart
description "HaydarMatik"
author      "Koray Al"

start on startup
stop on shutdown

script
    export HOME="/root"

    echo $$ > /var/run/haydar.pid
    exec sudo -u root /usr/local/bin/node /var/www/apps/haydar/haydar.js >> /var/log/haydar/haydar.sys.log 2>&1
end script

pre-start script
    # Date format same as (new Date()).toISOString() for consistency
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/haydar/haydar.sys.log
end script

pre-stop script
    rm /var/run/haydar.pid
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/haydar/haydar.sys.log
end script

Yine özetlemek gerekirse:

  1. OS açılımında start komutunu, kapandığında da stop komutunu çalıştır.
  2. Uygulama başlatıldığında script bölümünü çalıştır. ( sudo -u root /usr/local/bin/node /var/www/apps/haydar/haydar.js >> /var/log/haydar/haydar.sys.log 2>&1 )
  3. Uygulama başlamadan önce pre-start bölümünü, kapandığında da pre-stop bölümünü çalıştır.

Yukarıdaki satırların güzelliği, aynı zamanda Node.js uygulamanızın tüm çıktısını da haydar.sys.log dosyasına aktarıyor olması. Bu sayede arka planda çalışan uygulamanız göçtüğünde, ne olmuş ne bitmiş görmeniz de mümkün. (Tabi son üründe bu tip bir log dosyası tutmak çok saçma olacaktır, o durumlarda node.js uygulamanızın log düzeyini de kısmakta fayda var.)

Monit - Kurulum

Monit, aslında oldukça kapsamlı bir takip servisi. Ben ise çoğu diğer yazılımlarda olduğu üzere kendime lazım olan kadarını bilmeye gayret gösteriyorum.
Bu örnekte tek yaptığım kontrol, uygulamamın çalıştığı TCP portunu kurcalayıp, bağlantı yok ise uygulamayı yeniden başlatmak.

Kurulum için tek yapmanız gereken aşağıdaki komutu çalıştırmak6:

sudo apt-get install monit

Kurulum bittikten sonra şu komut ile monit kurulumunun tamamlanıp tamamlanmadığını kontrol edebilirsiniz:


[root@vnklnx korayal]# service monit restart
Stopping monit:                                            [  OK  ]
Starting monit: Starting monit daemon with http interface at [*:2812]
                                                           [  OK  ]

Monit - Konfigürasyon

Monit, /etc/monit/monitrc dosyasının son satırında da görüleceği üzere /etc/monit.d/ klasöründe bulunan bütün dosyaları include ediyor. Böylece uygulamalarımıza özel olarak ayrı ayrı dosyalarda konfigürasyonları tutabiliyoruz. Benim kullanacağım dosya adı: /etc/monit.d/haydar

Evet, uygulamamızın adı Haydar olacak. Dosyamızın içeriği ise şu şekilde:


#!monit
set logfile /var/log/monit.log

check process haydar with pidfile "/var/run/haydar.pid"
    start program = "/sbin/start haydar"
    stop program  = "/sbin/stop haydar"
    if failed port 11337 type tcp with timeout 10 seconds then restart

Bu uygulamamız adım adım:

  1. /var/run/haydar.pid dosyasına sahip haydar işleminin çalışıp çalışmadığını kontrol ediyor.
  2. Uygulamanın başlatma komutunu tanımlıyor.
  3. Uygulamanın kapatma komutunu tanımlıyor.
  4. 11337 numaralı TCP portuna 10 saniye sonunda timeout olması durumunda yeniden başlatıyor.

Bu kontrolü ise /etc/monit/monitrc dosyasındaki "set daemon 60" satırına göre 60 saniyede bir yapıyor.


  1. https://gist.github.com/579814 ↩︎

  2. https://gist.github.com/579814#file_node_and_npm_in_30_seconds.sh ↩︎

  3. https://npmjs.org/package/socket.io ↩︎

  4. http://coffeescript.org/ ↩︎

  5. http://upstart.ubuntu.com/getting-started.html ↩︎

  6. http://ghosttx.com/2012/03/how-to-install-monit-on-ubuntu-11-10-server-to-monitor-apache-web-server-mysql-ssh/ ↩︎