Debian 10 Üzerinde Django, PostgreSQL, Nginx ve Gunicorn Kurulumu
Giriş
Web uygulamalarının geliştirilmesi ve dağıtımı, günümüzün dijital dünyasında hayati bir öneme sahiptir. Django, Python tabanlı güçlü bir web çatısı olarak hızlı geliştirme yetenekleri sunarken, PostgreSQL sağlam ve ölçeklenebilir bir ilişkisel veritabanı çözümü sağlar. Bu ikilinin birlikte kullanılması, çoğu web projesi için sağlam bir temel oluşturur. Ancak, geliştirilen bu uygulamaların internet üzerinde erişilebilir olması ve yüksek performansla çalışması için ek bileşenlere ihtiyaç duyulur. İşte bu noktada Nginx ve Gunicorn devreye girer. Gunicorn, Django uygulamanız ile sunucu arasında bir köprü görevi gören bir WSGI (Web Server Gateway Interface) sunucusudur. Nginx ise, yüksek performanslı bir ters proxy ve statik dosya sunucusu olarak gelen istekleri Gunicorn’a yönlendirir, statik ve medya dosyalarını doğrudan sunar ve genel olarak sunucu performansını ve güvenliğini artırır.
Bu makalede, Debian 10 (Buster) işletim sistemi üzerinde Django, PostgreSQL, Nginx ve Gunicorn bileşenlerini adım adım nasıl kuracağınızı ve yapılandıracağınızı detaylı bir şekilde açıklayacağız. Bu rehber, geliştirme ortamından üretim ortamına geçiş yapmak isteyen geliştiriciler ve sistem yöneticileri için kapsamlı bir yol haritası sunmaktadır. Amaç, güvenli, hızlı ve ölçeklenebilir bir Django uygulamasını canlıya almak için gerekli tüm adımları anlaşılır bir dille aktarmaktır.
Ön Gereksinimler
Bu rehbere başlamadan önce aşağıdaki ön gereksinimlere sahip olduğunuzdan emin olun:
- Debian 10 (Buster) işletim sistemine sahip bir sunucu.
sudoyetkilerine sahip, root olmayan bir kullanıcı hesabı. Güvenlik nedeniyle root kullanıcısı ile doğrudan işlem yapmaktan kaçınılmalıdır.- Sunucuya SSH erişimi.
- Temel Linux komutları bilgisi.
- Django ve Python hakkında temel bilgi.
Bu adımları bir SSH terminali üzerinden gerçekleştireceğiz.
Sistem Güncellemesi ve Temel Paketlerin Kurulumu
İlk adım olarak, sunucunuzdaki paket listelerini güncellemeli ve mevcut paketleri en son sürümlerine yükseltmelisiniz. Bu, olası güvenlik açıklarını kapatır ve en yeni yazılım sürümlerine erişmenizi sağlar. Ayrıca, Python geliştirme ortamı için gerekli olan bazı temel paketleri de kuracağız.
sudo apt update
sudo apt upgrade -y
sudo apt install -y python3-dev python3-pip libpq-dev nginx curl git
Yukarıdaki komutlar şunları yapar:
sudo apt update: Paket listelerini günceller.sudo apt upgrade -y: Kurulumu onaylayarak tüm yüklü paketleri yükseltir.python3-dev: Python 3 için geliştirme başlıklarını ve statik kütüphaneleri sağlar, bu, bazı Python paketlerinin (özellikle veritabanı bağlayıcıları gibi C uzantıları olanlar) derlenmesi için gereklidir.python3-pip: Python paket yöneticisi olan pip’i kurar.libpq-dev: PostgreSQL istemci kütüphanelerini ve geliştirme başlıklarını sağlar, bu, Django’nun PostgreSQL ile etkileşim kurması için gerekli olanpsycopg2gibi paketlerin derlenmesi için önemlidir.nginx: Ters proxy ve statik dosya sunucusu olarak kullanacağımız Nginx’i kurar.curlvegit: İsteğe bağlı ancak faydalı araçlardır.curlweb istekleri atmak için,gitise projenizi versiyon kontrolünden çekmek için kullanılabilir.
PostgreSQL Kurulumu ve Yapılandırması
Django projemiz için bir veritabanına ihtiyacımız var. PostgreSQL, performanslı ve güvenilir bir seçimdir.
PostgreSQL Kurulumu
PostgreSQL’i kurmak için aşağıdaki komutu kullanın:
sudo apt install -y postgresql postgresql-contrib
Kurulum tamamlandıktan sonra PostgreSQL servisi otomatik olarak başlatılır. Durumunu kontrol edebilirsiniz:
sudo systemctl status postgresql
Çıktıda “active (exited)” veya “active (running)” görmelisiniz.
Veritabanı ve Kullanıcı Oluşturma
PostgreSQL varsayılan olarak postgres adında bir süper kullanıcı hesabı oluşturur. Bu hesabı kullanarak yeni bir veritabanı ve Django projemiz için özel bir kullanıcı oluşturacağız.
Önce postgres kullanıcısına geçiş yapın:
sudo -i -u postgres
Şimdi PostgreSQL komut istemine girin:
psql
PostgreSQL istemindeyken, Django projemiz için bir veritabanı ve bir veritabanı kullanıcısı oluşturalım. Örnek olarak, veritabanı adı myprojectdb, kullanıcı adı myprojectuser ve şifresi mysupersecretpassword olsun. Bu değerleri kendi projenize göre değiştirmeniz şiddetle tavsiye edilir.
CREATE DATABASE myprojectdb;
CREATE USER myprojectuser WITH PASSWORD 'mysupersecretpassword';
GRANT ALL PRIVILEGES ON DATABASE myprojectdb TO myprojectuser;
Yetkilendirme adımı, myprojectuser kullanıcısına myprojectdb veritabanı üzerinde tüm yetkileri verir.
PostgreSQL isteminden çıkmak için:
\q
postgres kullanıcısından kendi kullanıcı hesabınıza geri dönmek için:
exit
Python Ortamının Hazırlanması ve Django Kurulumu
Django projemizi izole bir Python sanal ortamında kurmak en iyi uygulamadır. Bu, proje bağımlılıklarının sistem genelindeki Python paketleriyle çakışmasını önler.
Sanal Ortam Oluşturma
İlk olarak, virtualenv paketini kurun:
sudo pip3 install virtualenv
Şimdi projeniz için bir dizin oluşturalım ve bu dizine geçelim. Örnek olarak /var/www/myproject dizinini kullanacağız.
sudo mkdir -p /var/www/myproject
sudo chown -R $USER:$USER /var/www/myproject
cd /var/www/myproject
Bu komutlar, projeniz için bir dizin oluşturur ve bu dizinin sahipliğini mevcut kullanıcınıza verir.
Şimdi bu dizinde bir sanal ortam oluşturalım ve etkinleştirelim:
virtualenv venv
source venv/bin/activate
Komut satırınızın başında (venv) ifadesini görmelisiniz, bu sanal ortamın etkin olduğunu gösterir.
Django ve Gerekli Paketlerin Kurulumu
Sanal ortam etkinleştirildikten sonra, Django ve PostgreSQL ile bağlantı kurmak için gerekli olan psycopg2-binary paketini kuralım:
pip install django gunicorn psycopg2-binary
Burada Gunicorn’u da kuruyoruz çünkü daha sonra kullanacağız.
Django Projesi Oluşturma
Şimdi Django projemizi oluşturalım. Örnek olarak projemizin adı myproject olsun.
django-admin startproject myproject .
Nokta (.) kullanmak, projenin mevcut dizin içinde oluşturulmasını sağlar, böylece iç içe bir myproject dizini oluşmaz.
Proje yapınız şimdi şuna benzer olmalı:
/var/www/myproject/
├── venv/
├── myproject/
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
Django Ayarlarının Yapılandırılması
Projenizin settings.py dosyasını düzenlemeniz gerekiyor. Bu dosya, veritabanı bağlantılarını, statik dosya ayarlarını ve izin verilen ana bilgisayarları içerir.
nano myproject/settings.py
Aşağıdaki değişiklikleri yapın:
1. Veritabanı Ayarları: DATABASES bölümünü bulun ve PostgreSQL veritabanı ayarlarınızla değiştirin:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myprojectdb',
'USER': 'myprojectuser',
'PASSWORD': 'mysupersecretpassword',
'HOST': 'localhost',
'PORT': '',
}
}
NAME, USER, PASSWORD alanlarını daha önce oluşturduğunuz değerlerle eşleştirdiğinizden emin olun.
2. İzin Verilen Ana Bilgisayarlar (ALLOWED_HOSTS): ALLOWED_HOSTS listesini sunucunuzun IP adresi veya alan adıyla güncelleyin.
ALLOWED_HOSTS = ['your_server_ip_or_domain.com', 'localhost', '127.0.0.1']
'your_server_ip_or_domain.com' kısmını sunucunuzun gerçek IP adresi veya alan adıyla değiştirin.
3. Statik Dosya Ayarları: Nginx’in statik dosyaları sunabilmesi için Django’ya statik dosyaların nerede toplanacağını belirtmeniz gerekir. Dosyanın sonuna aşağıdaki satırları ekleyin:
import os
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'mediafiles')
STATIC_ROOT ve MEDIA_ROOT dizinleri daha sonra collectstatic komutu ile oluşturulacaktır.
4. Uygulama Ekleme (İsteğe Bağlı): Eğer kendi Django uygulamanızı oluşturduysanız (örneğin myapp), bunu INSTALLED_APPS listesine eklemeyi unutmayın:
INSTALLED_APPS = [
# ... diğer uygulamalar ...
'myapp',
]
Dosyayı kaydedin ve kapatın (CTRL+O, Enter, CTRL+X).
Veritabanı Geçişleri ve Süper Kullanıcı Oluşturma
Şimdi Django veritabanı geçişlerini uygulayalım ve bir yönetici hesabı oluşturalım:
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
createsuperuser komutu sizden kullanıcı adı, e-posta ve şifre isteyecektir.
Statik Dosyaları Toplama
Django’nun statik dosyalarını (CSS, JS, resimler vb.) Nginx’in sunabileceği tek bir dizinde toplayın:
python manage.py collectstatic
Bu komut, settings.py içinde tanımladığınız STATIC_ROOT dizinini oluşturacak ve tüm statik dosyaları buraya kopyalayacaktır. Komut sizden onay istediğinde yes yazıp Enter tuşuna basın.
Sanal ortamdan çıkış yapmayın, Gunicorn kurulumuna devam edeceğiz.
Gunicorn Kurulumu ve Yapılandırması
Gunicorn, Django uygulamanızı web sunucusu (Nginx) ile konuşabilen bir WSGI sunucusudur.
Gunicorn’u Test Etme
Gunicorn’un Django projenizi doğru şekilde sunup sunmadığını test edelim:
gunicorn --bind 0.0.0.0:8000 myproject.wsgi
Bu komut, Gunicorn’u 8000 portunda başlatır. Tarayıcınızdan http://your_server_ip:8000 adresine giderek Django’nun varsayılan hoş geldiniz sayfasını görmelisiniz. Eğer bir hata alırsanız, settings.py dosyasındaki ALLOWED_HOSTS ayarını kontrol ettiğinizden emin olun.
Testi bitirmek için terminalde CTRL+C tuşlarına basın.
Systemd Hizmeti Oluşturma
Gunicorn’u manuel olarak çalıştırmak yerine, Systemd kullanarak bir hizmet olarak arka planda çalışmasını sağlayacağız. Bu, sunucu yeniden başlatıldığında Gunicorn’un otomatik olarak başlamasını ve süreç yönetimini kolaylaştırır.
İki Systemd dosyası oluşturacağız: bir socket dosyası (gunicorn.socket) ve bir hizmet dosyası (gunicorn.service).
1. Gunicorn Socket Dosyası:
sudo nano /etc/systemd/system/gunicorn.socket
İçine aşağıdaki içeriği yapıştırın:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
Bu dosya, Nginx’in Gunicorn ile iletişim kuracağı Unix soketini tanımlar.
2. Gunicorn Hizmet Dosyası:
sudo nano /etc/systemd/system/gunicorn.service
İçine aşağıdaki içeriği yapıştırın. User, Group, WorkingDirectory ve ExecStart yollarını projenize göre ayarladığınızdan emin olun.
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=your_username # Sudo yetkileri olan kullanıcı adınız
Group=www-data
WorkingDirectory=/var/www/myproject
ExecStart=/var/www/myproject/venv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
Restart=on-failure
[Install]
WantedBy=multi-user.target
Açıklamalar:
UserveGroup: Gunicorn sürecinin hangi kullanıcı ve grup altında çalışacağını belirler.your_usernameyerine kendi kullanıcı adınızı yazın.www-datagenellikle web sunucusu süreçleri için kullanılan bir gruptur.WorkingDirectory: Django projenizin kök dizinidir (manage.pydosyasının bulunduğu yer).ExecStart: Gunicorn’u başlatan komuttur. Sanal ortamınızdaki Gunicorn yürütülebilir dosyasının tam yolunu kullanır.--access-logfile -: Erişim günlüklerini standart çıktıya yazdırır.--workers 3: Gunicorn’un kaç işçi süreci başlatacağını belirler. Genellikle(2 * CPU çekirdeği sayısı) + 1olarak ayarlanır. Sunucunuzun çekirdek sayısına göre ayarlayabilirsiniz.--bind unix:/run/gunicorn.sock: Gunicorn’un bir Unix soketi üzerinden dinlemesini sağlar. Bu, Nginx ile daha verimli bir iletişim sağlar.myproject.wsgi:application: Django projenizin WSGI uygulamasını işaret eder.myprojectyerine kendi projenizin adını yazın.
Restart=on-failure: Gunicorn süreci herhangi bir nedenle çökerse otomatik olarak yeniden başlatılmasını sağlar.
Dosyaları kaydedin ve kapatın.
Gunicorn Hizmetlerini Etkinleştirme ve Başlatma
Şimdi Systemd’ye yeni dosyalarımızı okumasını söyleyelim ve Gunicorn soketini etkinleştirip başlatalım:
sudo systemctl daemon-reload
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
Soket etkinleştirildikten sonra, Gunicorn hizmeti ilk bağlantıda otomatik olarak başlayacaktır. Gunicorn hizmetini doğrudan başlatmak isterseniz:
sudo systemctl start gunicorn
Gunicorn’un durumunu kontrol edin:
sudo systemctl status gunicorn
sudo systemctl status gunicorn.socket
Her ikisinin de “active (running)” veya “active (waiting)” (soket için) olduğunu görmelisiniz.
Ayrıca, /run/gunicorn.sock dosyasının oluşturulup oluşturulmadığını kontrol edebilirsiniz:
file /run/gunicorn.sock
Çıktı socket şeklinde olmalıdır.
Sanal ortamdan çıkış yapabilirsiniz:
deactivate
Nginx Kurulumu ve Yapılandırması
Nginx, gelen web isteklerini Gunicorn’a yönlendirecek, statik dosyaları sunacak ve SSL/TLS sonlandırması sağlayacaktır.
Nginx Yapılandırma Dosyası Oluşturma
Django projeniz için yeni bir Nginx sunucu bloğu yapılandırma dosyası oluşturalım:
sudo nano /etc/nginx/sites-available/myproject
İçine aşağıdaki içeriği yapıştırın. your_server_ip_or_domain.com yerine sunucunuzun IP adresini veya alan adını yazın.
server {
listen 80;
server_name your_server_ip_or_domain.com; # Sunucunuzun IP adresi veya alan adı
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /var/www/myproject;
}
location /media/ {
root /var/www/myproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Açıklamalar:
listen 80: Nginx’in HTTP isteklerini 80 portunda dinlemesini sağlar.server_name: Sunucunuzun IP adresini veya alan adını belirtir. Birden fazla alan adını boşluklarla ayırarak ekleyebilirsiniz.location /static/: Nginx’inSTATIC_ROOTdizinindeki statik dosyaları doğrudan sunmasını sağlar. Bu, Gunicorn’un bu tür isteklerle uğraşmasını engeller ve performansı artırır.location /media/: Benzer şekilde,MEDIA_ROOTdizinindeki medya dosyalarını sunar.location /: Geri kalan tüm istekleri Gunicorn soketine yönlendirir.proxy_paramsdosyası, proxy’lenmiş istekler için gerekli başlıkları ayarlar.
Dosyayı kaydedin ve kapatın.
Yapılandırmayı Etkinleştirme
Nginx’in bu yapılandırma dosyasını kullanması için, sites-available dizininden sites-enabled dizinine bir sembolik bağlantı (symlink) oluşturun:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
Varsayılan Nginx yapılandırma dosyasını devre dışı bırakmak iyi bir uygulamadır:
sudo rm /etc/nginx/sites-enabled/default
Nginx Yapılandırmasını Test Etme ve Yeniden Başlatma
Yeni Nginx yapılandırmanızda herhangi bir sözdizimi hatası olup olmadığını kontrol edin:
sudo nginx -t
Eğer “syntax is ok” ve “test is successful” mesajlarını görürseniz, Nginx’i yeniden başlatabilirsiniz:
sudo systemctl restart nginx
Güvenlik Duvarı Ayarları
Eğer sunucunuzda UFW (Uncomplicated Firewall) etkinse, Nginx ve SSH erişimine izin vermeniz gerekir:
sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS' # Eğer SSL kullanacaksanız
sudo ufw allow 'OpenSSH'
sudo ufw enable # Eğer güvenlik duvarı kapalıysa
Mevcut güvenlik duvarı kurallarınızı kontrol etmek için:
sudo ufw status
Artık tarayıcınızdan sunucunuzun IP adresine veya alan adına giderek Django projenizi görmelisiniz. Statik dosyaların da doğru şekilde yüklendiğinden emin olun.
SSL Sertifikası Kurulumu (Certbot ile)
Web sitenizi güvenli hale getirmek için bir SSL sertifikası kullanmak zorunludur. Let’s Encrypt ve Certbot, ücretsiz ve otomatik SSL sertifikaları almanızı sağlar.
Certbot Kurulumu
Certbot’u kurmak için aşağıdaki komutları kullanın:
sudo apt install -y certbot python3-certbot-nginx
SSL Sertifikası Alma
Certbot, Nginx yapılandırmanızı otomatik olarak algılayıp SSL sertifikasını kurabilir. Aşağıdaki komutu çalıştırın, your_server_ip_or_domain.com yerine kendi alan adınızı yazın:
sudo certbot --nginx -d your_server_ip_or_domain.com
Eğer birden fazla alan adınız varsa (örneğin example.com ve www.example.com), -d bayrağını tekrar kullanarak ekleyebilirsiniz:
sudo certbot --nginx -d example.com -d www.example.com
Certbot, sizden e-posta adresi isteyecek, hizmet şartlarını kabul etmenizi isteyecek ve HTTP trafiğini HTTPS’e yönlendirmek isteyip istemediğinizi soracaktır. Genellikle “Redirect” (yönlendirme) seçeneğini seçmek iyi bir uygulamadır.
Başarılı olursa, Nginx yapılandırma dosyanız güncellenecek ve SSL sertifikanız kurulacaktır.
Otomatik Yenileme Testi
Let’s Encrypt sertifikaları 90 gün geçerlidir. Certbot, bunları otomatik olarak yenilemek için bir cron job veya systemd timer kurar. Yenileme sürecini test edebilirsiniz:
sudo certbot renew --dry-run
Eğer herhangi bir hata görmezseniz, otomatik yenileme düzgün çalışıyor demektir.
Projenin Canlı Ortama Dağıtımı ve Test
Artık sunucunuzda çalışan bir Django projeniz, Gunicorn ve Nginx ile yapılandırılmış bir dağıtımınız var.
Tarayıcınızdan alan adınızı veya IP adresinizi ziyaret edin. Django’nun hoş geldiniz sayfasını görmeli veya kendi uygulamanızın ana sayfasını görmelisiniz.
Django yönetici paneline https://your_domain.com/admin/ adresinden giriş yapmayı deneyin. Daha önce oluşturduğunuz süper kullanıcı kimlik bilgileriyle giriş yapabilmelisiniz.
Sonuç
Bu kapsamlı rehberde, Debian 10 sunucusu üzerinde bir Django projesini PostgreSQL veritabanı, Gunicorn WSGI sunucusu ve Nginx ters proxy/statik dosya sunucusu kullanarak nasıl dağıtacağınızı adım adım öğrendiniz. Ayrıca, Certbot ile ücretsiz SSL sertifikaları kurarak web sitenizi güvence altına aldınız.
Bu yapılandırma, çoğu Django projesi için sağlam, performanslı ve güvenli bir temel sağlar. Ancak, üretim ortamlarında dikkate almanız gereken ek faktörler de vardır:
- Günlükleme (Logging): Uygulama ve sunucu günlüklerini düzenli olarak kontrol etmek, sorunları tespit etmek için kritik öneme sahiptir.
- Yedekleme: Veritabanınızın ve projenizin düzenli yedeklerini almak, veri kaybını önler.
- Güvenlik: Sunucunuzu düzenli olarak güncel tutun, SSH anahtar tabanlı kimlik doğrulamasını kullanın ve gereksiz portları kapatın.
- Performans İzleme: Uygulamanızın performansını izlemek için Prometheus, Grafana gibi araçları kullanmayı düşünebilirsiniz.
- Otomatik Dağıtım (CI/CD): Projenizi güncelledikçe otomatik dağıtım süreçleri (örneğin GitLab CI/CD, GitHub Actions) kurmak, geliştirme sürecini hızlandırır ve hataları azaltır.
Bu adımları takip ederek, Django projenizi güvenle ve verimli bir şekilde üretim ortamına taşıyabilirsiniz.