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:
- 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ı
- sudo apt install python3-pip
- sudo apt install python3-dev
- sudo apt install build-essential
- sudo apt install libssl-dev
- sudo apt install libffi-dev
- 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
- sudo apt install python3-venv
Ardından, Flask projeniz için bir üst dizin oluşturun:
- mkdir ~/myproject
Aşağıdakileri girerek Flask projenizin Python gereksinimlerini depolamak için sanal bir ortam oluşturun:
- python3.6 -m venv myprojectenv
Bu, Python'un yerel bir kopyasını ve proje dizininizde çağrılan bir dizine yükleyecektir.pip
myprojectenv
Uygulamaları sanal ortama yüklemeden önce, aşağıdakileri çalıştırarak etkinleştirmeniz gerekir:
- 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:
(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
- pip install wheel
Ardından, Flask ve Gunicorn'u yükleyin:
- 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
- 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 + X
Y
ENTER
Ö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:
- sudo ufw allow 5000
Ardından Flask uygulamanızı aşağıdakileri çalıştırarak test edebilirsiniz:
- 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:
İş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
- 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:
- 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:
- 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:
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:
- 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
- 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ın
007
- 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:
- sudo systemctl start myproject
Ardından, önyüklemede başlaması için etkinleştirin:
- sudo systemctl enable myproject
Durumu kontrol edin:
- 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
- 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:
- sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
Bu dizindeki bağlantıyla, sözdizimi hatalarını test edebilirsiniz:
- 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:
- 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
- sudo ufw delete allow 5000
Ardından Nginx sunucusuna tam erişime izin verin:
- sudo ufw allow 'Nginx Full'
Artık web tarayıcınızda sunucunuzun alan adına gidebilmeniz gerekir:
- http://your_domain
Uygulamanızın çıktısı tarayıcınızda görünecektir:
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
Yorum Gönder