Django, PostgreSQL, Nginx ve Gunicorn ile Debian 8 Üzerinde Web Uygulaması Kurulumu
Giriş
Modern web uygulamaları genellikle birden fazla bileşenin uyumlu bir şekilde çalışmasıyla hayat bulur. Bu makalede, popüler Python tabanlı web çatısı Django’yu, güçlü ve güvenilir PostgreSQL veritabanı ile birlikte, yüksek performanslı Nginx web sunucusu ve Python uygulamaları için bir WSGI sunucusu olan Gunicorn ile Debian 8 (Jessie) işletim sistemi üzerinde nasıl kuracağınızı ve yapılandıracağınızı adım adım açıklayacağız. Bu mimari, geliştirme ortamından üretim ortamına geçişte sıklıkla tercih edilen, ölçeklenebilir ve güvenli bir çözüm sunar.
Django, hızlı geliştirme imkanları ve “pil dahil” felsefesiyle öne çıkarken, PostgreSQL veri tutarlılığı ve karmaşık sorgular için mükemmel bir seçimdir. Gunicorn, Django uygulamanızın gelen istekleri verimli bir şekilde işlemesini sağlarken, Nginx ters proxy görevi görerek statik dosyaları sunar, yük dengeleme yapar ve uygulamanızın önünde bir güvenlik katmanı oluşturur. Debian 8, kararlılığı ve geniş paket desteği ile sunucu ortamları için güvenilir bir temel sağlar. Bu kılavuz, tüm bu bileşenleri sorunsuz bir şekilde entegre etmenize yardımcı olacaktır.
Ön Gereksinimler
Bu kuruluma başlamadan önce aşağıdaki ön gereksinimlere sahip olmanız gerekmektedir:
* Debian 8 (Jessie) kurulu bir sunucu (VPS veya fiziksel sunucu).
* sudo ayrıcalıklarına sahip, root olmayan bir kullanıcı hesabı veya doğrudan root erişimi. Güvenlik nedenleriyle sudo kullanıcısı tercih edilir.
* Temel Linux komut satırı bilgisi.
* Sunucunuzun bir alan adına sahip olması (örneğin, alanadiniz.com) veya en azından IP adresini bilmeniz gerekmektedir.
Sistem Güncellemesi ve Temel Paketlerin Kurulumu
Kuruluma başlamadan önce, sisteminizin güncel olduğundan ve gerekli temel paketlerin kurulu olduğundan emin olmalıyız. Bu, olası bağımlılık sorunlarını önlemeye yardımcı olacaktır.
Öncelikle, paket listelerinizi güncelleyin ve kurulu paketleri yükseltin:
sudo apt-get update
sudo apt-get upgrade -y
Ardından, Python uygulamaları, PostgreSQL ve Nginx için gerekli olan bazı temel geliştirme araçlarını ve kütüphaneleri kuralım. Debian 8’de Python 3.4 varsayılan olarak bulunur ve çoğu modern Django projesi için Python 3 kullanmak daha iyidir.
sudo apt-get install -y build-essential libpq-dev python3-dev python3-pip python3-venv nginx
* build-essential: Derleme araçlarını (gcc, g++ vb.) içerir. Python paketlerinin derlenmesi için gereklidir.
* libpq-dev: PostgreSQL istemci kütüphaneleri ve başlık dosyalarını içerir. Python’ın psycopg2 gibi PostgreSQL bağdaştırıcılarını derlemesi için gereklidir.
* python3-dev: Python 3 için geliştirme başlık dosyalarını ve statik kütüphaneleri içerir.
* python3-pip: Python 3 için paket yöneticisi pip‘i kurar.
* python3-venv: Python 3 için sanal ortam oluşturma modülünü sağlar.
* nginx: Nginx web sunucusunu kurar.
PostgreSQL Veritabanının Kurulumu ve Yapılandırması
Django projeniz için bir veritabanına ihtiyacımız var. PostgreSQL, güçlü özellikleri ve güvenilirliği nedeniyle popüler bir seçimdir.
PostgreSQL Kurulumu
PostgreSQL sunucusunu kurmak için aşağıdaki komutu kullanın:
sudo apt-get install -y postgresql postgresql-contrib
Bu komut, PostgreSQL sunucusunu ve bazı ek yardımcı programları kuracaktır. Kurulum tamamlandıktan sonra PostgreSQL servisi otomatik olarak başlayacaktır.
Veritabanı Kullanıcısı ve Veritabanı Oluşturma
Varsayılan olarak, PostgreSQL, postgres adında bir yönetici kullanıcısı oluşturur. Bu kullanıcıya geçiş yaparak yeni bir veritabanı ve kullanıcı oluşturacağız.
sudo -i -u postgres
Şimdi PostgreSQL komut istemine erişmek için psql yazın:
psql
PostgreSQL istemcisi içinde, Django projeniz için yeni bir veritabanı ve bu veritabanına erişecek bir kullanıcı oluşturalım. myprojectdb ve myprojectuser yerine kendi istediğiniz isimleri kullanabilirsiniz. my_strong_password yerine güçlü bir parola belirlemeyi unutmayın.
CREATE DATABASE myprojectdb;
CREATE USER myprojectuser WITH PASSWORD 'my_strong_password';
ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE myprojectdb TO myprojectuser;
Bu komutlar sırasıyla:
1. myprojectdb adında bir veritabanı oluşturur.
2. myprojectuser adında ve belirlenen parola ile bir kullanıcı oluşturur.
3. Kullanıcının varsayılan istemci kodlamasını UTF-8 olarak ayarlar.
4. Kullanıcının varsayılan işlem izolasyon seviyesini “read committed” olarak ayarlar (Django için önerilen).
5. Kullanıcının varsayılan zaman dilimini UTC olarak ayarlar.
6. myprojectuser kullanıcısına myprojectdb veritabanı üzerinde tüm ayrıcalıkları verir.
Veritabanı oluşturma işlemini tamamladıktan sonra, \q yazarak psql isteminden çıkın ve ardından exit yazarak postgres kullanıcısından normal sudo kullanıcınıza geri dönün:
\q
exit
Python ve Sanal Ortam Kurulumu
Django projenizi sistem genelindeki Python paketlerinden izole etmek için bir Python sanal ortamı kullanmak en iyi uygulamadır. Bu, bağımlılık çakışmalarını önler ve projenizin bağımlılıklarını yönetmeyi kolaylaştırır.
Python ve pip Kurulumu
Yukarıdaki adımda python3-pip ve python3-venv paketlerini zaten kurmuştuk. Bu, Python 3.4 ve pip‘in hazır olduğu anlamına gelir.
Sanal Ortam Oluşturma
Şimdi Django projenizi barındıracak bir dizin oluşturalım ve bu dizin içinde bir sanal ortam kuralım. Genellikle /opt dizini, elle kurulan yazılımlar için kullanılır.
sudo mkdir /opt/myproject
sudo chown -R $USER:$USER /opt/myproject # Kullanıcınıza dizin üzerinde tam yetki verin
cd /opt/myproject
Şimdi sanal ortamı oluşturalım ve etkinleştirelim:
python3 -m venv venv
source venv/bin/activate
Komut satırınızın başında (venv) ifadesini görmelisiniz. Bu, sanal ortamın etkinleştirildiğini gösterir. Artık bu ortamda kuracağınız tüm Python paketleri sistem genelini etkilemeyecektir.
Django Projesinin Oluşturulması ve Yapılandırılması
Sanal ortamımız hazır olduğuna göre, Django projemizi oluşturabilir ve PostgreSQL ile bağlantı kuracak şekilde yapılandırabiliriz.
Django Kurulumu ve Proje Oluşturma
Sanal ortam etkinleştirilmişken, Django, psycopg2-binary (PostgreSQL adaptörü) ve Gunicorn’ı kuralım:
pip install django psycopg2-binary gunicorn
Şimdi yeni bir Django projesi oluşturalım. Projenizin adını myproject olarak varsayıyoruz, ancak istediğiniz bir adı kullanabilirsiniz.
django-admin startproject myproject .
Bu komut, geçerli dizinde (/opt/myproject) bir Django projesi oluşturacaktır.
PostgreSQL Bağlantısının Yapılandırılması
Django projenizin veritabanı bağlantı ayarlarını düzenlemek için myproject/settings.py dosyasını açın:
nano myproject/settings.py
DATABASES bölümünü bulun ve aşağıdaki gibi düzenleyin (kendi veritabanı adınızı, kullanıcı adınızı ve parolanızı kullanmayı unutmayın):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myprojectdb',
'USER': 'myprojectuser',
'PASSWORD': 'my_strong_password',
'HOST': 'localhost',
'PORT': '',
}
}
Ayrıca, ALLOWED_HOSTS ayarını da güncellemeniz gerekecektir. Bu, Django uygulamanızın hangi host adları üzerinden erişilebilir olacağını belirler. Sunucunuzun IP adresini ve/veya alan adınızı ekleyin:
ALLOWED_HOSTS = ['your_server_ip_address', 'your_domain.com', 'www.your_domain.com']
Statik Dosyaların Yönetimi
Django, üretim ortamında statik dosyaları (CSS, JavaScript, resimler) doğrudan sunmaz. Bunun yerine, Nginx gibi bir web sunucusunun bu dosyaları sunması için belirli bir konuma toplarız. settings.py dosyasında STATIC_URL altına aşağıdaki satırı ekleyin:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Bu, Django’nun tüm statik dosyalarını projenizin kök dizinindeki static adlı bir klasörde toplayacağını belirtir.
Değişiklikleri kaydedip settings.py dosyasını kapatın (CTRL+X, Y, Enter).
Şimdi Django veritabanı geçişlerini uygulayın ve statik dosyaları toplayın:
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic
collectstatic komutu, statik dosyaları toplamak isteyip istemediğinizi soracaktır; yes yazarak onaylayın.
İsterseniz, bir yönetici kullanıcısı da oluşturabilirsiniz:
python manage.py createsuperuser
Django Uygulamasının Test Edilmesi
Şimdiye kadar her şeyin yolunda gidip gitmediğini kontrol etmek için Django’nun geliştirme sunucusunu çalıştırabilirsiniz:
python manage.py runserver 0.0.0.0:8000
Tarayıcınızda http://your_server_ip_address:8000 adresine giderek Django’nun varsayılan “It worked!” sayfasını görmelisiniz. Eğer görüyorsanız, Django projeniz başarıyla kurulmuş ve veritabanına bağlanmıştır. Testi bitirdiğinizde, sunucuyu durdurmak için CTRL+C tuşlarına basın.
Sanal ortamdan çıkmak için:
deactivate
Ancak Gunicorn ve Nginx kurulumu için sanal ortamda kalmanız daha iyi olabilir, çünkü Gunicorn’ı test etmek için tekrar etkinleştirmeniz gerekecek.
Gunicorn Kurulumu ve Yapılandırması
Gunicorn (Green Unicorn), bir Python WSGI HTTP sunucusudur. Django gibi Python web uygulamalarının gelen HTTP isteklerini işlemesini sağlar.
Gunicorn Kurulumu
Gunicorn’ı daha önce sanal ortamınıza pip install django psycopg2-binary gunicorn komutuyla zaten kurmuştuk.
Gunicorn Test Edilmesi
Sanal ortamınızın etkin olduğundan emin olun:
cd /opt/myproject
source venv/bin/activate
Şimdi Gunicorn’ı doğrudan Django projenizle test edelim. myproject.wsgi:application ifadesi, Gunicorn’ın projenizin wsgi.py dosyasındaki application objesini bulmasını sağlar.
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
Tarayıcınızda http://your_server_ip_address:8000 adresine tekrar gidin. Django sayfasını görmeye devam etmelisiniz. Bu, Gunicorn’ın Django uygulamanızı başarıyla çalıştırdığını gösterir. Testi bitirdiğinizde CTRL+C ile Gunicorn’ı durdurun.
Gunicorn Systemd Servisi Oluşturma
Gunicorn’ın sürekli çalışmasını ve sunucu yeniden başlatıldığında otomatik olarak başlamasını sağlamak için bir systemd servisi oluşturacağız.
Sanal ortamdan çıkın:
deactivate
Şimdi /etc/systemd/system/gunicorn.service adında yeni bir dosya oluşturalım:
sudo nano /etc/systemd/system/gunicorn.service
Dosyanın içine aşağıdaki içeriği yapıştırın. User ve Group değerlerini kendi sudo kullanıcınızla değiştirin. WorkingDirectory ve ExecStart yollarının doğru olduğundan emin olun. ExecStart komutu, Gunicorn’ın Unix soketi üzerinden çalışmasını sağlar. Bu, Nginx ile daha güvenli ve performanslı bir bağlantı sağlar.
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=your_username
Group=your_username
WorkingDirectory=/opt/myproject
ExecStart=/opt/myproject/venv/bin/gunicorn --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
Restart=always
[Install]
WantedBy=multi-user.target
* User ve Group: Gunicorn işleminin hangi kullanıcı ve grup altında çalışacağını belirtir. Kendi sudo kullanıcınızı kullanmalısınız.
* WorkingDirectory: Django projenizin kök dizinidir.
ExecStart: Gunicorn’ı başlatan komuttur. --workers 3 ile 3 adet Gunicorn worker süreci başlatılır (genellikle 2 CPU_çekirdek_sayısı + 1 formülü kullanılır). --bind unix:/run/gunicorn.sock ile Gunicorn, bir Unix soketi üzerinden dinleme yapar.
* Restart=always: Gunicorn herhangi bir nedenle çökerse otomatik olarak yeniden başlatılmasını sağlar.
Dosyayı kaydedip kapatın.
Şimdi systemd‘ye yeni servisi tanıtalım ve başlatalım:
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
Gunicorn servisinin durumunu kontrol edebilirsiniz:
sudo systemctl status gunicorn
Durum active (running) olarak görünmeli ve herhangi bir hata olmamalıdır. Ayrıca /run/gunicorn.sock dosyasının oluştuğunu da kontrol edebilirsiniz:
ls -l /run/gunicorn.sock
Bu dosya mevcutsa, Gunicorn başarıyla çalışıyor demektir.
Nginx Kurulumu ve Yapılandırması
Nginx, yüksek performanslı bir web sunucusu ve ters proxy’dir. Gelen HTTP isteklerini Gunicorn’a yönlendirecek, statik dosyaları doğrudan sunacak ve yük dengeleme gibi görevleri üstlenecektir.
Nginx Kurulumu
Nginx’i daha önce apt-get install nginx komutuyla kurmuştuk.
Nginx Yapılandırması
Nginx’i Django projenizle çalışacak şekilde yapılandırmamız gerekiyor. Yeni bir Nginx yapılandırma dosyası oluşturalım:
sudo nano /etc/nginx/sites-available/myproject
Dosyanın içine aşağıdaki içeriği yapıştırın. your_domain.com ve www.your_domain.com yerine kendi alan adınızı veya sunucunuzun IP adresini kullanın.
server {
listen 80;
server_name your_domain.com www.your_domain.com your_server_ip_address;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /opt/myproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
* listen 80: Nginx’in 80 numaralı porttan (HTTP) gelen istekleri dinlemesini sağlar.
* server_name: Alan adınızı veya IP adresinizi belirtir. Nginx bu isimler için gelen istekleri bu yapılandırma bloğuna yönlendirir.
* location /static/: /static/ ile başlayan URL’ler için Nginx’in /opt/myproject/static dizinindeki dosyaları doğrudan sunmasını sağlar. Bu, statik dosyaların Gunicorn’a gitmesini engelleyerek performansı artırır.
* location /: Diğer tüm istekler için Nginx, proxy_params‘i dahil ederek ve istekleri Unix soketi üzerinden Gunicorn’a (http://unix:/run/gunicorn.sock) yönlendirerek bir ters proxy görevi görür.
Dosyayı kaydedip kapatın.
Şimdi bu yapılandırma dosyasını etkinleştirmek için sites-enabled dizinine bir sembolik bağlantı oluşturalım ve varsayılan Nginx yapılandırmasını kaldıralım:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
Nginx Statik Dosya Yapılandırması
location /static/ bloğunda root /opt/myproject; olarak belirttik. Bu, Nginx’in /opt/myproject/static yolunu arayacağı anlamına gelir. collectstatic komutuyla statik dosyalarımızı zaten /opt/myproject/static dizinine toplamıştık. Dolayısıyla bu yapılandırma doğru çalışacaktır.
Nginx’i Yeniden Başlatma
Yeni Nginx yapılandırmasının geçerli olup olmadığını kontrol edelim:
sudo nginx -t
Eğer syntax is ok ve test is successful mesajlarını görüyorsanız, yapılandırma dosyanızda bir hata yok demektir. Şimdi Nginx’i yeniden başlatın:
sudo systemctl restart nginx
Tarayıcınızda http://your_domain.com veya http://your_server_ip_address adresine gidin. Django uygulamanızın Nginx üzerinden erişilebilir olması gerekir. Eğer her şey doğru kurulduysa, Django’nun “It worked!” sayfasını veya kendi uygulamanızın ana sayfasını görmelisiniz.
Güvenlik İyileştirmeleri
Sunucunuzu daha güvenli hale getirmek için bir güvenlik duvarı yapılandırmak iyi bir uygulamadır. Debian 8’de ufw (Uncomplicated Firewall) kullanabiliriz.
Güvenlik Duvarı (UFW) Yapılandırması
ufw‘yi kurun:
sudo apt-get install -y ufw
Şimdi Nginx (HTTP), HTTPS (eğer gelecekte SSL kuracaksanız) ve SSH bağlantılarına izin verin ve güvenlik duvarını etkinleştirin:
sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS' # SSL kurmayı planlıyorsanız şimdiden ekleyebilirsiniz
sudo ufw allow 'OpenSSH'
sudo ufw enable
ufw enable komutunu çalıştırdığınızda, SSH bağlantınızın kesilmemesi için bir uyarı alabilirsiniz. y yazarak onaylayın.
Güvenlik duvarının durumunu kontrol edin:
sudo ufw status
Çıktıda HTTP (80), HTTPS (443) ve SSH (22) portlarının izinli olduğunu görmelisiniz.
Sonuç
Tebrikler! Django projenizi PostgreSQL veritabanı, Gunicorn WSGI sunucusu ve Nginx ters proxy ile Debian 8 üzerinde başarıyla kurdunuz ve yapılandırdınız. Bu kurulum, web uygulamanız için sağlam, ölçeklenebilir ve güvenli bir temel oluşturur.
Bu makalede ele aldığımız adımlar, Django uygulamanızı geliştirme aşamasından üretim ortamına taşımak için gereken temel bileşenleri kapsar. İleriye dönük olarak, uygulamanızın güvenliğini ve performansını daha da artırmak için aşağıdaki konuları araştırmayı düşünebilirsiniz:
* SSL/TLS Sertifikası (HTTPS): Let’s Encrypt ile ücretsiz SSL sertifikası alarak Nginx’i HTTPS üzerinden hizmet verecek şekilde yapılandırmak, veri iletimini şifreleyerek güvenliği artıracaktır.
* Django Güvenlik Ayarları: settings.py dosyasındaki SECRET_KEY‘i güvenli bir şekilde yönetmek, hata ayıklama modunu kapatmak (DEBUG = False), CSRF_COOKIE_SECURE, SESSION_COOKIE_SECURE gibi ayarları etkinleştirmek.
* Gunicorn İyileştirmeleri: Worker sayısını sunucunuzun kaynaklarına göre ayarlamak, timeout ayarlarını optimize etmek.
* Log Yönetimi: Nginx ve Gunicorn loglarını izlemek ve yönetmek için merkezi bir loglama çözümü kullanmak.
* Yedekleme: Veritabanı ve uygulama dosyalarınız için düzenli yedekleme stratejileri oluşturmak.
* Monitöring: Sunucu kaynaklarını (CPU, RAM, disk) ve uygulama performansını izlemek için araçlar kullanmak.
Bu entegrasyonla, Django uygulamanız artık dünya genelinden erişilebilir ve güvenilir bir şekilde hizmet vermeye hazır.