Flask Uygulamasını SSL ile Apache mod_wsgi Kullanarak Deploy Etme
Flask, python tabanlı bir web geliştirme framework’üdür. Flask ile basit web uygulamaları geliştirmek oldukça kolaydır. Flask’ın resmi dokümanlarına linkten ulaşabilirsiniz.
Flask uygulamasını test ortamında deploy etmek için herhangi ekstra bir araca ihtiyacınız yok. Aşağıdaki gibi hello.py
adında bir python dosyanız olduğunu varsayalım:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
Bu uygulamayı iki şekilde ayağa kaldırabilirsiniz:
python hello.py veyaexport FLASK_APP=hello.py
flask run
Fakat bu şekilde ayağa kaldırdığınızda size aşağıdaki gibi bir uyarı verecek:
WARNING: Do not use the development server in a production environment.
Bu yöntemler geliştirme veya test ortamı için uygun olsa da canlı ortam için önerilmez. Canlı ortam için Flask’ın kendi sitesinde önerilen bir çok yöntem var. Bunlardan bir tanesi de Apache’nin mod_wsgi modu. Bu yazıda örnek bir hello world uygulamasını bu mod ile deploy edeceğiz.
Bu demo için Ubuntu işletim sistemli bir sunucuda Apache ve Lets Encrypt kurulu olmalıdır. Apache için mod_wsgi kurulu olmalıdır:
sudo apt-get install libapache2-mod-wsgi
sudo a2enmod wsgi
Öncelikle /var/www dizini altında hello-world diye bir dizin oluşturuyoruz. Yine /var/www dizini altında bir de wsgi dizini oluşturuyoruz. hello-world dizininin altına uygulamamızı koyuyoruz. wsgi dizininin altına da helloworld.wsgi
dosyamızı koyuyoruz:
/var/www/wsgi/helloworld.wsgi
#!/usr/bin/pythonimport sys# Aşağıdaki satırdaki dizin, uygulamanın bulunduğu dizin olmalı.sys.path.insert(0,"/var/www/hello-world")# Aşağıdaki satırda from'dan sonra gelen, uygulamamızın ismi olmalı. Yani hello.py ise hello yazıyoruz.from hello import app as application
Letsencrypt ile sertifikaları oluşturduktan sonra uygulama için bir adet Apache konfigürasyon dosyası helloworld.conf
oluşturuyoruz. Burada servername olarak kullandığımız domain’i hello.py dosyasına da ekliyoruz. Burada kullanacağınız domain için gerekli yerleri değiştirmeniz gerekiyor.
/etc/apache2/sites-available/helloworld.conf
<IfModule mod_ssl.c>
<virtualhost *:443>
ServerName helloworld.kodgemisi.com WSGIDaemonProcess helloworld user=www-data group=www-data threads=5 home=/var/www/helloworld/
WSGIScriptAlias / /var/www/wsgi/helloworld.wsgi <directory /var/www/helloworld> WSGIProcessGroup helloworld
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On Order deny,allow
Allow from all
Require all granted </directory> <directory /var/www/wsgi> WSGIProcessGroup helloworld
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On Order deny,allow
Allow from all
Require all granted </directory> ErrorLog /var/www/helloworld/error.log
CustomLog /var/www/helloworld/access.log combined SSLCertificateFile /etc/letsencrypt/live/helloworld.kodgemisi.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/helloworld.kodgemisi.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/helloworld.kodgemisi.com/chain.pem</virtualhost>
</IfModule>
Bu konfigürasyon dosyasını enable ediyoruz:
sudo a2ensite helloworld.conf
Apache konfigürasyon dosyasında belirttiğimiz log dosyalarının oluşması için hello.py dosyamıza aşağıdakileri ekliyoruz:
import sys sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
Son aşamada hello.py
dosyası aşağıdaki gibi oluyor:
/var/www/helloworld/hello.py
from flask import Flask
import syssys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host="helloworld.kodgemisi.com")
Bütün konfigürasyonlar bittikten sonra Apache’yi restart etmemiz gerekiyor:
sudo service apache2 restart
Bu aşamadan sonra https://helloworld.kodgemisi.com adresinden uygulamaya erişebileceksiniz.