Python Django Projeleri İçin Sunucu Yapılandırması. Geliştirdiğiniz Django projesini canlıya almak, yazılım geliştirme sürecinin en heyecan verici ve kritik aşamalarından biridir. Yerel makinenizde sorunsuz çalışan uygulamanızın, internet üzerindeki bir sunucuda da aynı performans ve kararlılıkla hizmet verebilmesi için doğru bir yapılandırma şarttır. Bu süreç, sadece kodunuzu bir sunucuya kopyalamaktan çok daha fazlasını içerir; güvenlik, performans, ölçeklenebilirlik ve bakım kolaylığı gibi birçok faktörü göz önünde bulundurmayı gerektirir. Profesyonel bir dağıtım (deployment) stratejisi, projenizin başarısı için temel bir yatırımdır ve kullanıcılarınıza kesintisiz bir deneyim sunmanın anahtarıdır.
Doğru yapılandırılmış bir sunucu, Django uygulamanızın potansiyelini tam olarak ortaya çıkarır. Gelen istekleri verimli bir şekilde yönetir, statik dosyaları hızla sunar, veritabanı bağlantılarını optimize eder ve olası güvenlik tehditlerine karşı bir kalkan görevi görür. Aksine, baştan savma bir kurulum, projenizin yavaş çalışmasına, sık sık çökmesine ve siber saldırılara karşı savunmasız kalmasına neden olabilir. Bu kapsamlı rehberde, bir Django projesini canlıya almak için gereken sunucu yapılandırmasının tüm adımlarını, temel bileşenleri ve en iyi uygulamaları detaylı bir şekilde ele alacağız.

