Aracılığıyla paylaş


Bölüm 2.3 - ASP.NET Core uygulamasını otomatik olarak başlatacak şekilde yapılandırma

Şunlar için geçerlidir: .NET Core 2.1, .NET Core 3.1, .NET 5

Bu makalede, sunucunun yeniden başlatılmasından sonra uygulamanın otomatik olarak başlatılmasını sağlamak için ASP.NET Core uygulamasının nasıl yapılandırılması anlatılır.

Önkoşullar

Bu bölümdeki alıştırmaları takip etmek için Linux'ta yüklü ve dağıtılmış bir ASP.NET Core web uygulamanız olmalıdır.

Ayrıca, istekleri 80 numaralı bağlantı noktasından arka uç ASP.NET Core uygulamasına yönlendirmek için Nginx web sunucusunu ters proxy olarak yapılandırmanız gerekir.

Bu bölümün hedefi

Bu serinin önceki bölümlerinde Nginx'in ters ara sunucu olarak nasıl yapılandırılır ve HTTP 502 proxy hatasının nasıl giderilir gösterildi. HTTP 502 yanıt kodunun nedeni, Nginx trafiği ona iletmeye çalıştığında arka uç ASP.NET Core uygulamasının çalışmamış olmasıdır.

Sorun, ASP.NET Core uygulamanızı el ile çalıştırarak geçici olarak çözüldü. Peki ya uygulama kilitlenirse? Yoksa sunucunun yeniden başlatılması mı gerekiyor? ASP.NET Core uygulamasını her seferinde el ile yeniden başlatmak pratik bir çözüm değildir. Bu nedenle, bu bölümde Linux'u uygulamanızı kilitledikten sonra başlatacak şekilde yapılandıracaksınız.

Şimdiye kadar Nginx ve ASP.NET Core'ı birlikte çalışacak şekilde yapılandırdık. Nginx, 80 numaralı bağlantı noktasını dinler ve istekleri 5000 numaralı bağlantı noktasını dinleyen ASP.NET Core uygulamasına yönlendirir. Nginx otomatik olarak başlasa da, sunucu her yeniden başlatıldığında ASP.NET Core uygulamasının el ile başlatılması gerekir. Aksi takdirde, ASP.NET Core uygulaması düzgün bir şekilde çıkar veya kilitlenir.

ASP.NET Core'u IIS'yi ara sunucu olarak çalıştırarak çalıştırırsanız, işlem yönetimini IIS ASP.NET Core Modülü (ANCM) işler ve ASP.NET Core işlemi otomatik olarak başlar. Bir diğer seçenek de ASP.NET Core'u Windows'ta hizmet olarak çalıştırmaktır, böylece otomatik başlatma özelliği bilgisayar başlar başlamaz yapılandırılabilir.

ASP.NET Core uygulamanız için hizmet dosyası oluşturma

Komutun systemctl "hizmetleri" veya "daemon'ları" yönetmek için kullanıldığını hatırlayın. Daemon, Windows hizmetininkine benzer bir kavramdır. Böyle bir hizmet, sistem başlatıldığında otomatik olarak yeniden başlatılabilir.

Hizmet dosyası nedir?

Linux'ta, işlem çıktığında daemon'ların davranışını denetlemek için kullanılan bir ".service" uzantısına sahip birim yapılandırma dosyaları da vardır. Bunlar hizmet dosyaları, birim dosyaları ve hizmet birimi dosyaları olarak da bilinir.

Bu hizmet dosyaları aşağıdaki dizinlerden birinde bulunur:

  • /usr/lib/systemd/: İndirilen uygulamalar için hizmet dosyalarını depolar
  • /etc/systemd/system/: Sistem yöneticileri tarafından oluşturulan hizmet dosyalarını depolar

Nginx hizmet dosyasını inceleyin. Paket yöneticisi aracılığıyla yüklenir. Yapılandırma dosyası /usr/lib/systemd/system/ klasöründe olmalıdır. komutu çalıştırılırken systemctl status nginx hizmet dosyasının konumu da görüntülenir.

