Ubuntu 18.04'teki Flask projesini Nginx üzerinde yayınlama.

 



Bu kılavuzda, Ubuntu 18.04'teki Flask mikro çerçevesini kullanarak bir Python uygulaması oluşturacaksınız. Bu makalenin büyük kısmı, Gunicorn uygulama sunucusunun nasıl kurulacağı ve uygulamanın nasıl başlatılacağı ve Nginx'in ön uç ters proxy olarak nasıl davranacağı hakkında olacaktır.


Adım 1 — Bileşenleri Ubuntu Depolarından Yükleme

İlk adım, gerekli tüm paketleri varsayılan Ubuntu depolarından yüklemektir. Bu, Python bileşenlerinizi yönetecek Python paket yöneticisini içerir. Ayrıca Gunicorn bileşenlerinden bazılarını oluşturmak için gerekli Python geliştirme dosyalarını da alacaksınız.pip

İlk olarak, yerel paketi güncelleştirin:



  1. sudo apt update

Ardından Python ortamınızı oluşturmanıza olanak tanıyan paketleri yükleyin. Bunlar, sağlam bir programlama ortamı için gerekli olan birkaç paket ve geliştirme aracıyla birlikte şunları 



  1. sudo apt install python3-pip
  2. sudo apt install python3-dev
  3. sudo apt install build-essential
  4. sudo apt install libssl-dev
  5. sudo apt install libffi-dev
  6. sudo apt install python3-setuptools


Bu paketler hazır olduğunda, projeniz için sanal bir ortam oluşturmaya geçin.


Adım 2 — Python Sanal Ortamı Oluşturma

Ardından, Flask uygulamanızı sistemdeki diğer Python dosyalarından yalıtmak için sanal bir ortam ayarlayın.

Modülü kuracak olan paketi yükleyerek başlayın


  1. sudo apt install python3-venv


Ardından, Flask projeniz için bir üst dizin oluşturun:


  1. mkdir ~/myproject


Aşağıdakileri girerek Flask projenizin Python gereksinimlerini depolamak için sanal bir ortam oluşturun:


  1. python3.6 -m venv myprojectenv



Bu, Python'un yerel bir kopyasını ve proje dizininizde çağrılan bir dizine yükleyecektir.pipmyprojectenv

Uygulamaları sanal ortama yüklemeden önce, aşağıdakileri çalıştırarak etkinleştirmeniz gerekir:


  1. source myprojectenv/bin/activate

İsteminiz, şu anda sanal ortamda çalıştığınızı gösterecek şekilde değişecektir. Aşağıdaki gibi okuyacaktır:

  1. (myprojectenv)\ssammy@host:~/myproject$

Adım 3 — Flask Uygulaması Kurma

Artık sanal ortamınızda olduğunuza göre, Flask ve Gunicorn'u yükleyebilir ve uygulamanızı tasarlamaya başlayabilirsiniz.

İlk olarak, tekerlek arşivleri eksik olsa bile paketlerinizin yükleneceğinden emin olmak için yerel örnekle yükleyin


  1. pip install wheel


Ardından, Flask ve Gunicorn'u yükleyin:


  1. pip install gunicorn flask

Artık Flask'ı kullanabildiğinize göre, bir sonraki adımda temel bir uygulama oluşturabilirsiniz.

Örnek Uygulama Oluşturma

Flask bir mikro çerçeve olduğundan, daha tam özellikli çerçevelerin yapabileceği araçların çoğunu içermez. Flask esas olarak bir web uygulamasının başlatılmasına yardımcı olmak için projelerinize aktarabileceğiniz bir modül olarak bulunur.

Uygulamanız daha karmaşık olsa da, Flask uygulamamızı . Tercih ettiğiniz metin düzenleyicisini kullanarak bu dosyayı oluşturun; burada kullanacağız 


  1. nano ~/myproject/myproject.py

Uygulama kodu bu dosyada yayınlanacaktır. Flask'ı içe aktarır ve bir Flask nesnesinin örneğini oluşturur. Belirli bir yol istendiğinde çalıştırılması gereken işlevleri tanımlamak için bunu kullanabilirsiniz:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
    app.run(host='0.0.0.0')


Bu, kök etki alanına erişildiğinde hangi içeriğin sunulacağını tanımlar. İşiniz bittiğinde dosyayı kaydedin ve kapatın. Nano kullanıyorsanız, bunu sonra ve .CTRL + XYENTER

Önkoşullardaki ilk sunucu kurulum kılavuzunu izlediyseniz, bir UFW güvenlik duvarının etkinleştirilmiş olması gerekir. Uygulamayı test etmek için önce bağlantı noktasına erişime izin vermeniz gerekir:


  1. sudo ufw allow 5000


Ardından Flask uygulamanızı aşağıdakileri çalıştırarak test edebilirsiniz:


  1. python myproject.py

Bu sunucu kurulumunu üretimde kullanmamanızı hatırlatan yararlı bir uyarı da dahil olmak üzere aşağıdaki gibi çıktılar alırsınız:

