Linux Centos Üzerinde NGINX ile .NET Core Uygulamalarını Çalıştırmak
Microsoft tarafında .NET Core’a geçiş ile birlikte artık .NET uygulamalarını platform bağımsız (Windows/Linux/Mac) çalıştırabiliyoruz. Bu makale de Linux tarafında sunucu üzerinde kullanılan en popüler işletim sistemlerinden biri olan Centos’u tercih edeceğiz. Centos üzerinde olduğu gibi RedHat, Ubuntu vb. bir çok Linux dağıtımı üzerinde de .NET Core’u çalıştırabiliriz.
Not: Makalede yapılan işlemler yeni kurulmuş bir Linux Centos 8 sunucuya SSH ile bağlanılarak gerçekleştirilmiştir.
Her seferinde sudo yazmamak için root kullanıcısına geçiş yapıyoruz. Alternatif olarak aşağıdaki komutların başına sudo ekleyebiliriz.
sudo su
Sunucu üzerinde .NET kurulumu için https://dotnet.microsoft.com/download adresine gidiyoruz. Sekmelerden Linux’u seçiyor ve sunucu üzerine kurulum yapacağımızdan “Runtime” olanı tercih ediyoruz. “SDK” (Software Development Kit) paketi geliştirme ortamları için tercih edilmektedir. Centos için kurulum yapacağımız için listeden Centos seçimini yapıyoruz. Biz Centos 8 üzerine kurulum yapacağız ancak Centos 7 ve üzeri desteklendiğinden “Centos 7″ seçimi yaparak devam ediyoruz.
İşletim sistemi repolarına kurulum için Microsoft repo’sunu ekliyoruz.
rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm.
.NET Core kurulumunu gerçekleştiriyoruz. Örneğimizde güncel sürüm 3.0 olduğu için bu versiyon ile devam edeceğiz.
yum install aspnetcore-runtime-3.0
.NET Core kurulumdan sonra sıra geldi Nginx kurulumuna. İşletim sistemi repoları güncellemek için update komutunu çalıştırıyoruz. Bu işlem sunucumuzun internet bağlantısına göre biraz zaman alabilir. Yeni kurulan bir sunucu ise kısa bir sürede tamamlanacaktır.
yum update
Kurulum yaptığımız sırada en güncel versiyon 1.14.1 olduğu için bununla devam edeceğiz. Repodaki (varsayılan Centos reposu) güncel sürüm kontrolünü yapmak için yum info komutundan faydalanabiliriz. “yum info nginx”.
Kurulum işlemini başlatıyoruz.
yum install nginx
şeklinde kurulum için onay isteyecektir. “y” yazıp enterlayıp devam ediyoruz. Sisteminizdeki yüklü paketlere göre boyut ve kurulum süresi değişecektir. Nginx ile beraberinde çalışması gereken paketleri beraber yükleyecektir. “Complete!” yazısını gördüğümüzde Nginx kurulumuzu tamamlamış oluyoruz!
Şimdi Nginx için servisimizi aktif edelim ve çalıştıralım.
systemctl enable nginx systemctl start nginx
Yukarıdaki komutlar çalıştıktan sonra bir hata almadıysak Nginx çalışıyor demektir. Buraya kadar her şey sorunsuz. Herhangi bir konfigürasyon yapmadığımız için Nginx, üzerindeki varsayılan html dosyası 80 portundan yanıt verecektir.
Not: Hata ile karşılaşırsak “/var/log/nginx/error.log” altından hata loglarına bakabiliriz.
Mevcut durumda Centos üzerindeki firewall’dan erişim izni vermediğimiz için sadece sunucu içerisinden erişim sağlayabiliriz. Firewall üzerinde 80 (http) ve 443 (https) portları için gerekli izinleri veriyoruz.
firewall-cmd --permanent --zone=public --add-service=http firewall-cmd --permanent --zone=public --add-service=https firewall-cmd --reload
Yukarıdaki işlemleri tamamladıktan sonra sunucumuza dışarıdan 80 portu üzerinden http ile erişmeye çalıştığımızda (80 varsayılan http portudur, belirtmenize gerek yoktur.) aşağıdaki gibi bir sayfa ile karşılaşacağız.
Not: Varsayılan html dosyası adresi: /usr/share/nginx/html
Her şey mükemmel! Şimdi sunucu üzerinde barındırmak istediğimiz uygulamalarımız için (web sitesi, api vs.) gerekli konfigürasyonları yapabiliriz. Örnek olarak sinanbozkus.com alan adını kullanacağız.
Nginx konfigürasyonları için bilmemiz gereken iki önemli adres var.
nginx konfigürasyon dosyası: /etc/nginx/nginx.conf ekleyeceğimiz uygulamaların/web sitelerinin konfigürasyon dosyaları /etc/nginx/conf.d/
Konfigürasyon dosyasını düzenleyebilmek için açıyoruz.
nano /etc/nginx/nginx.conf
Not: Sunucu üzerinde nano editörü yok ise “yum install nano” komutu ile kurabiliriz.
Dosyası içerisinde server adı altında Nginx varsayılan uygulamasının yayında olduğu bir tanımlama var. Bu satırları kaldırıyoruz veya isteğe bağlı olarak yorum satırlarına (#) çeviriyoruz.
server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
Editör’den değişiklikleri kaydederek çıkıyoruz. (CTRL + X ardından y)
Varsayılan uygulamayı kapatmamıza rağmen sunucuya istekte bulşunduğumuzda uygulama halen gelecektir. Yaptığımız değişikliklerin aktif olabilmesi için Nginx’e “reload” işlemi gerekmektedir. Buna daha sonra değineceğiz.
Yorum satırına aldığımız server tanımlamasının hemen üstünde “include /etc/nginx/conf.d/*.conf;” şeklinde bir komut yazılmış. Bu komut ilgili klasördeki “.conf” uzantılı tüm konfigürasyon dosyalarını okuyup Nginx’in bu yapılandırmalara göre başlamasını sağlıyor. Biz de konfigürasyon dosyalarımızı bu klasör altında oluşturacağız.
İlgili klasöre gidiyoruz.
cd /etc/nginx/conf.d/
İçerisinde “sinanbozkus.com” için bir Nginx konfigürasyon dosyası oluşturuyoruz.
nano sinanbozkus.com.conf
Aşağıdaki tanımlamayı ekliyoruz.
server { listen 80; server_name sinanbozkus.com; 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; } }
Birden fazla alan adı için aşağıdaki gibi tanımlama yapabiliriz.
server_name sinanbozkus.com www.sinanbozkus.com;
Editör’den değişiklikleri kaydederek çıkıyoruz. (CTRL + X ardından y)
Yukarıdaki tanımlama da Nginx’e sinanbozkus.com’a Http ile (80 portu üzerinden) gelen isteklerin sunucu içerisinde çalışan “http://localhost:5000″ adresine yönlendirileceğini söyledik. Nginx burada bir köprü (proxy) görevi görmektedir. Örnekte bir port belirtmediğimiz için, varsayılan 5000 portundan çalışacaktır. Burada işletim sisteminin kullanmadığı boşta olan herhangi bir portu da kullanabiliriz. Genel kullanımda 5001,5002 gibi 5000 numaralandırmalı portlar tercih edilmektedir.
Yaptığımız değişikliklerin Nginx üzerinde aktif olabilmesi için reload işlemini gerçekleştiriyoruz
nginx -s reload
Not: Config tanımlamalarında yaptığımız her değişiklikten sonra nginx servisini yeniden başlatmamız veya reload komutunu uygulamamız gerekmektedir.
Bu işlem sonrasında sunucumuza ulaşmaya çalıştığımızda dışarıdan yanıt alamayacağız. Benzer şekilde sinanbozkus.com olarak denediğimizde de yanıt alamayacağız çünkü localhost 5000 üzerinde çalışan bir uygulamamız yok.
Ana dizindeki “var” klasörü altında uygulamalarımızı barındıracağımız “www” adında bir klasör, sonrasında ise içerisine uygulamamızı barındıracak klasörü oluşturacağız.
mkdir /var/www mkdir /var/www/sinanbozkus.com
Uygulamamıza ait dosyaları “/var/www/sinanbozkus.com” klasörü altına atıyoruz.
Not: Dosyaları sunucuya nasıl atacağınız hakkında bilgi sahibi değilseniz veya bir devops aracı kullanmıyorsanız en basit haliyle bir yere zip dosyasını yükleyip, indirdikten sonra bu zip dosyasını ilgili klasöre açabilirsiniz. “wget http://www….com/publish.zip” sonrasında ise “unzip publish.zip”
Şimdi .NET Core uygulamamız için bir servis oluşturacağız ve az önce yüklediğimiz dosyalarla birlikte http://localhost:5000 üzerinde çalıştıracağız.
nano /etc/systemd/system/kestrel-sinanbozkus.com.service
İçerisine aşağıdaki kodları ekliyoruz.
[Unit] Description=Sinan Bozkus Blog [Service] WorkingDirectory=/var/www/sinanbozkus.com ExecStart=/usr/bin/dotnet /var/www/sinanbozkus.com/SinanBozkusCom.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
Not: ExecStart=/usr/bin/dotnet /var/www/sinanbozkus.com/SinanBozkusCom.dll Bu kısım önemli. İlgili klasör yolunu ve DLL dosyasının adını kendi projenize değiştirmeniz gerekmektedir.
Farklı bir port kullanmak isterseniz aşağıdaki komutu ekleyebilirsiniz.
Environment=ASPNETCORE_URLS=http://localhost:1881
Editör’den değişiklikleri kaydederek çıkıyoruz. (CTRL + X ardından y)
Şimdi oluşturduğumuz kestrel servisini önce aktif ediyor, ardından çalıştırıyoruz.
sudo systemctl enable kestrel-sinanbozkus.com.service sudo systemctl start kestrel-sinanbozkus.com.service
Not: Eğer servis dosyasını oluşturduktan sonra üzerinde bir düzenleme yaparsak, düzenleme işlemi sonrasında “systemctl daemon-reload” komutunu çalıştırmamız ve servisi stop&start yapmamız gerekmektedir.
Aşağıdaki komutu çalıştırarak Httpd script ve modüllerinin network’e erişmesine izin veriyoruz.
setsebool -P httpd_can_network_connect 1
Tüm bu işlemleri tamamladıktan sonra artık uygulamamıza ulaşabiliriz.