İşletim sistemlerinde arka tarafta çalışan, kullanıcı ile etkileşimde olmayan bir çok uygulama olur, bildiğiniz gibi. Bunlara da en temelinde, basitçe “servis” diyoruz. Her işletim sisteminde farklı şekilde yönetilir ve çalışırsa da temel olarak uygulamaların; arka planda çalışıp, kullanıcı ile etkileşim olmadan, belli yönetimsel işlemleri yapmasını sağlarlar. Örnek olması için Windows ortamlarındaki IIS(Internet Information Services)’in üzerinden geçebiliriz. svchost.exe’nin servis olarak çalışır olması sayesinde; IIS’in temel özellikleri aktif olduğu takdirde, işletim sisteminin Web Server özellikleri arka planda çalışır. Bu sayede çeşitli web uygulamaları çalıştırabilir hale geliriz. Uygulamalar da w3wp.exe ile IIS “process”’leri olarak çalışır…Bunların başka çok ayrıntısı var, asıl konumuz bunlar olmadığı için ve taaa buradan “Offf…Kes!!! Bunları biliyoruz.” dediğinizi duyduğum için konuya giriyorum… 🙂

Peki konu ne?

Bu yazıda ASP.NET Core web uygulamaları, Linux tabanlı işletim sistemlerinde, nasıl servis olarak çalıştırılabilir bundan bahsetmeye çalışacağım. Daha çok bazı temel kavramlardan bahsederek, yönelmeniz gereken konulara yöneltici bir yazı olmasını amaçlıyorum. Bir nevi aklınızdaki; “İşletim sisteminin sürekli çalışan bir web uygulaması nasıl olur? Her seferinde konsoldan çalıştırmak yerine otomatik çalışan hale nasıl getiririm?” gibi sorulara cevap olması için, basit bir anlatım yapmaya çalışacağım. Her türlü ayrıntıyı, bilgiyi ve soruyu yorum kısmından paylaşabilirsiniz. Başlıyoruz…

Malum ASP.NET Core ile geliştirdiğimiz web uygulamaları farklı işletim sistemleri üzerinde de çalışabiliyor. Temel olarak bu çalışma yöntemi, IIS’e gerek olmadan, ASP.NET Core için geliştirilen Kestrel üzerinden gerçekleşiyor. Kestrel için basitçe: “ASP.NET Core için geliştirilmiş, HTTP protokolü olan bir nevi sunucu uygulaması” diyebiliriz.

Kestrel’in en büyük özelliği basit ve yalın olması. Belli bir “servis” yaklaşımı dolayısıyla yok. Bir tane program, ASP.NET Core uygulamasını çalıştırıyormuş gibi düşünebilirsiniz. Aslında, ASP.NET Core ile geliştirilen web uygulamaları çalışmak için Kestrel’i kullanıyor, diye düşünmek daha doğru bir yaklaşım olacaktır.

Bu arada ASP.NET Core uygulamaları Apache, IIS, Nginx gibi farklı servisler ile de çalışabilmekte. Bunlar “reverse proxy” yaklaşımı ile yine Kestrel üzerinden host edilmesi için kullanılır. Bu konular üzerine ilginiz varsa, daha derinlere girebilirsiniz. Çünkü arka plan tamamen derya deniz…Konumuzdan çok uzaklaşmadan ASP.NET Core uygulamalarını nasıl, daha önceki yaklaşımlara göre çalıştırabiliriz buna geçelim.

ASP.NET Core uygulamamızı çalıştırmak için “dotnet Application.dll” yazıyoruz terminal ya da konsoldan bildiğiniz gibi. Eee her seferinde böyle konsoldan mı başlatacağız. Bunun yerine bir servis olsa, onu start/stop edip uygulamamız başlasa, belli durumlarını takip etsek falan filan…

Öncelikle Linux işletim sistemlerinde, servisler systemd olarak adlandırılan program blocklarından sorulur. systemd sayesinde çalışacak servisimiz için bir tanım/konfigürasyon dosyası diyebileceğimiz ama aslında “unit file” olarak adlandırılan bir dosya yaratmamız lazım. Bunun için, konsola aşağıdaki gibi aşağıdaki komutu yazalım;

sudo nano /etc/systemd/system/OrnekCoreUygulamasi.service

Bu sayede içeriğini oluşturabileceğimiz şekilde nano’yu kullanabiliriz. Herhangi bir UI’a sahip bir text editör de kullanabilirsiniz. Burada önemli olan yaratacağımız dosyanın path’i. Açıkcası /lib/systemd/system içerisinde de olabilir. Tüm /usr, /run ve /lib klasörleri altındaki systemd/system klasörlerine Linux sırayla bakar.

Aşağıdaki gibi bir içerikle, servis için bir “unit file” dosyası yaratıyoruz. Bu temel olarak servisin, nasıl çalışacağı, servisin açıklamasının ne olacağı, hata durumunda ne olacağı ve servis tipi falan gibi bilgileri içeren bir text içerik. Linux işletim sistemlerindeki servis tanımları için olmazsa olmaz bir yapı “unit file”. Daha fazla ayrıntı ve neler yapılabilir öğrenmek için direkt dalın derinlere. 🙂

[Unit]
Description=Basit bir ASP .NET Core Web Uygulamasi

[Service]
WorkingDirectory=/home/OrnekKlasor
ExecStart=/usr/bin/dotnet /home/OrnekKlasor/OrnekCoreUygulamasi.dll
Restart=on-abort
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

Burada şu an, bizim için önemli olan kısım ExecStart ile başlayan satır. ExecStart, servis olarak çalışacak komutun yazıldığı satır. Buraya doğru path’ler ile basitçe dotnet Application.dll’i yazmış olduğumuzu düşünebilirsiniz. Bu arada buraya bash script’i yazıp, asıl komutların bash script içerisinde olmasını tavsiye ederim. Değişiklikleri yapmak ve yönetmek için daha kolay olacaktır.

Servis ile ilgili temel işlemleri yapmak için systemctl komutunu kullanabilirsiniz. systemd ile ilgili tüm servisleri yönetmek için systemctl komutundan faydalanır. Çok ama çok fazla yapılabilecek aksiyon olduğu için araştırmanızı tavsiye ederim, ama basit işlemler için aşağıdaki komutları örnek olarak verebilirim. Temel işlemler için How To Use Systemctl to Manage Systemd Services and Units | DigitalOcean sayfasına de göz atın mutlaka.

Servisin “unit file” tarafındaki her değişikliğin güncellenmesi için mutlaka aşağıdaki komutun çalıştırılması gerekmektedir; systemd daemon’ını tekrar yüklemek için gereklidir.sudo systemctl daemon-reload

Servisin durumunu aktifleştirmek için;
sudo systemctl enable OrnekCoreUygulamasi.service
Servisi başlatmak için;
sudo systemctl start OrnekCoreUygulamasi.service
Servisi durdurmak için;
sudo systemctl stop OrnekCoreUygulamasi.service
Servisin durumunu kontrol etmek için;
sudo systemctl status OrnekCoreUygulamasi.service

komutlarını kullanabilirsiniz.

Temel olarak bu şekilde, geliştirmiş olduğunuz ASP.NET Core web uygulamalarını Linux dağıtımlarında servis olarak basitçe çalıştırabilirsiniz. Açıkcası hem Linux’a hakim kişilerin “dotnet” ile tanışması, hem de ASP.NET ile yetkin kişilerin Linux ile tanışmasını amaçlayan bir yazı olsun istedim. Umarım biraz olsun faydalı olur. Bir sonraki yazıda görüşüne kadar, bol bol debelenin… 🙂