Output
* Serving Flask app 'myproject' (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on all addresses. WARNING: This is a development server. Do not use it in a production deployment. * Running on http://your_server_ip:5000/ (Press CTRL+C to quit)


Sunucunuzun IP adresini ve ardından web tarayıcınızı ziyaret edin::5000

http://your_server_ip:5000


Aşağıdakine benzer bir şey almalısınız:

Flask örnek uygulaması

İşiniz bittiğinde, Flask geliştirme sunucusunu durdurmak için terminal pencerenize basın.

WSGI Giriş Noktası Oluşturma

Ardından, uygulamanız için giriş noktası görevi görecek bir dosya oluşturun. Bu, Gunicorn sunucunuza uygulamayla nasıl etkileşime gireceğini söyleyecektir.

Tercih ettiğiniz metin düzenleyicisini kullanarak yeni bir dosya oluşturun ve adlandırın. Burada dosyayı arayacağız


  1. nano ~/myproject/wsgi.py

Bu dosyada, Flask örneğini uygulamanızdan içeri aktarın ve ardından çalıştırın:

from myproject import app

if __name__ == "__main__":
    app.run()


İşiniz bittiğinde dosyayı kaydedin ve kapatın.

Adım 4 — Gunicorn'u Yapılandırma

Başvurunuz artık bir giriş noktası oluşturularak yazılır ve Gunicorn'u yapılandırmaya devam edebilirsiniz.

Ama önce, uygun dizine geçin:


  1. cd ~/myproject

Ardından, Gunicorn'un giriş noktanızın adını ileterek uygulamayı doğru bir şekilde sunup sunamayacağını kontrol edebilirsiniz. Bu, modülün adı (eksi uzantı) ve uygulama içindeki çağrılabilir adın adı olarak oluşturulur. Bizim durumumuzda, bu şu şekilde yazılmıştır

Ayrıca, uygulamanın genel kullanıma açık bir arabirimde başlatılması için bağlanılacak arabirimi ve bağlantı noktasını da belirtirsiniz:


  1. gunicorn --bind 0.0.0.0:5000 wsgi:app

Aşağıdaki gibi çıktılar alacaksınız:

Output
[2021-11-19 23:07:57 +0000] [8760] [INFO] Starting gunicorn 20.1.0 [2021-11-19 23:07:57 +0000] [8760] [INFO] Listening at: http://0.0.0.0:5000 (8760) [2021-11-19 23:07:57 +0000] [8760] [INFO] Using worker: sync [2021-11-19 23:07:57 +0000] [8763] [INFO] Booting worker with pid: 8763 [2021-11-19 23:08:11 +0000] [8760] [INFO] Handling signal: int [2021-11-19 23:08:11 +0000] [8760] [INFO] Shutting down: Master


Sunucunuzun IP adresini web tarayıcınızın sonuna eklenmiş olarak tekrar ziyaret edin:


http://your_server_ip:5000


Uygulamanızın çıktısı aşağıdakileri oluşturur:

Flask örnek uygulaması

Düzgün çalıştığını onayladıktan sonra, terminal pencerenize basın.CTRL + C

Artık sanal ortamınızı işiniz bittiğinden, devre dışı bırakın:


  1. deactivate


Tüm Python komutları artık sistemin Python ortamını tekrar kullanacaktır.

Ardından, systemd hizmet birimi dosyasını oluşturun. Sistemli bir birim dosyası oluşturmak, Ubuntu'nun init sisteminin Gunicorn'u otomatik olarak başlatmasına ve sunucu her önyüklendiğinde Flask uygulamasına hizmet etmesine izin verecektir.

Başlamak için dizin içinde biten bir birim dosyası oluşturun


  1. sudo nano /etc/systemd/system/myproject.service

İçeride, meta verileri ve bağımlılıkları belirtmek için kullanılan bölümle başlayın. Buraya hizmetinizin bir açıklamasını ekleyin ve init sistemine bunu yalnızca ağ hedefine ulaşıldıktan sonra başlatmasını söyleyin:[Unit]

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

Ardından, bir bölüm oluşturun. Bu, işlemin altında çalışmasını istediğiniz kullanıcıyı ve grubu belirtir. İlgili tüm dosyaların sahibi olduğu için işlemin normal kullanıcı hesabı sahipliğini sağlayın. Ayrıca, Nginx'in Gunicorn süreçleriyle iletişim kurabilmesi için www-data grubuna grup sahipliği verin. Buradaki kullanıcı adını kullanıcı adınızla değiştirmeyi unutmayın:[Service]

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data


Ardından, çalışma dizininin eşini çıkarın ve ortam değişkenini, init sisteminin işlemin yürütülebilir dosyalarının sanal ortamınızda bulunduğunu bilmesi için ayarlayın. Ayrıca, hizmeti başlatmak için komutu belirtin. Bu komut aşağıdakileri yapar:PATH

  • 3 alt işlem başlatın (ancak bunu gerektiği gibi ayarlamanız gerekir)
  • Proje dizininizde bir Unix soket dosyası oluşturun ve bağlayın.myproject.sock
  • Yuva dosyasının sahibine ve grubuna erişim izni verirken diğer erişimi kısıtlayacak şekilde oluşturulması için bir umask değeri ayarlayın007
  • WSGI giriş noktası dosya adını, bu dosya içinde çağrılabilir Python ile birlikte belirtin (wsgi:app)

Systemd, sanal ortamınızda yüklü olan Gunicorn yürütülebilir dosyasının tam yolunu vermenizi gerektirir.

Kullanıcı adını ve proje yollarını kendi bilgilerinizle değiştirmeyi unutmayın:

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app


Son olarak, bir bölüm ekleyin. Bu, systemd'ye bu hizmetin önyüklemede başlatılmasını etkinleştirirseniz neye bağlanacağını söyleyecektir. Normal çok kullanıcılı sistem çalışır durumdayken bu hizmetin başlamasını istiyorsunuz:[Install]

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

Bununla, systemd servis dosyanız tamamlanır. Şimdi kaydedin ve kapatın.

Şimdi oluşturduğunuz Gunicorn servisini başlatın:


  1. sudo systemctl start myproject

Ardından, önyüklemede başlaması için etkinleştirin:


  1. sudo systemctl enable myproject

Durumu kontrol edin:


  1. sudo systemctl status myproject

Aşağıdaki gibi çıktı almanız gerekir:

Output
● myproject.service - Gunicorn instance to serve myproject Loaded: loaded (/etc/systemd/system/myproject.service; enabled; vendor preset Active: active (running) since Fri 2021-11-19 23:08:44 UTC; 6s ago Main PID: 8770 (gunicorn) Tasks: 4 (limit: 1151) CGroup: /system.slice/myproject.service ├─9291 /home/sammy/myproject/myprojectenv/bin/python3.6 /home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app ├─9309 /home/sammy/myproject/myprojectenv/bin/python3.6 /home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app ├─9310 /home/sammy/myproject/myprojectenv/bin/python3.6 /home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app └─9311 /home/sammy/myproject/myprojectenv/bin/python3.6 /home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app …

Herhangi bir hata alırsanız, öğreticiye devam etmeden önce bunları çözdüğünüzden emin olun.

Adım 5 — Nginx'i Proxy İsteklerine Yapılandırma

Gunicorn uygulama sunucunuz artık çalışır durumda olmalı ve proje dizinindeki soket dosyasındaki istekleri beklemelidir. Ardından, yapılandırma dosyasına bazı küçük eklemeler yaparak Nginx'i web isteklerini bu sokete geçirecek şekilde yapılandırın.

Nginx'in dizininde yeni bir sunucu bloğu yapılandırma dosyası oluşturarak başlayın. Kılavuzun geri kalanıyla tutarlı kalmak için buna çağrı yapacağız


  1. sudo nano /etc/nginx/sites-available/myproject

Bir sunucu bloğu açın ve Nginx'e varsayılan bağlantı noktasını dinlemesini söyleyin. Ayrıca, sunucunuzun alan adına yönelik istekler için bu bloğu kullanmasını söyleyin:80

server {
    listen 80;
    server_name your_domain www.your_domain;
}

Ardından, her istekle eşleşen bir konum bloğu ekleyin. Bu blok içinde, ayarlanması gereken bazı genel proxy parametrelerini belirten dosyayı ekleyin. Ardından istekleri yönergeyi kullanarak tanımladığınız sokete iletin:

server {
    listen 80;
    server_name your_domain www.your_domain;

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
    }
}

İşiniz bittiğinde dosyayı kaydedin ve kapatın.

Oluşturduğunuz Nginx sunucu bloğu yapılandırmasını etkinleştirmek için dosyayı dizine bağlayın. Bunu, sabit bağlantı yerine sembolik veya yumuşak bir bağlantı oluşturmak için komutu ve bayrağı çalıştırarak yapabilirsiniz:



  1. sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled


Bu dizindeki bağlantıyla, sözdizimi hatalarını test edebilirsiniz:


  1. sudo nginx -t


Bu, herhangi bir sorun belirtmeden geri dönerse, yeni yapılandırmayı okumak için Nginx işlemini yeniden başlatın:


  1. sudo systemctl restart nginx

Son olarak, güvenlik duvarını tekrar ayarlayın. Artık bağlantı noktası üzerinden erişime ihtiyacınız olmadığından, bu kuralı kaldırın


  1. sudo ufw delete allow 5000

Ardından Nginx sunucusuna tam erişime izin verin:


  1. sudo ufw allow 'Nginx Full'

Artık web tarayıcınızda sunucunuzun alan adına gidebilmeniz gerekir:



  1. http://your_domain


Uygulamanızın çıktısı tarayıcınızda görünecektir:

Flask örnek uygulaması

Herhangi bir hatayla karşılaşırsanız, aşağıdakileri kontrol etmeyi deneyin:

  • sudo less /var/log/nginx/error.log: Nginx hata günlüklerini denetler.
  • sudo less /var/log/nginx/access.log: Nginx erişim günlüklerini kontrol eder.
  • sudo journalctl -u nginx: Nginx işlem günlüklerini kontrol eder.
  • sudo journalctl -u myproject: Flask uygulamanızın Gunicorn günlüklerini kontrol eder.









Yorumlar