Linux Üzerinde Nginx ile .NET Uygulamasını Deploy Etmek

alihan
7 min readApr 19, 2024

--

Image is taken from: https://endpointsystems.com/blog/azure-ad-nginx-aspnetcore

Bugünkü yazıda sanal bir linux makine üzerinde nginx ile deployment yapmayı anlattım. Ayrıca aynı anda iki uygulamayı ayağa kaldırmaktan ve local denemeler için host dosyasının ayarlarından da bahsettim. Kendi çalışmalarım için local denemeler yaptığım ve aldığım notları sizinle paylaşıyorum, keyifli okumalar.

Sanal makinamızın kurulumlarını tamamladıktan sonra uncomplicated firewall’ı (UFW) çalıştıralım. Aşağıdaki komut UFW her açılıştı otomatik olarka başlatacak şekilde ayarlar. UFW sistem yöneticilerinin iptables’ı daha etkin yönetebilmelerini sağlayan bir arayüzdür. Önce update ve upgrade komutlarını çalıştıralım daha sonra UFW’yi enable edelim.

sudo apt-get update
sudo apt-get upgrade
sudo ufw enable

Şimdi makinemiz üzerinde nginx kuralım. Nginx , yüksek performans, kararlılık, basit yapılandırma ve düşük kaynak tüketimi ile bilinen bir web sunucusu, ters proxy sunucusu ve e-posta (IMAP/POP3) proxy sunucusudur. Asenkron olay işleme mimarisi sayesinde, Nginx yüksek trafikli web sitelerinde mükemmel ölçeklenebilirlik ve hız sağlayarak, aynı anda binlerce bağlantıyı etkin bir şekilde işleyebilir. Nginx, yük dengeleme ve HTTP önbelleğe alma gibi özelliklerle dinamik ve statik içerik servisi yapabilme yeteneği ile modern uygulama altyapılarının ihtiyaçlarına hizmet eder. Şimdi Linux terminalde aşağıdaki komutu çalıştıralım. Burada tam sürüm ya da hafif sürüm seçeneği tamamen ihtiyaca göre belirlenebilir. Biz hafifsürüm üzerinden gidelim.

sudo apt install nginx-full
sudo apt install nginx

çıkan mesaja Y diyerek enter’a basalım

yükleme tamamlandıktan sonra aşağıdaki komutla beraber hangi profillerin ufw ye tanımlandığını görebiliriz.

Burada gördüğünüz gibi Nginx Full versiyonu da görünmekte. Halbuki biz hafif sürüm olanı kurmuştuk diyebilirsiniz fakat bu sadece bir uygulama profilidir yani nginx’in kendisi ile profil gelmiştir ama ek modüller henüz yüklenmemiştir gibi düşünebiliriz. Dilersek aşağıdaki komutla Nginx’in hangi modül ile yüklendiğini kontrol edebiliriz.

nginx -V

Şimdi aşağıdaki komutla dilerseniz Nginx e gelen Http/Https komutlarına izin verelim. Burada dilersek Nginx Full yazarak iki porta da izinleri açabiliriz. Aşağıdaki komutları kullanarak hem izinleri verip hem de kontrollerini sağlayalım.

sudo ufw allow ‘Nginx HTTP’
sudo ufw allow ‘Nginx Full’

Bu işlemi de tamamladıktan sonra tarayıcımızda http://localhost’u açalım. Bizi nginx’in ekran karşılayacak.

.NET Kurulumu

Şimdi sıra geldi .NET SDK’sını indirmeye. Önce arama çubuğuna “install dotnet linux” yazalım ve çıkan ilk siteden Microsoft’un resmi internet sitesine gidelim. Ben Ubuntu’nun 22.04 versiyonunu kullanıyorum. Sitedeki yönlendirmeyi takip ederek doğru indirme linkinin olduğu yere ulaşıyorum ve dotnet in son sürümü olan .NET 8’i indiriyorum.