systemctl status nginx komutunun ekran görüntüsü.

Nginx hizmet dosyası böyle görünür.

Cat komutunun ekran görüntüsü.

ASP.NET Core uygulamaları için örnek hizmet dosyası

Aşağıdaki örnek birim dosyası içeriği, Nginx ile Linux üzerinde Konak ASP.NET Core'dan alınmıştır:

[Unit]
Description=Example .NET Web API App running on Ubuntu

[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

Bu içeriğin bazı önemli yönleri şunlardır:

  • WorkingDirectory , uygulamanızı yayımladığınız dizindir.
  • ExecStart , uygulamayı başlatan gerçek komutdur.
  • Restart=always kendi kendine açıklayıcıdır. Bu işlem, el ile veya kilitlenme nedeniyle bir nedenden dolayı durdurulursa her zaman başlatılır.
  • RestartSec=10 ayrıca açıklayıcıdır. İşlem durdurulduktan sonra 10 saniye geçtikten sonra başlatılır.
  • SyslogIdentifier önemlidir. "Sistem günlüğü tanımlayıcısı" anlamına gelir. Daemon hakkındaki bilgiler sistem günlüklerinde bu adla günlüğe kaydedilir. Bu tanımlayıcıyı, işleminizin PID'sini bulmak için de kullanabilirsiniz.
  • User hizmeti yöneten kullanıcıdır. Sistemde bulunmalı ve uygulama dosyalarının uygun sahipliğine sahip olmalıdır.
  • Hizmet dosyasında istediğiniz sayıda ortam değişkeni ayarlayabilirsiniz.

Not

Kullanıcı www-data , sistemdeki özel bir kullanıcıdır. Bu hesabı kullanabilirsiniz. Linux'ta kullanıcı izinlerini uygulamak için yeni bir kullanıcı oluşturacaksınız. Ancak, başka bir Linux kullanıcısı oluşturmak istemiyorsanız kullanabilirsiniz www-data .

ASP.NET Core uygulaması için hizmet dosyası oluşturma

Hizmet dosyasını oluşturmak ve düzenlemek için kullanacaksınız vi . Hizmet dosyanız /etc/systemd/system/ klasörüne gider. Bu seride ilk uygulamanızı /var/firstwebapp/ klasörüne yayımladığını unutmayın. Bu nedenle, WorkingDirectory bu klasörü işaret etmelidir.

İşte son yapılandırma dosyası:

[Unit]
Description=My very first ASP.NET Core applications running on Ubuntu

[Service]
WorkingDirectory=/var/firstwebapp/
ExecStart=/usr/bin/dotnet /var/firstwebapp/AspNetCoreDemo.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=myfirstapp-identifier
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

Sudo vi /etc/systemd/system/myfirstwebapp.service komutunu çalıştırın, son yapılandırmayı yapıştırın ve dosyayı kaydedin.

sudo komutunun ekran görüntüsü.

Bu, ASP.NET Core web uygulamasının daemon olarak çalışması için gerekli yapılandırmayı tamamlar.

Web uygulaması artık bir hizmet olarak yapılandırıldığından, komutunu çalıştırarak systemctl status myfirstwebapp.servicedurumunu de kontrol edebilirsiniz. Aşağıdaki ekran görüntüsünde görebileceğiniz gibi uygulama devre dışı bırakılmıştır (sistem yeniden başlatıldıktan sonra otomatik olarak başlatılmaz) ve şu anda çalışmıyor.

systemctl status komutunun ekran görüntüsü.

Hizmeti başlatmak için komutunu çalıştırın sudo systemctl start myfirstwebapp.service ve durumu yeniden denetleyin. Bu kez hizmetin çalıştığını görmeniz ve yanında bir işlem kimliği listelenmesi gerekir. Komut çıktısı, yeni oluşturulan hizmet için sistem günlüklerinden son birkaç satırı ve hizmetin üzerinde http://localhost:5000dinlediğini gösterir.

sudo systemctl start komutunun ekran görüntüsü.

Web uygulaması beklenmedik bir şekilde durursa, 10 saniye sonra otomatik olarak yeniden başlatılır.

Son bir adım vardır: Hizmet çalışıyor ancak etkinleştirilmedi. "Etkin", sunucu başlatıldıktan sonra otomatik olarak başlatıldığını gösterir. Bu, istenen son yapılandırmadır. Hizmetin etkinleştirildiğinden emin olmak için aşağıdaki komutu çalıştırın:

sudo systemctl enable myfirstwebapp.service

sudo systemctl enable komutunun ekran görüntüsü.

Bu, ASP.NET Core uygulamanız için bir kilometre taşıdır çünkü sunucu yeniden başlatıldıktan veya işlem sonlandırıldıktan sonra otomatik olarak başlatacak şekilde yapılandırmış olmanız gerekir.

ASP.NET Core uygulamasının otomatik olarak yeniden başlatılıp başlatılmadığını test edin

Sonraki bölüme geçmeden önce her şeyin beklendiği gibi çalıştığından emin olun. Geçerli yapılandırma aşağıdaki gibidir

  • Nginx otomatik olarak çalışır ve 80 numaralı bağlantı noktasında gönderilen istekleri dinler.
  • Nginx ters ara sunucu olarak yapılandırılır ve istekleri ASP.NET Core uygulamasına yönlendirir. Uygulama 5000 numaralı bağlantı noktasını dinliyor.
  • ASP.NET Core uygulaması, sunucu yeniden başlatıldıktan veya işlem durdurulduğunda veya kilitlendiğinde otomatik olarak başlatacak şekilde yapılandırılır.

Bu nedenle, ASP.NET Core hizmeti her durduğunda 10 saniye içinde yeniden başlatılmalıdır. Bu davranışı test etmek için işlemi durmaya zorlayacaksınız. 10 saniye içinde yeniden başlamasını bekleyebilirsiniz.

Not

ASP.NET Core uygulamasının geçerli işlem kimliği. Burada gösterilen girişimin işlem kimliği, işlem sonlandırılana kadar 5084'dür. ASP.net Core uygulamanızın işlem kimliğini bulmak için komutunu çalıştırın systemctl status myfirstwebapp.service .

İşlemin durmasını zorlamak için aşağıdaki komutu çalıştırın:

sudo kill -9 <PID>

Not

9 sinyal türü aşağıdadır. sinyal komutuna man göre, 9 SIGKILL (sonlandırma sinyali). Bu konu hakkında daha fazla bilgi edinmek için "kill and signal" komutunu kullanarak man Yardım sayfalarını açabilirsiniz.

Komutu komutun systemctl status myfirstwebapp.service kill hemen ardından çalıştırın, yaklaşık 10 saniye bekleyin ve aynı komutu yeniden çalıştırın.

Kill komutunun ekran görüntüsü.

Bu ekran görüntüsünde aşağıdaki bilgileri görebilirsiniz:

  • Öldürülmeden önce, ASP.NET Core işleminin işlem kimliği 5084'tür.
  • Hizmet durumu, PID 5084 kullanan işlemin sonlandırıldığını ve otomatik yeniden başlatma yapılandırıldığından yeniden etkinleştirildiğini gösteriyordu.
  • Birkaç saniye sonra yeni bir işlem (PID 5181) başlatıldı.

kullanarak curl localhostsiteye erişmeye çalışırsanız, ASP.NET Core uygulamasının hala yanıt verdiğini görmeniz gerekir.

Sonraki adımlar

Bölüm 2.3.1 - [İsteğe bağlı] Linux'ta ASP.NET Core uygulamasını farklı bir kullanıcı altında otomatik olarak başlatacak şekilde yapılandırın.