Bir Django projesini production ortamında çalıştırmak için birkaç farklı yazılım katmanının uyum içinde çalışması gerekir. Bu katmanların her birinin özel bir rolü vardır ve birlikte, uygulamanızın internete güvenli ve verimli bir şekilde sunulmasını sağlarlar. Bu mimariyi anlamak, yapılandırma sürecinin temelini oluşturur.
Kullanıcılardan gelen HTTP isteklerini ilk karşılayan bileşendir. Ana görevi, statik dosyaları (CSS, JavaScript, resimler vb.) doğrudan sunmak ve dinamik istekleri uygulama sunucusuna yönlendirmektir. Bu görev dağılımı, Django’nun sadece uygulama mantığına odaklanmasını sağlayarak performansı artırır. En popüler seçenekler Nginx ve Apache’dir. Nginx, yüksek eşzamanlılık kapasitesi ve düşük kaynak tüketimi nedeniyle modern Django dağıtımlarında genellikle tercih edilir. Reverse proxy (ters proxy) olarak yapılandırılarak, gelen tüm trafiği Gunicorn gibi bir uygulama sunucusuna akıllıca yönlendirir.
Web sunucusu ile Django uygulamanız arasında bir köprü görevi görür. Web sunucuları, Python kodunu doğrudan nasıl çalıştıracaklarını bilmezler. Bu iletişim, Web Sunucusu Ağ Geçidi Arayüzü (WSGI) adı verilen bir standart aracılığıyla gerçekleşir. Gunicorn ve uWSGI, bu amaçla en sık kullanılan WSGI sunucularıdır. Gunicorn, basit kurulumu ve sağlam performansıyla öne çıkar. Gelen dinamik istekleri web sunucusundan alır, bunları Django’nun anlayabileceği bir formata çevirir ve uygulamanızın ilgili bölümünü çalıştırarak yanıtı oluşturur.
Django, varsayılan olarak geliştirme ortamı için SQLite kullanır. Ancak production ortamı için PostgreSQL, MySQL veya MariaDB gibi daha güçlü ve ölçeklenebilir veritabanı sistemleri kullanmak esastır. PostgreSQL, gelişmiş özellikleri, kararlılığı ve Django ile olan mükemmel uyumu sayesinde en çok tavsiye edilen seçenektir. Veritabanı, kullanıcı bilgileri, uygulama verileri ve diğer tüm kalıcı bilgileri depolar ve yönetir.
Aşağıdaki tablo, bu temel bileşenlerin görevlerini özetlemektedir:
| Bileşen | Ana Görevi | Popüler Örnekler | Neden Gerekli? |
|---|---|---|---|
| Web Sunucusu | İstekleri karşılar, statik dosyaları sunar, istekleri uygulama sunucusuna yönlendirir (Reverse Proxy). | Nginx, Apache | Performans optimizasyonu, güvenlik (SSL/TLS sonlandırma), yük dengeleme ve Django’nun yükünü hafifletme. |
| Uygulama Sunucusu (WSGI) | Web sunucusu ile Django uygulaması arasında WSGI standardına uygun bir köprü kurar. | Gunicorn, uWSGI | Python kodunu çalıştırmak ve birden fazla uygulama sürecini (worker) yöneterek eşzamanlı istekleri handle etmek. |
| Veritabanı Sunucusu | Uygulamanın verilerini kalıcı olarak depolar, yönetir ve sorgulara yanıt verir. | PostgreSQL, MySQL | Geliştirme için kullanılan SQLite’ın aksine, yüksek trafik altında veri bütünlüğü, güvenlik ve performans sağlar. |
| Süreç Yöneticisi | Uygulama sunucusunun (Gunicorn) sürekli çalışmasını sağlar, çökme durumunda yeniden başlatır. | Systemd, Supervisor | Uygulamanın kesintisiz hizmet vermesini (uptime) garanti altına alır ve sunucu yeniden başladığında otomatik olarak çalışmasını sağlar. |
Projemizi yapılandırmaya başlamadan önce, üzerinde çalışacağımız sunucuyu hazırlamalı ve temel güvenlik önlemlerini almalıyız. Bu adımlar, sağlam bir temel oluşturmak için hayati öneme sahiptir. Genellikle Ubuntu veya CentOS gibi bir Linux dağıtımı üzerinde çalışılır.
Bir sanal özel sunucu (VPS) veya bulut sunucu temin ettikten sonra, ilk olarak sisteme root kullanıcısı ile SSH üzerinden bağlanılır. Yapılması gereken ilk işlemler şunlardır:
sudo apt update && sudo apt upgrade -y
adduser yenikullanici
usermod -aG sudo yenikullanici
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
Bu adımlardan sonra sunucudan çıkış yapıp yeni oluşturduğumuz kullanıcı ile tekrar bağlanarak işlemlere devam etmeliyiz.
Django projemizin ihtiyaç duyacağı temel yazılımları sunucumuza kurmamız gerekiyor.
sudo apt install python3-pip python3-dev build-essential libpq-dev python3-venv
sudo apt install postgresql postgresql-contrib
sudo apt install nginx
Sunucumuz hazır olduğuna göre, artık Django projemizi adım adım yapılandırabiliriz. Bu aşama, projemizin kodunu sunucuya aktarmak, sanal ortamı kurmak, Gunicorn ve Nginx’i ayarlamaktan oluşur.
Proje dosyalarınızı yerel makinenizden sunucuya aktarmak için `git` kullanmak en iyi yöntemdir. Bu, hem versiyon kontrolü sağlar hem de güncellemeleri kolaylaştırır. Projenizi sunucudaki `/var/www/` veya ev dizininizdeki bir klasöre klonlayabilirsiniz.
Projenizin bağımlılıklarını sistem genelindeki Python paketlerinden izole etmek için bir sanal ortam (virtual environment) kullanmak zorunludur. Bu, farklı projeler için farklı paket versiyonları kullanmanıza olanak tanır ve çakışmaları önler.
cd /proje/dizini
python3 -m venv venv
source venv/bin/activate
Sanal ortam aktif hale geldikten sonra, projenizin `requirements.txt` dosyasında listelenen tüm bağımlılıkları `pip` ile kurun. Gunicorn’u da bu sanal ortama kurmayı unutmayın.
pip install -r requirements.txt
pip install gunicorn
Gunicorn’u manuel olarak çalıştırmak yerine, sunucu her yeniden başladığında otomatik olarak başlaması ve bir sorun olduğunda yeniden çalıştırılması için bir Systemd servis dosyası oluşturacağız. `/etc/systemd/system/gunicorn.service` adında bir dosya oluşturun ve içeriğini projenize göre düzenleyin:
[Unit]
Description=gunicorn daemon for myproject
After=network.target
[Service]
User=yenikullanici
Group=www-data
WorkingDirectory=/home/yenikullanici/projedizini
ExecStart=/home/yenikullanici/projedizini/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock projenin_wsgi_dosyasi.wsgi:application
[Install]
WantedBy=multi-user.target
Bu dosyayı oluşturduktan sonra servisi başlatın ve etkinleştirin:
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
Son adım, Nginx’i yapılandırarak gelen istekleri Gunicorn’a yönlendirmektir. Nginx ayrıca statik dosyaları doğrudan sunarak Django’yu bu yükten kurtaracaktır. Bu, Nginx vs Apache karşılaştırmasında Nginx’in öne çıktığı en önemli performans artışlarından biridir. `/etc/nginx/sites-available/projeadi` dosyasını oluşturun:
server {
listen 80;
server_name alanadiniz.com www.alanadiniz.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/yenikullanici/projedizini;
}
location /media/ {
root /home/yenikullanici/projedizini;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Bu yapılandırma dosyasını `sites-enabled` dizinine sembolik bir linkle bağlayarak aktif hale getirin ve Nginx’i yeniden başlatın.
sudo ln -s /etc/nginx/sites-available/projeadi /etc/nginx/sites-enabled
sudo systemctl restart nginx

Bu adımların tamamlanmasıyla birlikte, Django projeniz artık production ortamında, güvenli, performanslı ve ölçeklenebilir bir mimari üzerinde çalışmaya hazırdır. Bu yapı, projenizin büyümesine paralel olarak kolayca yönetilebilir ve geliştirilebilir bir temel sunar.