"Enter"a basıp içeriğe geçin

Net Core Uygulamalarını Linux Üzerinde Çalıştırma

Net Core ile geliştirilen bir uygulamayı Windows, Linux, ve Mac sistemlerde çalıştırabiliriz. Bu yazıda Net Core 2.1 sürümü ile geliştirilmiş bir uygulamayı Ubuntu 16.04 üzerinde nginx kullanarak yayınlayacağız.

Uygulamanın Yayınlanması

Projeyi yayınlamadan önce, reverse proxy üzerinde ssl kullanmak istiyorsanız Startup.cs dosyasına aşağıdaki kodları ekleyin.

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
}

forwarded-headers
Visual Studio kullanıyorsanız Solution Explorer panelinde yer alan proje ismine sağ tıklayıp “Publish” seçeneğini seçin. Karşımıza farklı yayınlama seçenekleri çıkacak. “Folder” seçeneğini seçin. “Advanced” seçeneğine tıklayın ve Configuration seçeneğini “Release”, Deployment Method seçeneğini “Framework Dependent” olarak değiştirin. Değişiklikleri kaydedin ve projenizi yayınlayın.
dotnet-core-publish
publish-settings
Visual Studio kullanmıyorsanız uygulama dizininde bir komut satırı açın ve aşağıdaki komutu çalıştırın

dotnet publish -c Release

Yayınlanan projenizi “bin\Release\netcoreapp2.1\publish\” adresinde bulabilirsiniz.

Hedef Makineye Net Core Runtime Kurulumu

Ubuntu üzerinde Net Core Runtime kurmak için aşağıdaki komutları çalıştırmanız yeterli olacaktır.

wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install aspnetcore-runtime-2.1

Eğer farklı bir linux dağıtımı kullanıyorsanız bu bağlantıdan kurulum yoluna bakabilirsiniz.

Kurulum tamamlandıktan sonra “dotnet –info” komutunu çalıştırarak kurulum ile ilgili detaylı bilgileri görebilirsiniz. Artık Net Core 2.1 ile yazılmış herhangi bir uygulamayı sunucumuzda çalıştırabiliriz.

root@ucanbaklava:/var/www/testapp# dotnet --info

Host (useful for support):
  Version: 2.1.5
  Commit:  290303f510

.NET Core SDKs installed:
  No SDKs were found.

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.5 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.5 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.1.5 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

Publish ettiğimiz dosyaları sunucumuza atıp çalıştıralım. Hedef makine üzerinde uygulamamı bulunduracağım dizini oluşturuyorum.

mkdir /var/www/testapp/

Daha sonra publish etmiş olduğum uygulama dosyalarımı sunucuya gönderiyorum.

scp * kullanıcıadı@sunucuadresi:/var/www/testapp/
dotnet testapp.dll

komutu ile uygulamayı başlatıyorum.

Uygulamamız kestrel web sunucusu ile port 5000 üzerinde çalışıyor. Sıra geldi nginx kurulumu ve ayarlarına.

Nginx

nginx, düşük hafıza kullanımına ve yüksek performansa sahip olacak şekilde geliştirilmiş bir web sunucusudur. Bu yazıda nginx’i reverse proxy yani ters vekil sunucu olarak kullanacağız.

Ubuntu 16.04 üzerinde nginx kurmak için aşağıdaki komutları girin

sudo apt-get update
sudo apt-get install nginx

Kurulum tamamlandıktan sonra aşağıdaki komut ile nginx servisinin çalıştığından emin olun

systemctl status nginx

Nginx öntanımlı olarak sunucu açıldığında otomatik olarak başlayacak şekilde ayarlıdır. Eğer otomatik olarak başlamasını istemiyorsanız aşağıdaki komutu kullanabilirisiniz.

sudo systemctl disable nginx

Şimdi nginx’in uygulamamızı sunması için nginx config dosyasını düzenlemeliyiz.

sudo nano /etc/nginx/sites-available/default

