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 }
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.
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.
Hocam merhaba, ben localhost üzerinden değiled kendi alan adımı kullanmak istiyorum. Bunu nasıl yapabilirim ?
yazıdaki gibi kurulumu yaptıktan sonra alan adının nameserver ayarlarını yapman lazım
buradaki uygulama 5000 portundan yayınlanıyor. örneğin birden fazla uygulama yayınlamak istediğimizde bu port şartını nasıl egale edebiliriz?
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"
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.
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.