Pardus Sunucu Üzerinde Webmin ile Nginx Web Sunucusu Kurulumu ve Yapılandırması
Bir önceki adımda DNS altyapısını kurduğumuz ağımızda, şimdi de isim çözümlemesi yapılan adreslerimize (örneğin www.bilisim.local) bir web sayfası sunmak için Nginx kurulumunu gerçekleştireceğiz. Nginx, yüksek performansı ve düşük kaynak tüketimi ile bilinen, Pardus sunucular için mükemmel bir web sunucusu (web server) tercihidir.
BIND9 senaryomuzdaki yapı üzerinden devam edeceğiz.
Senaryo Hatırlatması:
Sunucu IP: 192.168.101.250
Web Adresi (FQDN): www.bilisim.local
Adım 1: Nginx Paketlerinin Kurulumu
Webmin, sistemde kurulu olan servisleri yönetir. Bu nedenle önce Nginx'in temel paketlerini Pardus depomuzdan kurmamız gerekiyor.
Pardus sunucunuzun terminalini açın (veya SSH ile bağlanın).
Paket listelerini güncelleyip Nginx'i kurun:
Bashsudo apt update sudo apt install nginx -yKurulum tamamlandıktan sonra servisin çalıştığından emin olmak için durumunu kontrol edin:
Bashsudo systemctl status nginx(Çıktıda yeşil renkli "active (running)" yazısını görmelisiniz. Çıkmak için
qtuşuna basın.)
Adım 2: Web Klasörünün (Document Root) Hazırlanması
Web sitemize ait dosyaların (HTML, CSS, resimler) duracağı bir klasör oluşturmalıyız. Nginx varsayılan olarak /var/www/html dizinini kullanır ancak biz kendi alan adımıza özel bir yapı kuracağız.
bilisim.localiçin gerekli klasörü oluşturun:Bashsudo mkdir -p /var/www/bilisim.local/htmlKlasör izinlerini Nginx'in okuyabileceği şekilde (
www-datakullanıcısı) ayarlayın:Bashsudo chown -R www-data:www-data /var/www/bilisim.local/html sudo chmod -R 755 /var/www/bilisim.localTest edebilmek için basit bir HTML dosyası oluşturalım:
Bashsudo nano /var/www/bilisim.local/html/index.htmlİçerisine şu kodları yapıştırın:
HTML<!DOCTYPE html> <html> <head> <title>Pardus Sunucusuna Hoş Geldiniz!</title> <meta charset="utf-8"> </head> <body> <h1>Başarılı! www.bilisim.local Nginx üzerinden çalışıyor.</h1> <p>Bu sayfa, Pardus üzerinde Webmin ile yapılandırılmıştır.</p> </body> </html>(Kaydetmek için
Ctrl+O,Enter, çıkmak içinCtrl+Xtuşlarına basın.)
Adım 3: Webmin Üzerinde Nginx Modülünün Aktifleştirilmesi
Nginx'i terminalden kurduğumuz için Webmin'in bunu algılamasını sağlamalıyız.
Webmin arayüzüne giriş yapın (
https://192.168.101.250:10000).Sol menünün en altındaki Refresh Modules (Modülleri Yenile) butonuna tıklayın.
Yenileme bittikten sonra sol menüdeki Servers (Sunucular) sekmesini genişletin. Artık Nginx Webserver seçeneğini burada görebilirsiniz.
Adım 4: Sanal Sunucu (Virtual Host) Oluşturma
Sanal sunucu (Server Block), Nginx'e gelen isteklerin hangi web sitesine ait olduğunu ayırt etmesini sağlar. Böylece tek bir sunucuda hem bilisim.local hem de nuritiras.com.tr gibi birden fazla farklı siteyi barındırabilirsiniz.
Webmin'de Servers -> Nginx Webserver menüsüne tıklayın.
Sayfanın üst kısmındaki Create Virtual Host (Sanal Sunucu Oluştur) sekmesine tıklayın.
Formu senaryomuza göre şu şekilde doldurun:
Server Name (Sunucu Adı):
www.bilisim.local bilisim.local(Aralarında boşluk bırakarak hem www'lu hem www'suz versiyonu ekleyin)Listen on port (Dinlenecek Port):
80(Standart HTTP portu)Document Root (Belge Kök Dizini):
/var/www/bilisim.local/html(Adım 2'de oluşturduğumuz klasör)
Sayfanın altındaki Create Now (Şimdi Oluştur) butonuna tıklayın.
Adım 5: Ayarları Uygulama ve Güvenlik Duvarı İzni
Nginx'in yeni sanal sunucumuzu tanıması için ayarları yeniden yüklemesi gerekir.
Webmin Nginx Webserver ana sayfasında, sağ üst köşedeki Apply Configuration (Yapılandırmayı Uygula) butonuna tıklayın.
Güvenlik Duvarı (Firewall) Ayarı: Eğer Pardus üzerinde UFW aktifse, web trafiğine (Port 80) izin vermeniz gerekir. Terminalden şu komutu çalıştırın:
Bashsudo ufw allow 'Nginx HTTP'
Adım 6: Web Sitesini Test Etme
DNS ayarlarını daha önceden yapmış olduğumuz (Birincil DNS olarak 192.168.101.250 ayarlanmış) bir istemci bilgisayardan (Windows veya Pardus) bir web tarayıcısı açın.
Adres çubuğuna şu adresi yazın:
http://www.bilisim.local
Karşınıza Adım 2'de oluşturduğumuz "Başarılı! www.bilisim.local Nginx üzerinden çalışıyor." yazılı sayfa geliyorsa, kurulum ve yapılandırmanız kusursuz bir şekilde tamamlanmış demektir.
Bu aşamada önemli bir detayı açıklığa kavuşturmamız gerekiyor: Let's Encrypt gibi yetkili sertifika otoriteleri (CA), yalnızca internet üzerinden doğrulanabilen gerçek ve public (halka açık) alan adları için SSL sertifikası üretir. Eğitim senaryomuzdaki bilisim.local kapalı bir ağda (lokal) çalıştığı için Let's Encrypt sunucuları bizim Pardus sunucumuza ulaşıp alan adını doğrulayamaz. Ancak endişelenmeyin! Bu eğitim makalesini iki bölüme ayıracağız:
Laboratuvar ortamımız (
bilisim.local) için: "Kendinden İmzalı" (Self-Signed) SSL sertifikası üreterek HTTPS yapılandırması.Gerçek projeleriniz için: Örneğin internete açık olan
nuritiras.com.trgibi bir alan adında Let's Encrypt'in nasıl kurulacağı.
Bölüm 1: Yerel Ağ İçin Kendinden İmzalı (Self-Signed) SSL Kurulumu
Kapalı ağlardaki sistemler için kendi sertifikamızı kendimiz imzalayabiliriz. Tarayıcılar bu sertifikayı "Güvenli Değil" olarak işaretlese de, trafik yine de şifreli (HTTPS) olarak iletilecektir.
Adım 1: SSL Sertifikasını Üretmek
Terminal üzerinden OpenSSL kullanarak 1 yıllık (365 gün) bir sertifika oluşturalım:
Pardus terminalini açın ve sertifikaları saklayacağımız klasörü oluşturun:
Bashsudo mkdir /etc/nginx/sslSertifika ve gizli anahtarı (private key) tek komutla üretin:
Bashsudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/bilisim.local.key -out /etc/nginx/ssl/bilisim.local.crt(Bu komutu çalıştırdığınızda size Ülke, Şehir, Organizasyon gibi bilgiler soracaktır. Buraları kendinize göre doldurabilir veya
Entertuşuyla boş geçebilirsiniz.)
Adım 2: Webmin Üzerinde Nginx SSL Yapılandırması
Webmin arayüzünde Servers -> Nginx Webserver menüsüne gidin.
Önceki derste oluşturduğumuz
www.bilisim.localsanal sunucusuna (Virtual Host) tıklayın.SSL Options (SSL Seçenekleri) bölümüne girin.
Enable SSL? seçeneğini Yes yapın.
Dosya yollarını belirtin:
SSL certificate file:
/etc/nginx/ssl/bilisim.local.crtSSL private key file:
/etc/nginx/ssl/bilisim.local.key
Save diyerek kaydedin ve ana sayfaya dönüp Apply Configuration butonuna tıklayın.
Eğer UFW (Güvenlik Duvarı) aktifse HTTPS (Port 443) için izin verin:
Bashsudo ufw allow 'Nginx Full'
Artık web sitenize https://www.bilisim.local yazarak şifreli olarak erişebilirsiniz!
Bölüm 2: Gerçek Alan Adları İçin Ücretsiz Let's Encrypt (Certbot) Kurulumu
Eğer bu işlemleri kapalı bir laboratuvar ağında değil de, internete açık bir web sunucusunda (nuritiras.com.tr gibi size ait gerçek bir alan adıyla) yapıyorsanız, süreci Webmin yerine doğrudan terminalden yürütmek çok daha hızlı ve hatasızdır.
Let's Encrypt'in resmi aracı olan Certbot, Nginx ayarlarını sizin yerinize otomatik olarak bulur, sertifikayı alır ve yapılandırma dosyasına (hatta HTTP'den HTTPS'ye yönlendirme kodlarına kadar) kendi yazar.
Adım 1: Certbot Paketlerinin Kurulumu
Pardus terminalinde şu komutu çalıştırın:
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
Adım 2: SSL Sertifikasının Alınması ve Otomatik Kurulum
Aşağıdaki komutta kendi alan adınızı kullanarak sertifikayı talep edin:
sudo certbot --nginx -d nuritiras.com.tr -d www.nuritiras.com.tr
Bu komutu çalıştırdığınızda Certbot size iki önemli soru soracaktır:
E-posta adresiniz: Sertifika yenileme uyarıları için geçerli bir mail adresi girin.
Yönlendirme (Redirect): Tüm HTTP trafiği otomatik olarak HTTPS'ye yönlendirilsin mi? Burada "2" (Redirect) seçeneğini seçmeniz güvenlik açısından en doğrusudur.
İşlem tamamlandığında, web siteniz otomatik olarak yeşil kilit simgesiyle (HTTPS) çalışmaya başlayacaktır. Sertifikanın süresi 90 gündür, ancak Certbot arka planda otomatik bir görev (cron) oluşturarak süresi bitmeden sertifikayı kendi kendine yeniler.
Pardus Sunucu Üzerinde Django ve Gunicorn ile Tam Geliştirme Ortamı Kurulumu
DNS ve Nginx yapılandırmalarımızı tamamladık. Şimdi, Python tabanlı web projelerini Pardus sunucumuzda yüksek performansla yayınlamak için Django ve Gunicorn kurulumunu gerçekleştireceğiz.
Bu yapıda Nginx, dışarıdan gelen web isteklerini karşılayan bir "Ters Vekil" (Reverse Proxy) olarak çalışacak ve dinamik Python işlemlerini Gunicorn uygulama sunucusuna (Application Server) iletecektir.
Senaryo Hatırlatması:
Alan Adı: www.bilisim.local
Proje Dizini:
/var/www/bilisim.local/app
Adım 1: Python Sanal Ortam (Virtual Environment) Hazırlığı
Projelerimizin sistemdeki diğer Python paketleriyle çakışmaması için izole bir sanal ortam oluşturmalıyız.
Pardus terminalinde gerekli Python araçlarını kurun:
Bashsudo apt update sudo apt install python3-pip python3-venv -yDjango projemiz için yeni bir dizin oluşturun ve içine girin:
Bashsudo mkdir -p /var/www/bilisim.local/app sudo chown -R $USER:$USER /var/www/bilisim.local/app cd /var/www/bilisim.local/appSanal ortamı oluşturun ve aktif hale getirin:
Bashpython3 -m venv venv source venv/bin/activate(Komut satırının başında
(venv)ibaresini görüyorsanız sanal ortam aktif demektir.)
Adım 2: Django ve Gunicorn Kurulumu
Sanal ortam aktifken gerekli paketleri indirelim ve temel bir Django projesi başlatalım.
Paketleri kurun:
Bashpip install django gunicornProjemizi (ana klasör adını
coreolarak belirleyerek) başlatalım:Bashdjango-admin startproject core .(Sondaki nokta
.projenin doğrudan bulunduğumuzappdizinine kurulmasını sağlar.)Django ayarlarında alan adımıza izin vermeliyiz. Dosyayı düzenleyin:
Bashnano core/settings.pyALLOWED_HOSTSsatırını bulup aşağıdaki gibi güncelleyin:PythonALLOWED_HOSTS = ['www.bilisim.local', 'pserver.bilisim.local', '192.168.101.250', 'localhost', '127.0.0.1']
Adım 3: Statik Dosyalar ve Veritabanı Göçü
Nginx'in CSS, JavaScript ve resim dosyalarını (statik dosyalar) doğrudan sunabilmesi için Django'nun bu dosyaları tek bir klasörde toplaması gerekir.
Yine
core/settings.pydosyasının en altına şu satırı ekleyin:Pythonimport os STATIC_ROOT = os.path.join(BASE_DIR, 'static/')(Dosyayı kaydedip kapatın.)
Veritabanı tablolarını oluşturun ve statik dosyaları toplayın:
Bashpython manage.py migrate python manage.py collectstaticGunicorn'un düzgün çalışıp çalışmadığını test edelim:
Bashgunicorn --bind 0.0.0.0:8000 core.wsgi(Hata vermiyorsa, terminali
Ctrl+Cile durdurup sanal ortamdan çıkmak içindeactivateyazabilirsiniz.)
Adım 4: Gunicorn için Systemd Servisi Oluşturma
Sunucu yeniden başladığında projenizin otomatik olarak ayağa kalkması ve arka planda sürekli çalışması için bir servis dosyası oluşturmalıyız.
Servis dosyasını oluşturun:
Bashsudo nano /etc/systemd/system/gunicorn.serviceİçerisine şu yapılandırmayı yapıştırın:
Ini, TOML[Unit] Description=gunicorn daemon After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/var/www/bilisim.local/app ExecStart=/var/www/bilisim.local/app/venv/bin/gunicorn --access-logfile - --workers 3 --bind 127.0.0.1:8000 core.wsgi:application [Install] WantedBy=multi-user.target(Not: Güvenlik için servisi
www-datakullanıcısı ile çalıştırıyoruz.)appklasörünün sahipliğini Nginx ve Gunicorn'un erişebileceği şekilde güncelleyin:Bashsudo chown -R www-data:www-data /var/www/bilisim.local/appServisi başlatın ve sistem başlangıcına ekleyin:
Bashsudo systemctl daemon-reload sudo systemctl start gunicorn sudo systemctl enable gunicorn
Adım 5: Nginx Ters Vekil (Reverse Proxy) Yapılandırması
Şimdi, önceki makalede kurduğumuz Nginx sanal sunucusunu (Virtual Host), gelen istekleri doğrudan statik bir HTML dosyası yerine 8000 portunda çalışan Gunicorn'a yönlendirecek şekilde ayarlayacağız.
Bunu Webmin arayüzünden veya doğrudan Nginx konfigürasyon dosyasını düzenleyerek yapabilirsiniz. Terminal üzerinden yapmak daha kesindir:
Nginx yapılandırma dosyasını açın (Önceki makalede oluşturduğumuz veya varsayılan dosya):
Bashsudo nano /etc/nginx/sites-available/default(Eğer Webmin'de farklı bir isimle oluşturduysanız o dosyayı açın, örneğin
/etc/nginx/conf.d/bilisim.local.conf)Dosya içeriğini (veya
server { ... }bloğunun içini) aşağıdaki gibi düzenleyin:Nginxserver { listen 80; server_name www.bilisim.local bilisim.local; # Gelen istekleri Gunicorn'a yönlendir location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; 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; } # Statik dosyaları Nginx doğrudan sunsun (Performans için) location /static/ { alias /var/www/bilisim.local/app/static/; } }Nginx ayarlarını test edin ve servisi yeniden başlatın:
Bashsudo nginx -t sudo systemctl restart nginx
Adım 6: Ortamı Test Etme
İstemci bilgisayarınızdan (veya ağınızdaki herhangi bir cihazdan) tarayıcıyı açın ve adres çubuğuna yazın:
http://www.bilisim.local
Eğer her şeyi doğru yaptıysanız, Nginx isteği alacak, Gunicorn'a iletecek ve karşınızda meşhur Django Roketini (The install worked successfully! Congratulations!) göreceksiniz.
Tebrikler, Pardus üzerinde baştan sona (DNS -> Web Sunucusu -> Uygulama Sunucusu -> Framework) profesyonel bir tam yığın (full-stack) yayın ortamı kurdunuz.
Pardus Sunucu Üzerinde Django için PostgreSQL Kurulumu ve Entegrasyonu
Pardus sunucumuzda Nginx (Ters Vekil) ve Gunicorn (Uygulama Sunucusu) ile Django projemizi başarıyla yayınladık. Ancak Django, varsayılan olarak SQLite veritabanı ile gelir. SQLite, geliştirme aşaması için harika olsa da, aynı anda birden fazla kullanıcının bağlandığı gerçek üretim ortamları (production) için yetersiz kalabilir.
Bu makalede, açık kaynak dünyasının en güçlü ilişkisel veritabanı yönetim sistemlerinden biri olan PostgreSQL'i kuracak ve Django projemizi bu veritabanıyla konuşacak şekilde yapılandıracağız.
Adım 1: PostgreSQL ve Gerekli Kütüphanelerin Kurulumu
Öncelikle Pardus depolarından PostgreSQL'i ve Python'un bu veritabanı ile iletişim kurabilmesi için gereken geliştirici kütüphanelerini kurmalıyız.
Pardus terminalinizi açın ve paket listelerini güncelleyerek kurulumu başlatın:
Bashsudo apt update sudo apt install postgresql postgresql-contrib libpq-dev python3-dev -y(Not:
libpq-devvepython3-devpaketleri, bir sonraki adımda kuracağımız psycopg2 adaptörünün derlenebilmesi için zorunludur.)Kurulum bittiğinde PostgreSQL servisinin çalıştığından emin olun:
Bashsudo systemctl status postgresql
Adım 2: Veritabanı ve Kullanıcı Oluşturma
PostgreSQL kurulduğunda güvenlik amacıyla sadece postgres isimli özel bir sistem kullanıcısı üzerinden işlem yapmanıza izin verir. Bu kullanıcıya geçiş yapıp projemiz için yeni bir veritabanı ve yetkili kullanıcı oluşturacağız.
PostgreSQL komut satırına (psql) giriş yapın:
Bashsudo -u postgres psql(Komut satırınız
postgres=#şeklinde değişecektir.)Projemiz için bir veritabanı oluşturun (Örn:
bilisim_db):SQLCREATE DATABASE bilisim_db;Bu veritabanını yönetecek, şifreli bir veritabanı kullanıcısı oluşturun:
SQLCREATE USER db_admin WITH PASSWORD 'GucluSifre123!';Django'nun sorunsuz çalışabilmesi için karakter kodlaması ve zaman dilimi gibi bazı performans ve uyumluluk ayarlarını bu kullanıcıya tanımlayın:
SQLALTER ROLE db_admin SET client_encoding TO 'utf8'; ALTER ROLE db_admin SET default_transaction_isolation TO 'read committed'; ALTER ROLE db_admin SET timezone TO 'Europe/Istanbul';Oluşturduğumuz veritabanı üzerindeki tüm yetkileri bu kullanıcıya verin:
SQLGRANT ALL PRIVILEGES ON DATABASE bilisim_db TO db_admin;PostgreSQL komut satırından çıkın:
SQL\q
Adım 3: Django Projesine PostgreSQL Adaptörünün Kurulması
Django'nun PostgreSQL ile konuşabilmesi için psycopg2 isimli köprü paketine ihtiyacı vardır. Bu paketi, sistem geneline değil, sadece projemizin sanal ortamına (virtual environment) kurmalıyız.
Proje dizinine gidin ve sanal ortamınızı aktif edin:
Bashcd /var/www/bilisim.local/app source venv/bin/activatepsycopg2paketini kurun:Bashpip install psycopg2
Adım 4: Django Ayarlarının (settings.py) Güncellenmesi
Şimdi Django'ya artık SQLite'ı değil, yeni kurduğumuz PostgreSQL veritabanını kullanmasını söyleyeceğiz.
Django ayar dosyanızı düzenlemek için açın:
Bashnano core/settings.pyDosya içerisinde
DATABASESbölümünü bulun. Varsayılan olarak şu şekildedir:Python# ESKİ HALİ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }Bu bölümü silip, yerine Adım 2'de belirlediğimiz kendi veritabanı bilgilerimizi yazın:
Python# YENİ HALİ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'bilisim_db', 'USER': 'db_admin', 'PASSWORD': 'GucluSifre123!', 'HOST': 'localhost', 'PORT': '', } }(Kaydedip çıkmak için
Ctrl+O,EnterveCtrl+Xkullanın.)
Adım 5: Göçlerin (Migrations) Uygulanması ve Test
Veritabanını değiştirdiğimiz için, Django'nun ihtiyaç duyduğu temel tabloları (kullanıcılar, oturumlar, yetkiler vb.) boş olan yeni PostgreSQL veritabanımıza yazdırmamız gerekiyor.
Sanal ortam aktifken göçleri uygulayın:
Bashpython manage.py migrate(Ekranda birçok "Applying..." ve "OK" yazısı görmelisiniz. Bu, tabloların PostgreSQL içine başarıyla açıldığını gösterir.)
Yeni veritabanımız için bir yönetici (superuser) hesabı oluşturalım:
Bashpython manage.py createsuperuser(Kullanıcı adı, e-posta ve şifrenizi belirleyin.)
Yaptığımız değişikliklerin canlıya yansıması için arka planda çalışan Gunicorn servisimizi yeniden başlatın:
Bashsudo systemctl restart gunicorn
Tebrikler! Artık http://www.bilisim.local/admin adresine giderek oluşturduğunuz yönetici hesabıyla giriş yapabilirsiniz. Tüm verileriniz güçlü ve güvenli PostgreSQL veritabanında tutulmaktadır.
Yorumlar