Linux sistemlerde systemd servis dosyası oluşturulması ve servisin açılışta otomatik başlatılması
- Linux
- systemd
- Node.js
İçindekiler
systemd üzerine yazılmış birçok kaynak var. Bu da onlardan biri; benim sunucularımda sonuç aldığım yöntemi anlatıyorum.
systemd nedir?
Linux sistemlerin açılışında, sistemin sunacağı hizmetleri başlatan ve yöneten yapıya systemd (system daemon) deniyor. Sistem boot edildiğinde tanımlı servisler başlatılır, her biri kendi PID’i (Process ID) ile izlenir; çöken bir servis istenirse otomatik olarak yeniden başlatılır.
Geliştirdiğimiz uygulamaları mikro servisler halinde küçük parçalara ayırıyoruz. Her bir Node.js modülü bir servisin görevini karşılıyor; modüller event-driven bir yapıda çalışıyor. Alınan veriler kritik ve bir servisin diğerinin işlevini bloklamaması gerekiyor. Her servisi ayrı bir systemd birimi olarak tanımlamak, proje büyüdükçe bakımı ve kontrolü kolaylaştırıyor.
Servis için ayrı bir kullanıcı
Servisi root olarak çalıştırmayın. Bir açık bulunursa saldırgan tüm sisteme erişir. Bunun yerine yalnızca bu iş için, oturum açamayan bir sistem kullanıcısı oluşturun ve uygulamayı /opt altına taşıyın:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin nodeapp
sudo mkdir -p /opt/nodejs-mqtt
sudo chown -R nodeapp:nodeapp /opt/nodejs-mqttServis dosyasını oluşturmak
Kendi servis dosyalarınız /etc/systemd/system altına konur. /lib/systemd/system paket yöneticisine aittir ve güncellemelerde üzerine yazılabilir.
sudo nano /etc/systemd/system/node-device.service[Unit]
Description=nodejs - micro service device.js
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=nodeapp
WorkingDirectory=/opt/nodejs-mqtt
ExecStart=/usr/bin/node /opt/nodejs-mqtt/device.js
Restart=always
RestartSec=10
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.targetBirkaç not:
network-online.target: servis MQTT broker’ına bağlanacağı için ağın gerçekten hazır olmasını bekler.network.targetbunu garanti etmez.ExecStart: Node’un tam yolunuwhich nodeile bulun. nvm ile bir kullanıcının ev dizinine kurulan Node, servis kullanıcısı tarafından görülemez; servisler için sistem genelinde kurulu Node kullanın.- Loglar için ayrıca ayar gerekmez: systemd, servisin çıktısını varsayılan olarak journal’a yazar.
Servisi başlatmak
systemd’nin yeni dosyayı görmesi için yapılandırmayı yeniden yükleyin, ardından servisi hem şimdi başlatıp hem de açılışta otomatik çalışacak şekilde etkinleştirin:
sudo systemctl daemon-reload
sudo systemctl enable --now node-device
systemctl status node-deviceServis hatasız yapılandırılmışsa çıktıda active (running) görünür. Logları canlı izlemek için:
journalctl -u node-device -fBu örneği referans alarak sisteminize istediğiniz kadar servis ekleyebilirsiniz. Çalışan tüm servisleri şu komutla listeleyebilirsiniz:
systemctl list-units --type=service --state=runningGüncelleme notu
Bu yazının ilk hali 2018’de Medium’da yayımlandı. O sürümde servis root olarak, /lib/systemd/system altında ve nvm’e sabitlenmiş bir Node yoluyla çalışıyordu; loglar da artık eskimiş StandardOutput=syslog ayarıyla yönlendiriliyordu. Burada bunları güncel ve güvenli karşılıklarıyla değiştirdim.
Yeni yazılar e-postanıza gelsin
Yeni bir yazı yayımladığımda kısa bir e-posta alırsınız. İstediğiniz zaman tek tıkla çıkabilirsiniz. Gizlilik