sudo apt-get install -y dotnet-sdk-8.0

Yükleme tamamlandıktan sonra aşağıdaki komut ile şablonları kontrol edebiliriz.

Geliştirme ortamında .NET Projeleri içinde Program.cs dosyasında UseHttpRedirection() komutunu şu şekilde yapılandıralım.

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
app.UseHttpsRedirection();

}

Daha sonra launchsettings.json dosyası altında applicationUrl kısmını kaldıralım ve bu haliyle publish edelim.

    "profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}

Publish dosyalarımızı home dizini altında oluşturduğumuz Projects/BlazorWebApp klasörüne atalım.

Bu kısmı tamamladıktan sonra /var/www/ dizinine gidelim ve dotnet_sites klasörünü oluşturalım. Publish dosyalarımızı bu klasör altına kopyalayalım. Burada bizden admin yetkisi isteyeceğinden işlerimizi terminal üzerinden halledelim. /var/www/ içindeyken aşağıdaki komutu çalıştırabiliriz.

sudo mkdir dotnet_site

Şimdi kopyalama işlemini gerçekleştirelim:

sudo cp -r /Projects/BlazorWebApp /var/www/dotnet_sites/BlazorWebApp

Uygulamamıza adres çubuğunda http://localhost:5000 değil de custom bir adres üzerinden bağlanmak istersek /etc altında hosts dosyasını aşağıdaki gibi düzenleyip kaydedebiliriz.

NOT: /etc altındaki dosyaları değiştirebilmek için yönetici izni sağlamalısınız. Bunun için aşağıdaki komutu kullanabilirsiniz.

sudo chmod 777 /etc/hosts

Şimdi Nginx’i HTTP isteklerini uygulamamıza iletecek şekilde yapılandırmamız gerekiyor. Bunun için önce /etc/nginx/sites_available/default dosyası ve /etc/nginx/sites_enabled/default dosyaları arasında bir symlink oluşturmak gerekir. Daha detaylı Açıklamak gerekirse:

  • /etc/nginx/sites-available/: Bu dizin genellikle Nginx sunucu bloklarının (veya sanal sunucuların) yapılandırma dosyalarını içerir. Bu dosyalar kullanılabilir yapılandırma şablonları olarak düşünülebilir, ancak Nginx tarafından doğrudan kullanılmazlar.
  • /etc/nginx/sites-enabled/: Nginx, web sunucusunu başlatırken bu dizindeki yapılandırma dosyalarını okur ve uygular. Bu nedenle, bir siteyi etkinleştirmek için, sites-available dizinindeki yapılandırma dosyasının sites-enabled dizinine sembolik bir bağlantısının olması gerekir.

Şu komutu çalıştıralım:

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default

Bu komut ile, sites-available dizinindeki default dosyasını sites-enabled dizinine sembolik bir bağlantı (symlink) olarak eklemiş oluyoruz. Bu sayede, Nginx'in yapılandırma dosyalarını doğru bir şekilde okumasını ve uygulamasını sağlıyoruz. Dosya kurulum ile birlikte oluşmuş olabilir. Bu durumda ek aksiyon almamıza da gerek yok. Daha sonra sites_available içindeki default dosyasının bir kopyasını alalım ve ismini değiştirelim.

sudo cp /etc/nginx/sites/available/default/etc/nginx/sites-available/BlazorWebApp

Tekrar symlink oluşturalım.

sudo ln -s /etc/nginx/sites/available/BlazorWebApp /etc/nginx/sites-available/BlazorWebApp

bir metin düzenleyici ile açalım ve şu şekilde değiştirelim.

http {
map $http_connection $connection_upgrade {
"~*Upgrade" $http_connection;
default keep-alive;
}
server {
listen 80;
server_name blazorwebapp.com;
location / {
proxy_pass <http://127.0.0.1:5000/>;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
}
}
}

Bütün bu değişiklileri yaptıktan sonra nginx’i yeniden başlatalım ve bağlatıyı kontrol edelim.

