Python Flask ya da Django uygulamasını Gunicorn ve systemd ile yayınlama

Linux Sunucu (SSH) 65 görüntülenme Markdown

Geliştirme sırasında flask run ya da python manage.py runserver ile çalışan uygulamanızı gerçek bir sunucuda yayınlamak için üç parça gerekir: uygulamayı üretim kalitesinde çalıştıran bir WSGI sunucusu (Gunicorn), sunucu yeniden başladığında ve çöktüğünde onu ayağa kaldıran bir servis yöneticisi (systemd) ve internete açan bir ters proxy (Nginx). Bu rehber üçünü bağlar. Örnekte uygulamanın /srv/uygulama klasöründe, uygulama.py dosyasında app adında bir Flask nesnesi olduğu varsayılmıştır.

1. Sanal ortam ve Gunicorn

sudo apt install -y python3-venv
cd /srv/uygulama
python3 -m venv venv
venv/bin/pip install flask gunicorn

Sanal ortamın nedenini venv makalesinde anlattık. Gunicorn'u elle deneyin:

venv/bin/gunicorn --bind 127.0.0.1:8000 uygulama:app

uygulama:app, "uygulama.py dosyasındaki app nesnesi" demektir. Django için proje.wsgi:application yazılır (proje, manage.py ile aynı yerdeki klasör adıdır). Başka bir terminalde curl -I http://127.0.0.1:8000 ile cevap geldiğini doğrulayın, sonra Gunicorn'u Ctrl+C ile durdurun.

2. systemd servisi

/etc/systemd/system/uygulama.service dosyasını oluşturun:

[Unit]
Description=Uygulama (Gunicorn)
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/srv/uygulama
Environment="PATH=/srv/uygulama/venv/bin"
ExecStart=/srv/uygulama/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 uygulama:app
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Servisi çalıştıran kullanıcının (www-data) /srv/uygulama klasörünü okuyabildiğinden emin olun (sudo chown -R www-data:www-data /srv/uygulama). Etkinleştirin:

sudo systemctl daemon-reload
sudo systemctl enable --now uygulama
sudo systemctl status uygulama

enable açılışta başlatır, --now hemen başlatır. Çalışıyorsa durum "active (running)" gösterir. Dosyanın söz dizimini önceden denetlemek için: systemd-analyze verify /etc/systemd/system/uygulama.service.

3. Nginx'e bağlayın

Uygulama yalnızca yerelde (127.0.0.1:8000) dinler; dışarıya Nginx açar. Ayarı Nginx ters proxy makalesindeki gibi yapın (proxy_pass http://127.0.0.1:8000;). https için Certbot: ücretsiz SSL.

Sık sorunlar

  • Servis başlamıyor: sudo journalctl -u uygulama -n 40 --no-pager asıl hatayı yazar. En sık sebepler: yanlış yol, venv içinde eksik paket, dosya izinleri: systemd servisi başlamıyor.
  • 502 Bad Gateway: Servis çalışmıyor ya da farklı bir porttadır: 502 hatası.
  • Kodu güncelleyince değişmiyor: Servisi yeniden başlatın: sudo systemctl restart uygulama.
  • Django statik dosyalar gelmiyor: Gunicorn statik dosya sunmaz; collectstatic sonrası Nginx'e location /static/ { alias /srv/uygulama/static/; } ekleyin.
  • Gizli anahtarlar: Parolaları kodun içine yazmayın; Environment= satırıyla ya da EnvironmentFile=/etc/uygulama.env (izni 600) dosyasıyla verin.

Daha basit, panel destekli çalışma için Bot ve Uygulama Hosting da bir seçenektir.

Sık sorulanlar

Kaç worker kullanmalıyım?

Genel kural: işlemci çekirdeği sayısının iki katı artı bir. 2 vCPU'lu bir sunucuda 3 ya da 5. Bellek yetmiyorsa azaltın; her worker uygulamanın bir kopyasını bellekte tutar.

Gunicorn yerine Uvicorn mu kullanmalıyım?

FastAPI gibi ASGI uygulamaları için Uvicorn (gerekirse Gunicorn'un Uvicorn worker'ıyla); Flask ve Django (WSGI) için Gunicorn yeterlidir.

Uygulamayı root olarak çalıştırmalı mıyım?

Hayır; servis için yetkisiz bir kullanıcı (www-data ya da özel bir kullanıcı) kullanın. Bir açık olursa saldırganın yetkisi sınırlı kalır.

İlgili makaleler

Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.