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 
veya
export 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/python
import 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 sys
sys.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.