Daha sonra projemizin publish dosyalarının olduğu dizine gidelim ve çalıştıralım.

Görüldüğü üzere projemiz 5000 portu üzerinden ayağa kalktı. Kontrol edelim. Adres çubuğuna verdiğimiz custom domain name’i girerek bakabiliriz.

İlk websitemiz ayağa kalktı. Aşağıdaki komutla nginx’e gelen trafiği izleyebiliriz.

sudo tail -f /var/log/nginx/access.log

Aynı Anda İki Uygulama Örneği

Öncelikle home dizininde Projects klasörü altında BlazortTestApi isimli bir klasör oluşturmuştuk. Bunun içine aynı şekilde publish aldığımız dosyaları atıyoruz. Burada dikkat etmemiz gereken husus Program.cs dosyasını düzenlerken konfigürasyonu aşağıdaki şekilde yapmayı unutmamak.

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see <https://aka.ms/aspnetcore-hsts>.
app.UseHsts();
app.UseHttpsRedirection();
}

aynı zamanda artık farklı portlar kullanacağımız için appsettings.json dosyası içinde yapılandırmaya gitmemiz gerekiyor. Kestrel’i şu şekilde oluşturalım ve publish alıp dosyaları daha önceden belirttiğimiz yere atalım.

Şimdi yeniden aşağıdaki komutu kullanarak dosyaları dotnet_sites dizinine kopyalayım.

sudo cp -r /Projects/BlazorTestApi /var/www/dotnet_sites/BlazorTestApi

Bu sitemize de custom domain üzerinden erişmek istediğimizi farzedelim ve etc/hosts dosyasına custom domain blazortestapi.com olacak şekilde ekleyelim. Daha sonra etc/nginx/sites-available/default dosyasının bir kopyasını alalım ve aşağıdaki komutla yeniden symlink oluşturalım.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/BlazorTestApi

symlink oluşturalım.

sudo ln -s /etc/nginx/sites/available/BlazorTestApi/etc/nginx/sites-available/BlazorTestApi

Dosyanın içini aşağıdaki gibi konfigüre edelim.

http {
map $http_connection $connection_upgrade {
"~*Upgrade" $http_connection;
default keep-alive;
}
server {
listen 80;
server_name blazortestapi.com;
location / {
proxy_pass <http://127.0.0.1:5005/>;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
}
}
}

Neredeyse her şey tamamlandı sayılır. Şimdi nginx’i yeniden başlatalım ve bağlantımızı kontrol edelim.

Uygulamalarımızı sırayla çalıştırabiliriz artık.

cd /var/www/dotnet_sites/BlazorWebApp
dotnet BlazorWebApp.dll

cd /var/www/dotnet_sites/BlazorTestApi
dotnet BlazorTest

Artık her iki uygulamamıza da erişim sağlayabiliriz.

Uygulamayı Otomatik Başlatma

Bu haliyle sistem her yeniden başladığında uygulamamızı elle ayağa kaldırmak durumundayız. Aşağıdaki adımları takip ederek bunu otomatik hale getirelim.

1 — Önce etc/systemd/system altına gidelim

2 — blazorwebapp.service dosyasını oluşturalım ve aşağıdaki metni içine yapıştıralım

[Unit]
Description= Example of an ASPNET.CORE
After=nginx.service
[Service]
WorkingDirectory=/var/BlazorWebApp/
ExecStart=/usr/bin/dotnet /var/BlazorWebApp/BlazorWebApp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=blazorwebapp-identifier
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

3 — Terminal açalım ve aşağıdaki komutları çalıştıralım

sudo systemctl daemon-reload
sudo systemctl start blazorwebapp.service

Servisin durumunu kontrol edelim

sudo systemctl status blazorwebapp.service

Servisi her açılışta otomatik ayağa kalkacak şekilde ayarlayalım

sudo systemctl enable blazorwebbapp.service

KAYNAKÇA

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response