Flask Uygulamalarını Gunicorn ve Nginx ile Ubuntu 14.04 Üzerinde Dağıtma
Bu kapsamlı teknik makalede, bir Flask web uygulamasını üretim ortamında Gunicorn ve Nginx kullanarak Ubuntu 14.04 sunucusunda nasıl dağıtacağınızı adım adım öğreneceksiniz. Flask, Python ile hızlı ve verimli web uygulamaları geliştirmek için popüler bir mikro-çerçevedir. Ancak, geliştirme sunucusu (Flask’ın kendi içerisinde gelen app.run()) yalnızca geliştirme amaçlıdır ve üretim ortamında kullanılmamalıdır. Üretim ortamında, uygulamanızın trafiği güvenli, ölçeklenebilir ve performanslı bir şekilde yönetilmesi için özel araçlara ihtiyacınız vardır. İşte bu noktada Gunicorn bir WSGI sunucusu olarak ve Nginx ise bir ters proxy sunucusu olarak devreye girer.
Ubuntu 14.04, eski bir LTS (Uzun Süreli Destek) sürümü olmasına rağmen, birçok kuruluşta hala aktif olarak kullanılmaktadır. Bu makale, özellikle bu belirli işletim sistemi sürümüne odaklanarak, Gunicorn’ın bir Upstart hizmeti olarak nasıl yapılandırılacağını ve Nginx’in gelen istekleri bu hizmete nasıl yönlendireceğini ayrıntılı olarak açıklayacaktır.
Giriş: Neden Gunicorn ve Nginx?
Flask gibi Python tabanlı web çerçeveleri, HTTP isteklerini doğrudan işlemek için tasarlanmamıştır. Bunun yerine, “Web Sunucusu Ağ Geçidi Arayüzü” (WSGI) adı verilen bir standardı kullanarak web sunucularıyla iletişim kurarlar. Gunicorn (Green Unicorn), Python WSGI uygulamaları için sağlam, hızlı ve kullanımı kolay bir üretim sunucusudur. Flask uygulamanız ile Nginx arasında bir köprü görevi görür, uygulamanızın birden fazla örneğini çalıştırabilir ve istekleri bunlara dağıtabilir.
Nginx ise yüksek performanslı, açık kaynaklı bir web sunucusu ve ters proxy’dir. Flask uygulamanızı doğrudan internete açmak yerine, Nginx’i bir ters proxy olarak kullanmak birçok avantaj sağlar:
* Performans: Nginx, statik dosyaları (CSS, JavaScript, resimler) doğrudan sunarak Flask uygulamanızın bu tür isteklerle uğraşmasını engeller, bu da performansı artırır.
* Güvenlik: Nginx, uygulamanız ile dış dünya arasında bir katman oluşturarak çeşitli güvenlik tehditlerine karşı koruma sağlar.
* Yük Dengeleme: Birden fazla Gunicorn örneği çalıştırıyorsanız, Nginx gelen istekleri bu örneklere dağıtarak yük dengelemesi yapabilir.
* SSL/TLS Şifreleme: Nginx, HTTPS trafiğini yönetmek ve SSL sertifikalarını sonlandırmak için idealdir.
* Sıkıştırma ve Önbellekleme: Nginx, yanıtları sıkıştırabilir ve önbelleğe alabilir, bu da bant genişliğini azaltır ve yanıt sürelerini iyileştirir.
Bu kılavuz, Ubuntu 14.04’te bu araçları kullanarak Flask uygulamanızı güvenli ve verimli bir şekilde nasıl dağıtacağınızı adım adım gösterecektir.
Ön Gereksinimler
Bu kılavuzu takip etmek için aşağıdaki ön gereksinimlere sahip olmanız gerekmektedir:
* Ubuntu 14.04 yüklü bir sunucu (SSH erişimi ile).
* Temel Linux komut satırı bilgisi.
* Sunucunuzda sudo yetkilerine sahip bir kullanıcı.
* İsteğe bağlı olarak, sunucunuzu işaret eden bir alan adı (aksi takdirde IP adresi ile erişim sağlayabilirsiniz).
Sunucu Hazırlığı ve Python Ortamı Kurulumu
İlk adım, sunucunuzu hazırlamak ve Flask uygulamanız için gerekli Python ortamını kurmaktır.
Sistem Güncellemesi ve Temel Paketlerin Kurulumu
Sunucunuzdaki paket listelerini güncelleyerek ve yüklü paketleri yükselterek başlayın:
sudo apt-get update
sudo apt-get upgrade
Ardından, Python uygulamaları geliştirmek ve çalıştırmak için gerekli olan pip (Python paket yöneticisi) ve diğer geliştirme araçlarını yükleyin:
sudo apt-get install python-pip python-dev build-essential
Ubuntu 14.04 varsayılan olarak Python 2.7 ile gelir. Eğer Python 3 kullanmak istiyorsanız, python3-pip ve python3-dev gibi paketleri yüklemeniz gerekebilir. Bu kılavuz Python 2.7’yi varsayacaktır, ancak adımlar Python 3 için de benzerdir (sadece python yerine python3, pip yerine pip3 kullanmanız gerekebilir).
Uygulama Kullanıcısı ve Dizini Oluşturma
Güvenlik açısından, web uygulamanızı doğrudan root kullanıcısı altında çalıştırmamak en iyi uygulamadır. Uygulamanız için özel bir sistem kullanıcısı ve dizini oluşturalım.
sudo adduser --system --no-create-home flask_user
sudo mkdir -p /var/www/myflaskapp
sudo chown -R flask_user:flask_user /var/www/myflaskapp
Burada flask_user adında ev dizini olmayan bir sistem kullanıcısı oluşturduk ve uygulamanızın dosyalarını barındıracak /var/www/myflaskapp dizinini oluşturup sahibini flask_user olarak ayarladık.
Şimdi, uygulamanızın dizinine gidin ve sanal bir Python ortamı oluşturun. Sanal ortamlar, projenizin bağımlılıklarını sistem genelindeki Python kurulumundan izole etmenizi sağlar.
cd /var/www/myflaskapp
sudo pip install virtualenv # Eğer yüklü değilse
virtualenv venv
Sanal ortamı etkinleştirin:
source venv/bin/activate
Artık komut isteminizin başında (venv) ifadesini görmelisiniz, bu da sanal ortamın etkin olduğunu gösterir.
Flask Uygulaması Oluşturma
Şimdi, dağıtacağımız basit bir Flask uygulaması oluşturalım.
Örnek Flask Uygulaması
/var/www/myflaskapp dizini içinde app.py adında bir dosya oluşturun:
nano app.py
İçeriğini aşağıdaki gibi yapıştırın:
from flask import Flask, render_template_string, send_from_directory
import os
app = Flask(__name__)
Basit bir ana sayfa
@app.route('/')
def home():
return render_template_string('Bu bir Flask uygulamasının üretim dağıtımıdır.
')
Statik dosyalar için bir örnek
@app.route('/static/')
def static_files(filename):
return send_from_directory(app.root_path + '/static', filename)
if __name__ == '__main__':
app.run(debug=True)
Bu örnek, ana dizinde basit bir “Merhaba” mesajı döndüren ve /static URL’sinden statik dosyaları sunan bir Flask uygulamasıdır. Statik dosyaları test etmek için, /var/www/myflaskapp/static dizini oluşturup içine bir logo.png veya herhangi bir resim dosyası koyabilirsiniz.
mkdir static
Şimdi bu dizine bir logo.png dosyası kopyalayın, örneğin scp ile.
scp /path/to/local/logo.png user@your_server_ip:/var/www/myflaskapp/static/
Bağımlılıkları Yükleme
Uygulamanızın ihtiyaç duyduğu Python paketlerini (bu durumda sadece Flask) listeleyen bir requirements.txt dosyası oluşturun:
nano requirements.txt
İçeriği:
Flask
Şimdi bu bağımlılıkları sanal ortamınıza yükleyin:
pip install -r requirements.txt
Uygulamayı Test Etme
Uygulamanızın düzgün çalıştığından emin olmak için Gunicorn ile yerel olarak test edebilirsiniz. Önce sanal ortamınızın etkin olduğundan emin olun (source venv/bin/activate).
gunicorn --bind 0.0.0.0:5000 app:app
Bu komut, Gunicorn’ı uygulamanızı 5000 numaralı portta tüm arayüzlerde dinleyecek şekilde başlatır. app:app ifadesi, app.py dosyasındaki (modül adı app) app adlı Flask uygulama örneğini belirtir.
Şimdi sunucunuzun IP adresi ve 5000 portu üzerinden (örn. http://your_server_ip:5000) bir web tarayıcısıyla erişmeye çalışın. “Merhaba Gunicorn ve Nginx ile Flask!” mesajını görmelisiniz. Testi bitirdiğinizde Ctrl+C ile Gunicorn’ı durdurabilirsiniz.
Gunicorn Kurulumu ve Yapılandırması (Upstart ile)
Gunicorn’ı bir üretim sunucusu olarak çalıştırmak için, onu bir Upstart hizmeti olarak yapılandırmamız gerekiyor. Ubuntu 14.04, systemd yerine Upstart kullanır.
Gunicorn Kurulumu
Sanal ortamınız etkin durumdayken Gunicorn’ı yükleyin:
pip install gunicorn
Upstart Servisi Oluşturma
Gunicorn’ı bir Upstart servisi olarak yönetmek için /etc/init/myflaskapp.conf adında bir dosya oluşturun:
sudo nano /etc/init/myflaskapp.conf
İçeriğini aşağıdaki gibi yapıştırın:
description "Gunicorn server for myflaskapp"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
respawn limit 10 5
setuid flask_user
setgid www-data
chdir /var/www/myflaskapp
exec /var/www/myflaskapp/venv/bin/gunicorn --workers 3 --bind unix:/tmp/myflaskapp.sock app:app
Bu Upstart yapılandırma dosyası aşağıdaki anlamlara gelir:
* description: Servisin kısa bir açıklaması.
* start on runlevel [2345]: Servisin çok kullanıcılı grafiksel olmayan veya grafiksel ortamda otomatik olarak başlamasını sağlar.
* stop on runlevel [!2345]: Servisin bu çalışma seviyeleri dışında durdurulmasını sağlar (örn. kapanma veya tek kullanıcı modu).
* respawn: Servis beklenmedik bir şekilde durursa otomatik olarak yeniden başlatılır.
* respawn limit 10 5: 5 saniye içinde 10’dan fazla yeniden başlatma denemesi başarısız olursa servisi durdurur.
* setuid flask_user: Gunicorn sürecini flask_user kullanıcısı olarak çalıştırır.
* setgid www-data: Gunicorn sürecini www-data grubuna atar. Bu, Nginx’in Gunicorn soketine erişebilmesi için önemlidir.
* chdir /var/www/myflaskapp: Gunicorn’ın çalışacağı dizini belirtir.
* exec ...: Çalıştırılacak komutu belirtir. Burada sanal ortamdaki Gunicorn’ı, 3 çalışan süreçle (--workers 3), Nginx ile iletişim kurmak için bir Unix soket dosyasına (--bind unix:/tmp/myflaskapp.sock) bağlanarak ve app.py dosyasındaki app uygulamasını kullanarak başlatıyoruz.
Çalışan sayısı (--workers), sunucunuzun CPU çekirdek sayısına göre ayarlanmalıdır. Genel bir kural olarak (2 * CPU_çekirdek_sayısı) + 1 formülü kullanılabilir.
Gunicorn Servisini Başlatma
Şimdi Gunicorn servisini başlatın:
sudo start myflaskapp
Servisin durumunu kontrol edebilirsiniz:
sudo status myflaskapp
Çıktıda myflaskapp start/running gibi bir ifade görmelisiniz. Ayrıca, Gunicorn’ın Unix soket dosyasını oluşturup oluşturmadığını da kontrol edin:
ls -l /tmp/myflaskapp.sock
Çıktıda srwxrwxr-x ile başlayan bir dosya görmelisiniz, bu bir Unix soketi olduğunu ve doğru izinlere sahip olduğunu gösterir.
Nginx Kurulumu ve Yapılandırması
Gunicorn servisi artık arka planda çalışıyor ve Flask uygulamanızı Unix soketi üzerinden sunmaya hazır. Şimdi Nginx’i kurup yapılandırarak gelen web isteklerini bu sokete yönlendireceğiz.
Nginx Kurulumu
Nginx’i yükleyin:
sudo apt-get install nginx
Nginx yüklendikten sonra otomatik olarak başlayacaktır. Tarayıcınızdan sunucunuzun IP adresine giderek varsayılan Nginx karşılama sayfasını görmelisiniz.
Nginx Varsayılan Yapılandırmasını Devre Dışı Bırakma
Varsayılan Nginx yapılandırmasını devre dışı bırakın, böylece kendi yapılandırmamızı kullanabiliriz:
sudo rm /etc/nginx/sites-enabled/default
Nginx Sunucu Bloğu Oluşturma
Uygulamanız için yeni bir Nginx sunucu bloğu yapılandırma dosyası oluşturun:
sudo nano /etc/nginx/sites-available/myflaskapp
İçeriğini aşağıdaki gibi yapıştırın. your_domain.com ve www.your_domain.com yerine kendi alan adınızı veya sunucunuzun IP adresini yazmayı unutmayın.
server {
listen 80;
server_name your_domain.com www.your_domain.com your_server_ip;
# Flask uygulamasının statik dosyalarını Nginx üzerinden sun
location /static {
alias /var/www/myflaskapp/static;
expires 30d; # Statik dosyalar için önbellekleme
add_header Cache-Control "public, no-transform";
}
# Gelen tüm diğer istekleri Gunicorn'a yönlendir
location / {
include proxy_params;
proxy_pass http://unix:/tmp/myflaskapp.sock;
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;
}
}
Bu Nginx yapılandırma dosyası aşağıdaki anlamlara gelir:
* listen 80;: Nginx’in 80 numaralı portu (HTTP) dinlemesini sağlar.
* server_name ...;: Bu sunucu bloğunun hangi alan adları veya IP adresleri için geçerli olduğunu belirtir.
* location /static { ... }: /static ile başlayan URL’ler için Nginx’in /var/www/myflaskapp/static dizinindeki dosyaları doğrudan sunmasını sağlar. Bu, Flask uygulamanızın statik dosyalarla uğraşmasını engeller ve performansı artırır. expires ve add_header yönergeleri, tarayıcı önbelleklemesini etkinleştirir.
* location / { ... }: Diğer tüm gelen istekler için Nginx’in bu bloğu kullanmasını sağlar.
* include proxy_params;: Nginx’in Gunicorn’a iletmesi gereken standart proxy başlıklarını içerir. Bu dosya genellikle /etc/nginx/proxy_params veya /etc/nginx/fastcgi_params gibi bir yerde bulunur ve Host, X-Real-IP gibi önemli başlıkları ayarlar.
* proxy_pass http://unix:/tmp/myflaskapp.sock;: Gelen istekleri Gunicorn’ın dinlediği Unix soketine yönlendirir.
* proxy_set_header ...;: Bu başlıklar, orijinal istemci bilgilerini Gunicorn’a iletir, bu da uygulamanızın doğru IP adresini ve protokolü bilmesini sağlar.
Nginx Yapılandırmasını Etkinleştirme
Oluşturduğunuz yapılandırma dosyasını sites-enabled dizinine sembolik bir bağlantı oluşturarak etkinleştirin:
sudo ln -s /etc/nginx/sites-available/myflaskapp /etc/nginx/sites-enabled
Nginx Yapılandırmasını Test Etme ve Yeniden Başlatma
Nginx yapılandırmanızda herhangi bir sözdizimi hatası olup olmadığını kontrol edin:
sudo nginx -t
Eğer çıktı syntax is ok ve test is successful diyorsa, Nginx’i yeniden başlatarak yeni yapılandırmayı uygulayın:
sudo service nginx restart
Güvenlik Duvarını Ayarlama (UFW)
Eğer sunucunuzda UFW (Uncomplicated Firewall) etkinse, Nginx’in gelen HTTP isteklerini almasına izin vermeniz gerekir:
sudo ufw allow 'Nginx HTTP'
sudo ufw enable # Eğer etkin değilse
Uygulamanın Test Edilmesi
Artık her şey ayarlandığına göre, Flask uygulamanıza bir web tarayıcısı üzerinden erişebilirsiniz. Tarayıcınızda http://your_domain.com veya http://your_server_ip adresine gidin.
“Merhaba Gunicorn ve Nginx ile Flask!” mesajını ve eğer eklediyseniz statik resminizi görmelisiniz.
Sorun Giderme
Eğer uygulamanıza erişemiyorsanız veya hata alıyorsanız, aşağıdaki adımları kontrol edin:
* Nginx Hata Günlükleri: Nginx’in hata günlüklerini kontrol edin: sudo tail -f /var/log/nginx/error.log.
* Gunicorn Günlükleri: Upstart servisinin günlüklerini kontrol edin. Genellikle /var/log/upstart/myflaskapp.log konumundadır.
* Gunicorn Durumu: Gunicorn servisinin çalışıp çalışmadığını kontrol edin: sudo status myflaskapp.
* Soket Dosyası: Gunicorn soket dosyasının (/tmp/myflaskapp.sock) varlığını ve izinlerini kontrol edin. Nginx’in bu dosyaya erişebilmesi için www-data grubunun erişim izni olması gerekir (Gunicorn Upstart yapılandırmasında setgid www-data ile sağlanır).
* Nginx Yapılandırması: Nginx yapılandırma dosyanızın doğru olduğundan emin olun (sudo nginx -t).
* Güvenlik Duvarı: Nginx’in 80 numaralı portu dinlemesine izin verildiğinden emin olun (sudo ufw status).
* Alan Adı Çözümlemesi: Alan adınızın sunucunuzun IP adresine doğru şekilde işaret ettiğinden emin olun (DNS kayıtlarınızı kontrol edin).
Ek Güvenlik ve İyileştirmeler
Uygulamanızı üretim ortamında daha da güçlendirmek için aşağıdaki iyileştirmeleri düşünebilirsiniz:
SSL/TLS Şifrelemesi (HTTPS)
Web uygulamanızın güvenliğini artırmak için HTTPS kullanmak çok önemlidir. Let’s Encrypt ve Certbot, ücretsiz SSL/TLS sertifikaları sağlamanın ve Nginx ile otomatik olarak yapılandırmanın kolay bir yolunu sunar.
1. Certbot Kurulumu:
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx
2. Sertifika Alma:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Bu komut, Certbot’u Nginx yapılandırmanızı otomatik olarak güncelleyerek SSL sertifikalarını almasını ve HTTPS’i etkinleştirmesini sağlar.
Gunicorn Çalışan Sayısı Optimizasyonu
Gunicorn yapılandırmanızdaki --workers parametresi, uygulamanızın performansını doğrudan etkiler. Genellikle (2 * CPU_çekirdek_sayısı) + 1 formülü iyi bir başlangıç noktasıdır. Sunucunuzun CPU çekirdek sayısını grep -c processor /proc/cpuinfo komutuyla bulabilirsiniz. Daha fazla çalışan, daha fazla eşzamanlı isteği işleyebilir, ancak aynı zamanda daha fazla bellek tüketir. Uygulamanızın performansını izleyerek en uygun değeri bulmalısınız.
Ortam Değişkenleri Kullanımı
Hassas bilgileri (veritabanı kimlik bilgileri, API anahtarları vb.) doğrudan kodunuzda saklamak yerine ortam değişkenleri olarak ayarlamak daha güvenlidir. Upstart yapılandırma dosyasında env komutunu kullanarak ortam değişkenlerini ayarlayabilirsiniz:
# /etc/init/myflaskapp.conf içine eklenecek
env MY_SECRET_KEY="supersecretkey"
Ardından Flask uygulamanızda os.environ.get('MY_SECRET_KEY') ile bu değişkenlere erişebilirsiniz.
Statik Dosyalar İçin Daha İyi Yönetim
Nginx’in statik dosyaları doğrudan sunması performansı artırır. Flask’ın url_for('static', filename='...') fonksiyonunu kullanarak HTML şablonlarınızda statik dosyalarınıza doğru yollarla referans verdiğinizden emin olun.
Gelişmiş Nginx Yapılandırması
Nginx, sıkıştırma (gzip), önbellekleme, IP beyaz listeleme/kara listeleme gibi daha birçok gelişmiş özelliği destekler. Performansı ve güvenliği artırmak için Nginx yapılandırmanızı daha da optimize edebilirsiniz.
Sonuç
Bu makalede, bir Flask uygulamasını Ubuntu 14.04 sunucusunda Gunicorn ve Nginx kullanarak nasıl dağıtacağınızı adım adım öğrendiniz. Gunicorn, Flask uygulamanız için sağlam bir WSGI sunucusu sağlarken, Nginx ise ters proxy, statik dosya sunumu, yük dengeleme ve SSL sonlandırma gibi önemli görevleri üstlenir. Bu mimari, Flask uygulamanızın üretim ortamında güvenli, performanslı ve ölçeklenebilir bir şekilde çalışmasını sağlar.
Upstart ile Gunicorn servisini yapılandırmak ve Nginx’i gelen istekleri bu servise yönlendirecek şekilde ayarlamak, Ubuntu 14.04 gibi belirli bir işletim sistemi sürümünde dağıtım yaparken kritik adımlardır. Artık uygulamanız yayında olduğuna göre, performansını izlemeye, güvenlik önlemlerini sürekli güncel tutmaya ve gerektiğinde ek özellikler veya optimizasyonlar eklemeye devam edebilirsiniz. Bu temel kurulum, daha karmaşık ve ölçeklenebilir dağıtımlar için sağlam bir zemin oluşturur.