Yukarıdaki komut ile nginx config dosyasını açıp aşağıdaki komutları ekleyin

    server{
        listen 80;
        location / {
            proxy_pass http://localhost:5000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
    }

Config dosyanızı kaydedin ve aşağıdaki komutla config dosyanızda sorun olup olmadığını kontrol edin.

sudo nginx -t

Eğer test başarılı ise aşağıdaki komutla değişiklikleri uygulayın.

sudo nginx -s reload

Uygulamayı Otomatik Olarak Başlatma

Uygulamamızın otomatik olarak başlaması için bir servis oluşturmamız gerekli.
System definition file oluşturma için aşağıdaki komutu çalıştırın

sudo nano /etc/systemd/system/kestrel-helloapp.service

Servis ismine istediğiniz herhangi bir ismi verebilirsiniz. Oluşturduğunuz dosyaya aşağıdaki satırları ekleyin

[Unit]
Description=Example .NET Web API App running on Ubuntu
[Service]
WorkingDirectory=/var/www/testapp
ExecStart=/usr/bin/dotnet /var/www/testapp/testapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

Working Directory kısmına uygulamınızın bulunduğu dizin yolunu girin.
ExecStart kısmına Net Core Runtime ve Uygulamanızın yolunu girin.
User kısmına kullanıcı adını girin.

Dosyayı kendi kurulumunuza göre düzenledikten sonra kaydedin. Servisi etkinleştirmek için aşağıdaki komutu çalıştırın.

sudo systemctl enable kestrel-helloapp.service

Aşağıdaki kod ile serivisi başlatın

sudo systemctl start kestrel-helloapp.service

Bu komutla da servisin çalışıp çalışmadığını kontrol edin.

sudo systemctl status kestrel-helloapp.service

Uygulamanız artık linux makinenizde çalışıyor. Tarayıcınız üzerinden sunucunuzun ip adresini girerek kontrol edebilirsiniz. Oluşturduğumuz servis sayesinde de sunucumuz yeniden başladığında veya dotnet runtime çökse bile otomatik olarak başlayacaktır.

6 Yorum

  1. Furkan
    Furkan Nisan 27, 2019

    Hocam merhaba, ben localhost üzerinden değiled kendi alan adımı kullanmak istiyorum. Bunu nasıl yapabilirim ?

    • admin
      admin Mayıs 25, 2019

      yazıdaki gibi kurulumu yaptıktan sonra alan adının nameserver ayarlarını yapman lazım

  2. enefci
    enefci Mayıs 28, 2019

    buradaki uygulama 5000 portundan yayınlanıyor. örneğin birden fazla uygulama yayınlamak istediğimizde bu port şartını nasıl egale edebiliriz?

    • admin
      admin Mayıs 31, 2019

      Kestrel otomatik olarak 5000 portunu atıyor, değiştirmenin birkaç yolu var.
      Program.cs dosyasında belirtebilirsiniz

      public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
      .UseStartup()
      .UseUrls("http://localhost:5050");

      Uygulamayı çalıştırırken parametre olarak geçebilirsiniz.

      dotnet testapp.dll --urls="https://localhost:5050"

    • Cem SEÇKİN
      Cem SEÇKİN Haziran 30, 2020

      Kestrel şuan maalesef port paylaşımını desteklememektedir. Aynı anda birden fazla kestrel servisini çalıştıramıyorsunuz. Buda linuz te birden fazla asp.net core uygulamasını çalıştıramamanız demek. Bu bir handikap aslında.

  3. Ahmet
    Ahmet Ağustos 25, 2019

    Benim çalışan bir servisim var. Çalışan servisde yapılan değişiklikleri nasıl publish almalıyım. FTP üzerinden dosyaları atıp yeniden, kerstel servisini durdurup, yeniden publish yapıyor ve kerstel servisini başlatıyorum. Ama yapılan değişiklikleri algılamıyor. Bunun nedeni ne olabilir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir