Linux Sunucu Yapılandırma

  1. Ubuntu
  2. Nginx
  3. UFW
  4. SSL

Sunucuda Kullanıcı Hazırlığı

Sunucuya ilk kez erişildiğinde genellikle root kullanıcı ile giriş yapılır. Ancak güvenlik ve operasyonel sürdürülebilirlik açısından, root kullanıcısının günlük işlemlerde doğrudan kullanılması önerilmez. Bu nedenle ilk adım olarak, yetkilendirilmiş ayrı bir kullanıcı oluşturulur ve yönetim yetkileri bu kullanıcıya devredilir.

Paket Listesini Güncelleme

Yüklenecek yazılımların en güncel adreslerini ve sürümlerini kontrol eder. Sunucunun hangi yazılımın nerede olduğunu bilmesini sağlar.

bash
sudo apt update
sudo apt upgrade -y

Yeni Kullanıcı Oluşturma

Root olarak sunucuya giriş yaptıktan sonra, aşağıdaki komut ile yeni bir kullanıcı oluşturulur. Root kullanıcısını izole ederek, sistemde yapılacak işlemler için daha güvenli ve kontrollü bir kullanıcı alanı oluşturmak.

  • Kullanıcı için bir parola belirlenir
  • Ev dizini (/home/master) otomatik olarak oluşturulur
  • Temel kullanıcı ayarları tanımlanır
bash
sudo adduser master

Kullanıcıya Sudo Yetkisi Verme

Oluşturulan kullanıcının sistem üzerinde yönetimsel işlemler yapabilmesi için sudo yetkisi verilmesi gerekir. Bu işlem, kullanıcının root yetkisi gerektiren komutları kontrollü şekilde çalıştırabilmesini sağlar.

  • Kullanıcı sudo grubuna eklenir
  • Sistem yönetimi gerektiren komutlar sudo ile çalıştırılabilir hale gelir
  • Root hesabına doğrudan giriş ihtiyacı ortadan kaldırılır
bash
usermod -aG sudo master

Lokal Bilgisayarda Anahtar Hazırlığı

Bu işlemler kendi bilgisayarının terminalinde gerçekleştirilir. Amaç, sunucuya parola yerine SSH anahtarı ile güvenli erişim sağlamaktır.

SSH Anahtarı Üretme

Bu komut ile sunucuya bağlanmak için kullanılacak bir SSH anahtarı oluşturulur. Oluşturulan anahtar, kullanıcıya özel dijital bir kimlik görevi görür ve parola kullanımını ortadan kaldırır.

  • ED25519 algoritması kullanılarak güvenli bir anahtar üretilir
  • -f parametresi ile anahtara özel bir isim verilir
  • Varsayılan SSH anahtarlarının üzerine yazılması engellenir
  • İsteğe bağlı olarak anahtar için bir parola (passphrase) tanımlanabilir
bash
ssh-keygen -t ed25519 -C "example@gmail.com" -f ~/.ssh/special_vps_key

Anahtarı Sunucuya Gönderme

Oluşturulan public anahtar bu komut ile sunucuya aktarılır. Bu işlem sonrasında sunucu, ilgili anahtarı tanır ve bu anahtarla yapılan SSH bağlantılarına izin verir.

  • Public anahtar sunucudaki authorized_keys dosyasına eklenir
  • Parola ile SSH girişine gerek kalmaz
  • Daha güvenli ve hızlı bir bağlantı yöntemi sağlanır
bash
ssh-copy-id -i ~/.ssh/special_vps_key.pub master@111.111.111.111

Config Dosyasını Düzenleme

Bu dosya, SSH bağlantıları için istemci tarafında kullanılan yapılandırma dosyasıdır. Tanımlanan her Host girdisi, bir sunucuya ait bağlantı ayarlarını içerir.

bash
nano ~/.ssh/config

Config Dosyasına Eklenecek Ayarlar

Bu yapılandırma ile sunucuya kısa bir isim atanmış olur. Artık terminalde yalnızca ssh myserver komutu kullanılarak bağlantı sağlanabilir.

  • Host myserver sunucuya verilen kısa isimdir
  • HostName sunucunun IP adresini belirtir
  • User bağlantı kurulacak kullanıcıyı tanımlar
  • IdentityFile kullanılacak SSH anahtarının yolunu belirtir
  • AddKeysToAgent yes anahtarın SSH agent’a eklenmesini sağlar
  • UseKeychain yes anahtar parolasının macOS Keychain’de saklanmasını sağlar
bash
Host myserver
  HostName 111.111.111.111
  User master
  IdentityFile ~/.ssh/myserver_vps_key
  AddKeysToAgent yes
  UseKeychain yes

Sunucu Kapılarını Dış Dünyaya Kapatma

Bu aşama, sunucu güvenliğinin en kritik adımıdır. İşlemler, sunucuya SSH anahtarı ile giriş yapıldıktan sonra sunucu içerisinde gerçekleştirilir. Yapılacak hatalar sunucuya erişimi tamamen engelleyebileceği için adımlar dikkatle uygulanmalıdır.

SSH Ayarlarını Düzenleme

Bu dosya, sunucunun dış dünyaya açılan kapısı olan SSH servisinin ana yapılandırma dosyasıdır. Burada yapılan değişiklikler, kimlerin ve hangi yöntemlerle sunucuya bağlanabileceğini belirler. Aşağıdaki kısımları bulun ve düzenleyin. Bu ayarlar sayesinde brute-force (şifre deneme) saldırıları etkisiz hale getirilmiş olur.

  • PermitRootLogin no Root kullanıcısının dışarıdan doğrudan SSH ile giriş yapmasını tamamen engeller.
  • PasswordAuthentication no Parola ile SSH girişini kapatır. Artık sadece yetkilendirilmiş SSH anahtarına sahip cihazlar sunucuya erişebilir.
bash
sudo nano /etc/ssh/sshd_config

SSH Servisini Yeniden Başlatma

Yapılan değişikliklerin aktif hale gelmesi için SSH servisi yeniden başlatılır. Bu işlemden sonra sunucu, yalnızca SSH anahtarı ile bağlantı kabul eder.

  • Root hesabı dış dünyaya tamamen kapatılır
  • Şifre ile giriş denemeleri engellenir
  • Sunucu saldırı yüzeyi minimuma indirilir
bash
sudo systemctl restart ssh

Güvenlik Duvarı (UFW) Kurulumu

Bu aşamada sunucunun dış dünyaya açık olan ağ kapıları (portlar) kontrol altına alınır. UFW (Uncomplicated Firewall), yalnızca izin verilen servislerin sunucuya erişebilmesini sağlar ve yetkisiz tüm bağlantıları engeller.

SSH Kapısını Açma

Sunucuya uzaktan erişim sağlayabilmek için SSH portunun açık olması gerekir. Güvenlik duvarı aktif edilmeden önce bu kural mutlaka eklenmelidir. Aksi halde sunucuya erişim tamamen kaybedilebilir.

bash
sudo ufw allow ssh

Web Kapılarını Açma (HTTP / HTTPS)

Bu kurallar, web sitelerinin 80 (HTTP) ve 443 (HTTPS) portları üzerinden dış dünyaya yayın yapabilmesini sağlar. Ziyaretçilerin siteye erişebilmesi için bu portların açık olması zorunludur.

bash
sudo ufw allow http
sudo ufw allow https

Güvenlik Duvarını Aktif Etme

Tanımlanan tüm kurallar yürürlüğe girer ve güvenlik duvarı aktif hale gelir. Bu aşamadan sonra sunucu, yalnızca izin verilen portlardan gelen bağlantılara cevap verir.

bash
sudo ufw enable

Durumu Kontrol Etme

Bu komut ile güvenlik duvarının aktif olup olmadığı ve hangi portların açık olduğu kontrol edilir. Durumun Active olarak görünmesi, yapılandırmanın başarılı olduğunu gösterir.

  • SSH, HTTP ve HTTPS dışındaki tüm portlar kapatılır
  • Yetkisiz bağlantı denemeleri engellenir
  • Sunucu minimum saldırı yüzeyi ile çalışır
bash
sudo ufw status

Nginx Kurulumu ve Sistemi Tazeleme

Bu aşamada sunucuya web servislerini yayınlayacak olan Nginx kurulumu gerçekleştirilir. Kurulum öncesinde paket listesi güncellenir, ardından Nginx yüklenir ve gerekli durumlarda sistem yeniden başlatılır.

Nginx Kurulumu

Dünyanın en hızlı web sunucu yazılımlarından biri olan Nginx’i kurar. -y takısı kurulum sırasında çıkan onay sorularına otomatik olarak “evet” yanıtını verir.

bash
sudo apt install nginx -y

Sistemi Yeniden Başlatma

Özellikle Pending kernel upgrade gibi kritik sistem güncellemeleri yapıldığında, sunucunun en yeni çekirdek sürümüyle açılması için gereklidir. Bu komutu yazınca bağlantın kopar; yaklaşık 1 dakika bekledikten sonra ssh myserver komutu ile tekrar bağlanabilirsin.

bash
sudo reboot

Nginx Çalışma Durumunu Kontrol Etme

Nginx’in hatasız bir şekilde active (running) durumda olduğunu doğrular. Eğer her şey yolundaysa, sunucu IP adresini tarayıcıya yazdığında Nginx’in varsayılan karşılama sayfası görüntülenir.

bash
sudo systemctl status nginx

Nginx Varsayılan (Default) Temizliği

Bu aşamada Nginx ile birlikte gelen varsayılan (default) yapılandırmalar ve örnek dosyalar sistemden kaldırılır. Amaç, sunucuda yalnızca bizim tanımlayacağımız kuralların ve projelerin çalışmasını sağlamaktır.

Varsayılan Site Konfigürasyonlarını Silme

Nginx’in kurulumla birlikte gelen varsayılan site ayarlarını hem arşiv klasöründen hem de aktif yayın dizininden kaldırır. Bu sayede sunucunun eski veya gereksiz kurallarla çakışmasının önüne geçilir.

bash
sudo rm /etc/nginx/sites-available/default
sudo rm /etc/nginx/sites-enabled/default

Varsayılan Web Klasörünü Silme

Nginx ile gelen Welcome to nginx sayfasını içeren web dizinini tamamen siler. Artık sunucuda otomatik yayınlanan hiçbir varsayılan içerik kalmaz.

bash
sudo rm -rf /var/www/html

Nginx’i Yeniden Başlatma

Yapılan tüm temizlik işlemlerinin Nginx tarafından uygulanabilmesi için servis yeniden başlatılır. Bu işlemden sonra Nginx yalnızca bizim tanımlayacağımız yeni site konfigürasyonlarını bekler durumda olur.

bash
sudo systemctl restart nginx

Proje Dizin Yapısı ve Yetkilendirme

Bu aşamada sunucuda çalışacak tüm Frontend ve Backend projeleri için merkezi, düzenli ve güvenli bir çalışma alanı oluşturulur. Amaç; projeleri sistem dosyalarından ayırmak, yetki karmaşasını önlemek ve uzun vadede sürdürülebilir bir sunucu yapısı kurmaktır.

Ana Proje Dizininin Oluşturulması

Tüm projelerin yer alacağı ana klasör güvenli bölge olan /var/www altında hiyerarşik şekilde oluşturulur. Bu dizin, sunucudaki tüm uygulamaların merkezi çalışma alanı olacaktır.

bash
sudo mkdir -p /var/www/apps

Dizin Sahipliğinin Devredilmesi

Oluşturulan proje dizininin sahipliği master kullanıcısına devredilir. Böylece npm install , git clone veya dosya düzenleme gibi işlemler sırasında sürekli sudo kullanma ihtiyacı ortadan kalkar.

bash
sudo chown -R master:master /var/www/apps

Çalışma Alanına Geçiş

Bundan sonraki tüm Frontend ve Backend projeler bu dizin altında, kendilerine ait alt klasörler içerisinde konumlandırılır. Sunucu üzerinde yapılan tüm geliştirme ve dağıtım işlemleri bu çalışma alanı üzerinden yürütülür.

bash
cd /var/www/apps

Git Konfigürasyonu ve Kimlik Tanımlama

Bu aşamada sunucu üzerinde yapılacak tüm kod değişikliklerinin kime ait olduğunun net bir şekilde kayıt altına alınması sağlanır. Git konfigürasyonu, özellikle GitHub / GitLab entegrasyonlarında logların temiz ve profesyonel görünmesi açısından kritiktir.

Git Versiyon Kontrolünü Doğrulama

Sistemde Git’in yüklü olup olmadığını kontrol eder. Ubuntu 24.04 ile genellikle varsayılan olarak gelir, ancak kontrol etmek en güvenli yaklaşımdır.

bash
git --version

Kullanıcı Adı Tanımlama

Sunucu üzerinde yapılacak tüm commit işlemlerinin senin adınla imzalanmasını sağlar.

bash
git config --global user.name "Sezer Gec"

E-posta Adresi Tanımlama

Git kayıtlarında (logs) görünecek olan resmi e-posta adresini ayarlar. Bu bilgi GitHub / GitLab gibi platformlarla birebir eşleşmelidir.

bash
git config --global user.email "example@gmail.com"

Node.js (NVM) ve PM2 Kurulumu

Bu aşamada Node.js sürümlerini profesyonel şekilde yönetmek için NVM kurulumu yapılır. Ardından Node.js v24 kurulup, uygulamaların arka planda kararlı çalışmasını sağlayacak PM2 yapılandırılır.

NVM (Node Version Manager) Kurulumu

Node.js sürümlerini yönetmek için önerilen en sağlıklı yöntemdir. Resmi NVM projesinin önerdiği betik kullanılır.

bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

NVM’i Aktif Etme

Terminali kapatıp açmaya gerek kalmadan NVM komutlarını mevcut oturumda kullanılabilir hale getirir.

bash
. "$HOME/.nvm/nvm.sh"

Node.js v24 Kurulumu

Güncel ana sürüm olan Node.js v24.x ve beraberinde gelen modern npm v11.x sisteme dahil edilir.

bash
nvm install 24
node -v
npm -v

PM2 Kurulumu

Node.js uygulamalarını arka planda, otomatik yeniden başlatma ve loglama özellikleriyle yöneten süreç yöneticisidir. NVM kullanıldığı için sudo gerekmez.

bash
npm install -g pm2

PM2 Otomatik Başlatma (Startup)

Sunucu her yeniden başladığında PM2 süreçlerinin otomatik ayağa kalkması için işletim sistemine gerekli yetki tanımlanır. Komut sonrası terminalin verdiği sudo env PATH=... ile başlayan satır çalıştırılır.

bash
pm2 startup

PM2 ile Node.js Uygulamasını Arka Planda Çalıştırma

Bu komut, npm start ile uygulamanı PM2 altında çalıştırır, example-project ismiyle listede görünmesini sağlar ve uygulamanın arka planda sürekli çalışmasını yönetir. pm2 save ile mevcut süreçler kaydedilerek sunucu yeniden başlasa bile otomatik başlatılmaları sağlanır.

bash
pm2 start npm --name "example-project" -- start
pm2 save

Nginx Reverse Proxy Host Oluşturma

Bu aşamada Nginx üzerinde uygulamaya özel bir host (server block) tanımlanır. Amaç, dış dünyadan gelen HTTP isteklerini doğrudan backend uygulamanın portuna açmak yerine, Nginx üzerinden güvenli ve kontrollü şekilde yönlendirmektir. Bu yapı production ortamları için temel bir gerekliliktir.

Güvenlik için Catch-All Host

Nginx’in yapılandırma şablonlarının bulunduğu sites-available dizininde, sunucuya gelen tanınmayan domain isteklerini sessizce kapatacak bir dosya oluşturulur. Bu dosya, bilinmeyen veya hatalı domainlerden gelen tüm istekleri yakalayarak güvenliği artırır.

bash
sudo nano /etc/nginx/sites-available/000-catch-all

Reverse Proxy ve Default Davranış

Bu yapılandırma ile Nginx, default server olarak çalışır ve IP veya tanınmayan domainlerden gelen HTTP (Port 80) isteklerini sessizce kapatır. Bu sayede uygulaman yalnızca kendi domainin üzerinden erişilebilir olur.

nginx
server {
    listen 80 default_server;
    server_name _;
    return 444;
}

Sembolik Link Oluşturarak Host’u Aktif Etme

Oluşturulan konfigürasyon dosyası,sites-enabled dizinine sembolik link ile bağlanır. Nginx yalnızca bu dizindeki dosyaları aktif olarak çalıştırır. Bu yaklaşım, konfigürasyonu silmeden hızlıca yayından kaldırabilmeyi sağlar.

bash
sudo ln -s /etc/nginx/sites-available/000-catch-all /etc/nginx/sites-enabled/

Yeni Nginx Host Konfigürasyon Dosyasını Oluşturma

Nginx’in yapılandırma şablonlarının bulunduğu sites-available dizininde projeye özel bir dosya oluşturulur. Bu dosya, ilgili domain veya servis için tüm davranışların tanımlandığı ana merkezdir.

bash
sudo nano /etc/nginx/sites-available/example-site

Reverse Proxy Ayarlarını Yapılandırma

Bu yapılandırma ile Nginx, dışarıdan gelen HTTP (Port 80) isteklerini, arka planda çalışan Node.js uygulamasına (Port 3000) yönlendirir.

nginx
server {
    listen 80;
    server_name example.com;
}

Sembolik Link Oluşturarak Host’u Aktif Etme

Oluşturulan konfigürasyon dosyası,sites-enabled dizinine sembolik link ile bağlanır. Nginx yalnızca bu dizindeki dosyaları aktif olarak çalıştırır. Bu yaklaşım, konfigürasyonu silmeden hızlıca yayından kaldırabilmeyi sağlar.

bash
sudo ln -s /etc/nginx/sites-available/example-site /etc/nginx/sites-enabled/

Global Config Yapısı Oluşturma

Bu yapı, tüm uygulamalarında kullanılacak global proxy ve güvenlik ayarlarını içerir. Klasör oluşturularak merkezi bir config dosyası hazırlanır ve tüm Nginx hostlarında include edilerek kullanılabilir. Bu sayede uygulaman HTTP üzerinden çalışsa bile HTTPS yönlendirmesi, proxy ayarları ve güvenlik header’ları otomatik uygulanır.

bash
sudo mkdir -p /etc/nginx/config
sudo nano /etc/nginx/config/proxy_settings.conf

Global Proxy Tanımlama

Oluşturulan proxy_settings.conf dosyası, uygulamalarında kullanılacak tüm global proxy ve güvenlik ayarlarını içerir. Bu dosya sayesinde uygulaman HTTPS üzerinden güvenli bir şekilde çalışır, HTTP istekleri otomatik olarak yönlendirilir ve SSL ile proxy trafiği merkezi olarak yönetilir.

bash
proxy_http_version 1.1;

# Header ayarları
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Origin $http_origin;
proxy_set_header Content-Type $content_type;

# Cache ve güvenlik
proxy_cache_bypass $http_upgrade;
proxy_redirect off;

# Ek güvenlik header'ları
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

Konfigürasyonu Test Etme ve Nginx’i Yeniden Başlatma

Yapılandırma dosyasında yazım veya sözdizimi hatası olup olmadığı nginx -t komutu ile kontrol edilir. Test başarılıysa Nginx servisi yeniden başlatılarak yeni ayarlar aktif hale getirilir.

bash
sudo nginx -t
sudo systemctl restart nginx

Certbot ile Ücretsiz SSL (HTTPS) Kurulumu

Bu aşamada Let’s Encrypt tarafından sağlanan ücretsiz SSL sertifikası kullanılarak API servisleri HTTPS üzerinden güvenli hale getirilir. Certbot, Nginx yapılandırmasını otomatik olarak algılar ve sertifika yenileme süreçlerini arka planda yönetir. Mobil uygulamalar ve production ortamlar için HTTPS zorunlu kabul edilir.

Certbot Kurulumu

SSL sertifikalarını otomatik olarak alıp yenileyen Certbot aracı ve Nginx entegrasyon paketi sisteme kurulur. Bu paket sayesinde manuel sertifika ve konfigürasyon işlemlerine gerek kalmaz.

bash
sudo apt update
sudo apt install certbot python3-certbot-nginx -y

SSL Sertifikasını Alma

Bu komut sadece Let’s Encrypt üzerinden SSL sertifikası üretir ve dosyalarını /etc/letsencrypt/live/example.com/ altına kaydeder. Nginx’e hiçbir değişiklik yapmaz, otomatik deploy veya server block eklemez.

bash
sudo certbot certonly --manual -d example.com

Nginx Host Dosyasını Düzenle

Bu yapı, uygulamanı güvenli bir şekilde HTTPS üzerinden çalıştırır. HTTP isteklerini HTTPS’e yönlendirir ve SSL sertifikaları ile proxy ayarlarını yönetir.

bash
server {
 listen 80;
 server_name example.com;
 return 301 https://example.com$request_uri;
}

server {
 listen 443 ssl;
 server_name example.com;
 
 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
 include /etc/letsencrypt/options-ssl-nginx.conf;
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
 
 location / {
    proxy_pass http://localhost:3000;
    include /etc/nginx/config/proxy_settings.conf;
 }
}
    

SSL Sertifika Yenileme Testi

Sertifikaların otomatik yenilenme mekanizmasının doğru çalışıp çalışmadığını test eder. Gerçek yenileme yapmaz, sadece simülasyon çalıştırır. Böylece ileride sertifika süresi dolduğunda sorun yaşamazsın.

bash
sudo certbot renew --dry-run

Domain’in Konumunu ve Ayarları Kontrol Etme

Sertifikanın, nginx veya Let’s Encrypt dizinlerinde nerelerde kullanıldığını ve ayarlandığını görmek için kullanılır. Özellikle nginx’de otomatik ekleme yapıldıysa veya eski sertifikalar kaldıysa bunu tespit etmeye yarar.

bash
sudo grep -R "example.com" /etc/nginx /etc/letsencrypt -n

Sertifikayı Tamamen Silmek (isteğe bağlı)

Sertifikaların otomatik yenilenme mekanizmasının doğru çalışıp çalışmadığını test eder. Gerçek yenileme yapmaz, sadece simülasyon çalıştırır. Böylece ileride sertifika süresi dolduğunda sorun yaşamazsın.

bash
sudo certbot delete --cert-name example.com --non-interactive
sudo nginx -t
sudo systemctl reload nginx
Bu Sayfada
copyright © 2026 - sezergec.dev