ارائه برنامه هاي Flask با Gunicorn و Nginx اوبونتو 20
در اين راهنما يك برنامه Python را با استفاده از ميكروفريم Flask در Ubuntu 20.04 ايجاد خواهيد كرد. بخش عمده اين مقاله در مورد نحوه تنظيم سرور برنامه Gunicorn و نحوه راه اندازي و پيكربندي برنامه Nginx براي عمل به عنوان يك پروكسي معكوس front-end خواهد بود.
پيش نيازها
قبل از شروع اين راهنما ، بايد اين موارد را داشته باشيد:
⦁ سروري با اوبونتو 20.04 و يك كاربر غير ريشه با امتيازات sudo. براي راهنمايي ، مقاله ستاپ اوليه سرور ما را دنبال كنيد.
⦁ Nginx نصب شده داشته باشيد، مراحل 1 و 2 نحوه نصب Nginx در اوبونتو 20.04 را دنبال كنيد.
⦁ نام دامنه پيكربندي شده براي اشاره به سرور شما. مي توانيد در Namecheap خريداري كنيد يا يكي از آنها را به صورت رايگان در Freenom دريافت كنيد. حتماً ركورهاي DNS زير را ايجاد كنيد:
o يك ركورد A با your_domain كه به آدرس IP عمومي سرور شما اشاره مي كند.
o يك ركورد A با www.your_domain كه به آدرس IP عمومي سرور شما اشاره كند.
⦁ آشنايي با مشخصات WSGI ، كه سرور برنامه Gunicorn براي ارتباط با برنامه Flask از آن استفاده خواهد كرد . اين بحث به تفصيل به تعاريف و مفاهيم مي پردازد.
مرحله 1 – نصب مولفه ها از مخازن اوبونتو
اولين قدم ما نصب تمام بخش هاي مورد نياز از مخازن اوبونتو خواهد بود. اين موارد شامل pip ، مدير بسته پايتون براي مديريت مولفه هاي پايتون خواهد بود. همچنين فايل هاي توسعه پايتون لازم براي ساخت برخي مولفه هاي Gunicorn دريافت خواهيم كرد.
ابتدا ، اجازه دهيد ايندكس بسته محلي را به روز كنيم و بسته هايي را نصب كنيم كه به ما امكان مي دهد محيط Python خود را بسازيم. اين موارد شامل python3-pip ، همراه با چند بسته ديگر و ابزار توسعه لازم براي يك محيط برنامه نويسي قوي است:
⦁ $ sudo apt update
⦁
⦁ $ sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
با قرارگيري اين بسته ها در جاي خود، به سمت ايجاد يك فضاي مجازي براي پروژه خود برويم.
مرحله 2 – ايجاد يك محيط مجازي پايتون
در مرحله بعدي ، يك محيط مجازي تنظيم خواهيم كرد تا بتوانيم برنامه Flask خود را از ساير فايل هاي Python روي سيستم جدا كنيم.
با نصب بسته python3-venv شروع كنيد كه ماژول venv را نصب خواهد كرد:
⦁ $ sudo apt install python3-venv
⦁
در مرحله بعد ، بياييد يك دايركتوري والد براي پروژه Flask تهيه كنيم. بعد از ايجاد آن وارد پوشه شويد:
⦁ $ mkdir ~/myproject
⦁
⦁ $ cd ~/myproject
يك محيط مجازي ايجاد كنيد تا نيازمندي هاي پايتون پروژه Flask خود را با تايپ كردن دستور زير ذخيره كنيد:
⦁ $ python3 -m venv myprojectenv
⦁
با اين كار يك كپي محلي از Python و pip در ديركتوري به نام myprojectenv درون ديركتوري پروژه شما كپي ميشود.
قبل از نصب برنامه ها در محيط مجازي ، بايد آن را فعال كنيد. اين كار را با تايپ كردن دستور زير انجام دهيد:
⦁ $ source myprojectenv/bin/activate
⦁
اعلان شما تغيير مي كند و نشان مي دهد كه اكنون در محيط مجازي كار مي كنيد. چيزي شبيه به (myprojectenv)user@host:~/myproject$ به نظر مي رسد .
مرحله 3 – تنظيم يك برنامه Flask
اكنون كه در محيط مجازي خود قرار داريد ، مي توانيد Flask و Gunicorn را نصب كرده و طراحي برنامه خود را شروع كنيد.
ابتدا بگذاريد wheel را با نمونه محلي pip نصب كنيم تا اطمينان حاصل شود كه بسته هاي ما حتي در صورت از دست دادن بايگاني wheel ، نصب مي شوند:
⦁ $ pip install wheel
⦁
توجه داشته باشيد
صرفنظر از اينكه از كدام نسخه Python استفاده مي كنيد ، هنگامي كه محيط مجازي فعال مي شود ، بايد از دستور pip استفاده كنيد (نه pip3)
سپس ، اجازه دهيد Flask و Gunicorn را نصب كنيم:
⦁ (myprojectenv) $ pip install gunicorn flask
⦁
ايجاد يك برنامه نمونه
اكنون كه Flask را در دسترس داريد ، مي توانيد يك برنامه ساده ايجاد كنيد. Flask يك ميكروفريم ورك است. و بسياري از ابزارهايي كه ممكن است چهارچوبهاي كامل تري داشته باشند را شامل نميشود، و عمدتاً به عنوان ماژول وجود دارد كه مي توانيد براي شروع برنامه هاي وب از كمك بگيريد تا بتوانيد به پروژه هاي خود وارد شويد.
در حالي كه ممكن است برنامه شما پيچيده تر باشد ، ما برنامه Flask خود را در يك فايل واحد با نام myproject.py ايجاد خواهيم كرد:
⦁ (myprojectenv) $ nano ~/myproject/myproject.py
⦁
كد برنامه در اين فايل قرار دارد. Flask را وارد مي كند و يك آبجكت Flask را معرفي مي كند. شما مي توانيد از اين ويژگي براي تعريف عملكردهايي استفاده كنيد كه بايد هنگام درخواست يك مسير خاص انجام شود:
~/myproject/myproject.py
from flask import Flask
app = Flask(__name__)
@app.route(“/”)
def hello():
return “
Hello There!
”if __name__ == “__main__”:
app.run(host=’0.0.0.0′)
اين كد اساساً مشخص مي كند كه هنگام دستيابي به حوزه root ، چه محتوايي ارائه شود. پس از اتمام فايل را ذخيره كنيد و ببنديد.
اگر راهنماي اوليه تنظيم سرور را دنبال كرده ايد ، بايد فايروال UFW را فعال كرده باشيد. براي تست برنامه ، بايد دسترسي به پورت 5000 را داشته باشيد:
⦁ (myprojectenv) $ sudo ufw allow 5000
⦁
اكنون مي توانيد برنامه Flask خود را با تايپ كردن دستور زير تست كنيد:
⦁ (myprojectenv) $ python myproject.py
⦁
خروجي مانند اين را مشاهده خواهيد كرد ، كه شامل يك هشدار مفيد است كه به شما يادآوري مي كند از اين ستاپ سرور در توليد استفاده نكنيد:
Output
* Serving Flask app “myproject” (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
از آدرس IP سرور و به دنبال آن: 5000 در مرورگر وب خود بازديد كنيد:
http://your_server_ip:5000
بايد چيزي شبيه به اين را ببينيد:
پس از اتمام ، CTRL-C را در پنجره ترمينال خود بزنيد تا سرور توسعه Flask متوقف شود.
ايجاد نقطه ورود WSGI
در مرحله بعدي ، فايلي را ايجاد ميكنيم كه به عنوان نقطه ورود برنامه ما باشد. اين به سرور Gunicorn مي گويد كه چگونه مي توان با آن تعامل برقرار كرد.
بياييد فايل wsgi.py را فراخواني كنيم:
⦁ (myprojectenv) $ nano ~/myproject/wsgi.py
⦁
در اين فايل ، بياييد نمونه Flask را از برنامه خود وارد كنيم و سپس آن را اجرا كنيم:
~/myproject/wsgi.py
from myproject import app
if __name__ == “__main__”:
app.run()
پس از اتمام فايل را ذخيره كنيد و ببنديد.
مرحله 4 – پيكربندي Gunicorn
برنامه شما اكنون با يك نقطه ورود مشخص نوشته شده است. اكنون مي توانيم به سراغ پيكربندي Gunicorn برويم.
قبل از پيش روي، بايد بررسي كنيم كه Gunicorn ميتواند به درستي برنامه را ارائه كند.
ما مي توانيم اين كار را به سادگي با وارد كردن نام نقطه ورودي خود انجام دهيم. اين نام با نام ماژول ساخته شده است (منهاي پسوند .py) به علاوه نام قابل فراخواني درون برنامه. در نمونه ما ، wsgi:app است.
رابط و پورت را نيز مشخص مي كنيم تا برنامه در يك رابط در دسترس عمومي شروع شود:
⦁ (myprojectenv) $ cd ~/myproject
⦁
⦁ (myprojectenv) $ gunicorn –bind 0.0.0.0:5000 wsgi:app
⦁
⦁
بايد خروجي زير را مشاهده كنيد
Output
[2020-05-20 14:13:00 +0000] [46419] [INFO] Starting gunicorn 20.0.4
[2020-05-20 14:13:00 +0000] [46419] [INFO] Listening at: http://0.0.0.0:5000 (46419)
[2020-05-20 14:13:00 +0000] [46419] [INFO] Using worker: sync
[2020-05-20 14:13:00 +0000] [46421] [INFO] Booting worker with pid: 46421
آدرس IP سرور خود را به همراه 5000 در ادامه اش بازديد كنيد
http: // your_server_ip: 5000
بايد دوباره خروجي برنامه خود را مشاهده كنيد:
وقتي تأييد كرديد كه به درستي كار ميكند ، CTRL-C را در پنجره ترمينال خود فشار دهيد.
اكنون محيط مجازي خود را ايجاد كرده ايم ، بنابراين مي توانيم آن را غيرفعال كنيم:
⦁ (myprojectenv) $ deactivate
⦁
هر دستور پايتون اكنون دوباره از محيط پايتون سيستم استفاده خواهد كرد.
در مرحله بعد بياييد فايل واحد سرويس سيستمي را ايجاد كنيم. ايجاد فايل واحد سيستمي به سيستم init اوبونتو اجازه خواهد داد كه به طور خودكار Gunicorn را شروع كند و برنامه Flask را در زمان بوت سرور ارائه نمايد.
براي شروع يك فايل واحد كه به .serviceختم ميشود در ديركتوري /etc/systemd/systemايجاد كنيد:
⦁ $ sudo nano /etc/systemd/system/myproject.service
⦁
در داخل ، با بخش [unit ] شروع خواهيم كرد كه براي تعيين متاديتا و متعلقات استفاده ميشود. بياييد توصيفي از سرويس را در اينجا قرار دهيم و به سيتم init بگوييم فقط پس از دستيابي به هدف شبكه شروع شود:
/etc/systemd/system/myproject.service
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
سپس ، اجازه دهيد بخش [Service] را باز كنيم. با اين كار كاربر و گروهي را كه مي خواهيم تحت روند كار قرار بگيرند مشخص مي كند. بياييد مالكيت اين فرآيند را به حساب كاربري معمول خود بدهيم زيرا اين فايل در اختيار همه فايل هاي مربوطه است. همچنين بياييد مالكيت گروه را به گروه www-data واگذار كنيم تا Nginx بتواند به راحتي با فرآيندهاي Gunicorn ارتباط برقرار كند. به ياد داشته باشيد كه نام كاربري خود را در اينجا جايگزين كنيد:
/etc/systemd/system/myproject.service
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=sammy
Group=www-data
در مرحله بعدي ، بگذاريد ديركتوري كار را مشخص كنيم و متغير محيطي PATH را تنظيم كنيم تا سيستم init بداند كه موارد اجرايي اين فرآيند در محيط مجازي ما قرار دارند. اجازه دهيد فرمان شروع سرويس را نيز مشخص كنيم. فرمان موارد زير را انجام ميدهد:
⦁ 3 فرآيند كارگر را شروع ميكند (اگرچه لازم است اين بخش را در صورت لزوم تنظيم كنيد)
⦁ يك فايل سوكت يونيكس myproject.sock ، در ديركتوري پروژه ما ايجاد كرده و به آن وصل ميشود. ما يك مقدار umask 007 تنظيم مي كنيم تا فايل سوكت ايجاد شود و دسترسي به مالك و گروه را ايجاد كند در حاليكه دسترسي ديگر را محدود مي كند .
⦁ نام فايل نقطه ورود WSGI را به همراه پايتون قابل فراخواني در آن فايل مشخص ميكند (wsgi: app)
Systemd مستلزم اين است كه ما مسير كاملي را به Gunicorn ، كه در محيط مجازي ما نصب شده است ، بدهيم.
به ياد داشته باشيد كه نام كاربري و مسير پروژه را با اطلاعات شخصي خود جايگزين كنيد:
/etc/systemd/system/myproject.service
[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
در آخر ، بياييد يك بخش [Install] اضافه كنيم. اگر سيستم را فعال كنيم كه در بوت شروع شود ، به systemd ميگويد كه به اين سرويس چه چيزي را لينك بدهد. نياز داريم اين سرويس در زمان اجراي سيستم معمولي چند كاربره شروع به كار كند:
/etc/systemd/system/myproject.service
[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
با اين كار ، فايل سرويس سيستمي ما كامل است. اكنون آن را ذخيره كنيد و ببنديد.
اكنون مي توانيم سرويس Gunicorn را كه ايجاد كرديم شروع كنيم و آن را فعال كنيم تا در بوت شروع شود:
⦁ $ sudo systemctl start myproject
⦁
⦁ $ sudo systemctl enable myproject
بگذاريد وضعيت را بررسي كنيم:
⦁ $ sudo systemctl status myproject
⦁
بايد خروجي مانند اين را مشاهده كنيد:
Output
● myproject.service – Gunicorn instance to serve myproject
Loaded: loaded (/etc/systemd/system/myproject.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-05-20 14:15:18 UTC; 1s ago
Main PID: 46430 (gunicorn)
Tasks: 4 (limit: 2344)
Memory: 51.3M
CGroup: /system.slice/myproject.service
├─46430 /home/sammy/myproject/myprojectenv/bin/python3 /home/sammy/myproject/myprojectenv/bin/gunicorn –workers 3 –bind unix:myproject.sock -m 007 wsgi:app
├─46449 /home/sammy/myproject/myprojectenv/bin/python3 /home/sammy/myproject/myprojectenv/bin/gunicorn –workers 3 –bind unix:myproject.sock -m 007 wsgi:app
├─46450 /home/sammy/myproject/myprojectenv/bin/python3 /home/sammy/myproject/myprojectenv/bin/gunicorn –workers 3 –bind unix:myproject.sock -m 007 wsgi:app
└─46451 /home/sammy/myproject/myprojectenv/bin/python3 /home/sammy/myproject/myprojectenv/bin/gunicorn –workers 3 –bind unix:myproject.sock -m 007 wsgi:app
در صورت مشاهده هر گونه خطا ، حتما آنها را قبل از ادامه آموزش برطرف كنيد.
مرحله 5 – پيكربندي Nginx به درخواستهاي پروكسي
سرور برنامه Gunicorn ما بايد اكنون به روز و در حال اجرا و منتظر درخواست هايي روي فايل سوكت در ديركتوري پروژه باشد. بياييد Nginx را پيكربندي كنيم تا درخواست هاي وب را با استفاده از پروتكل Gunicorn به آن سوكت منتقل كنيم.
با ايجاد يك فايل پيكربندي بلوك جديد سرور در ديركتوري sites-available Nginx شروع كنيد. بياييد اين پروژه را myproject بناميم تا با بقيه راهنما مطابقت داشته باشد:
⦁ $ sudo nano /etc/nginx/sites-available/myproject
⦁
يك بلوك سرور باز كنيد و به Nginx بگوييد كه به پورت پيش فرض 80 گوش كند. همچنين بياييد به آن اعلام كنيم كه از اين بلوك براي درخواست هاي نام دامنه سرور ما استفاده كند:
/etc/nginx/sites-available/myproject
server {
listen 80;
server_name your_domain www.your_domain;
}
سپس ، بياييد يك بلوك موقعيت مكاني اضافه كنيم كه مطابق با هر درخواست باشد. در اين بلوك ، فايل غير مجاز مي باشد_params را وارد خواهيم كرد كه پارامترهاي كلي پروكسي مورد نياز براي تنظيم را مشخص مي كند. سپس درخواستها را به سوكت تعريف شده با استفاده از بخشنامه غير مجاز مي باشد _pass ارسال خواهيم كرد:
/etc/nginx/sites-available/myproject
server {
listen 80;
server_name your_domain www.your_domain;
location / {
include غير مجاز مي باشد_params;
غير مجاز مي باشد_pass http://unix:/home/sammy/myproject/myproject.sock;
}
}
پس از اتمام فايل را ذخيره كنيد و ببنديد.
براي فعال كردن پيكربندي بلوك سرور Nginx كه اخيراً ايجاد كرده ايد ، فايل را به ديركتوري sites-enabled پيوند دهيد:
⦁ $ sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
⦁
با قرارگيري فايل در آن ديركتوري ، مي توانيم با تايپ كردن دستور زير خطاهاي نحوي را آزمايش كنيم:
⦁ $ sudo nginx -t
⦁
اگر بدون نشان دادن مشكلي بازگشت ، فرايند Nginx را ريستارت كنيد تا پيكربندي جديد را بخواند:
⦁ $ sudo systemctl restart nginx
⦁
در آخر ، اجازه دهيد دوباره فايروال را تنظيم كنيم. ديگر نيازي به دسترسي از طريق پورت 5000 نداريم ، بنابراين مي توانيم اين قانون را حذف كنيم. سپس مي توانيم به سرور Nginx دسترسي داشته باشيم:
⦁ $ sudo ufw delete allow 5000
⦁
⦁ $ sudo ufw allow ‘Nginx Full’
اكنون بايد بتوانيد در مرورگر وب خود به نام دامنه سرور خود برويد:
http: // your_domain
بايد خروجي برنامه خود را مشاهده كنيد:
اگر با خطايي مواجه شديد ، موارد زير را بررسي كنيد:
⦁ sudo less /var/log/nginx/error.log ورودهاي مربوط به خطاي Nginx را بررسي مي كند.
⦁ sudo less /var/log/nginx/access.log ورودهاي مربوط به دسترسي Nginx را بررسي مي كند.
⦁ sudo journalctl -u nginx ورود هاي مربوط به فرآيند Nginx را بررسي مي كند.
⦁ sudo journalctl -u myproject ورود هاي GUNICORN برنامه Flask شما را بررسي مي كند.
مرحله 6 – امنيت بخشي به برنامه
براي اطمينان از ايمن ماندن ترافيك رو به سرور شما ، اجازه دهيد يك گواهي SSL براي دامنه تان دريافت كنيم. روش هاي مختلفي براي اين كار وجود دارد ، از جمله دريافت گواهينامه رايگان از Let’s Encrypt ، توليد يك گواهي خود امضا شده يا خريد از ارائه دهنده ديگر و پيكربندي Nginx براي استفاده از آن با دنبال كردن مراحل 2 تا 6 نحوه ايجاد يك گواهي SSL خود امضا شده براي Nginx در اوبونتو 20.04. بنابر صلاح ديد ، گزينه ي اول را انتخاب ميكنيم.
ابتدا بسته Certbot Nginx را نصب كنيد:
⦁ $ sudo apt install python3-certbot-nginx
⦁
Certbot روشهاي مختلفي براي به دست آوردن گواهينامه هاي SSL از طريق افزونه ها ارائه مي دهد. افزونه Nginx از پيكربندي مجدد Nginx و لود مجدد در صورت لزوم ، مراقبت خواهد كرد. براي استفاده از اين افزونه ، دستور زير را تايپ كنيد:
⦁ $ sudo certbot –nginx -d your_domain -d www.your_domain
⦁
اين دستور certbot را با افزونه –nginx با استفاده از -d اجرا ميكند تا نام هايي كه مي خواهيم گواهي براي آنها اعتبار داشته باشد ، مشخص شوند.
اگر اولين بار است كه certbot را اجرا ميكنيد ، از شما خواسته مي شود كه آدرس ايميل را وارد كنيد و با شرايط سرويس موافقت كنيد. بعد از انجام اين كار ، certbot با سرور Let’s Encrypt ارتباط برقرار مي كند ، سپس براي تأييد اينكه دامنه مورد نظر خود را كنترل مي كنيد ، يك چالش را اجرا كنيد.
اگر موفقيت آميز باشد ، certbot از شما مي پرسد كه مي خواهيد تنظيمات HTTPS خود را چگونه پيكربندي كنيد.
Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
——————————————————————————-
1: No redirect – Make no further changes to the webserver configuration.
2: Redirect – Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you’re confident your site works on HTTPS. You can undo this
change by editing your web server’s configuration.
——————————————————————————-
Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel):
انتخاب خود را مشخص كنيد و سپس ENTER بزنيد. پيكربندي به روز خواهد شد ، و Nginx مجدد لود مي شود تا تنظيمات جديد را انتخاب كند. certbot با پيغامي همراه خواهد بود كه به شما مي گويد روند موفقيت آميز بوده و گواهي نامه هاي شما در كجا ذخيره شده است:
Output
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/your_domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/your_domain/privkey.pem
Your cert will expire on 2020-08-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the “certonly” option. To non-interactively renew *all* of
your certificates, run “certbot renew”
– Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
– If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
اگر دستورالعمل نصب Nginx را در پيش نيازها دنبال كرديد ، ديگر نيازي به اجازه پروفايل HTTP نخواهيد داشت:
⦁ $ sudo ufw delete allow ‘Nginx HTTP’
⦁
براي تأييد پيكربندي ، اجازه دهيد يكبار ديگر با استفاده از https: // به دامنه خود برويم:
https: // your_domain
بايد يك بار ديگر خروجي برنامه خود را همراه با نشانگر امنيتي مرورگر خود مشاهده كنيد ، كه بايد نشانگر امنيت سايت باشد.
نتيجه
در اين راهنما ، يك برنامه ساده Flask را در يك محيط مجازي Python ايجاد و ايمن كرده ايد. يك نقطه ورود WSGI ايجاد كرديد تا هر سرور برنامه WSGI قادر به استفاده از آن باشد و سپس سرور برنامه Gunicorn را براي ارائه اين عملكرد پيكربندي نموديد. پس از آن ، يك فايل سرويس سيستمي ايجاد كرديد تا سرور برنامه در زمان بوت به صورت خودكار راه اندازي شود. همچنين يك بلوك سرور Nginx ايجاد كرديد كه ترافيك كلاينت وب را به سرور برنامه منتقل مي كند ، درخواست هاي خارجي را منتقل مي كند و با Let’s Encrypt ، سرور شما را ايمن نمايد.
Flask يك چارچوب بسيار ساده اما بسيار انعطاف پذير به معناي ارائه برنامه ها با قابليت هاي زياد بدون محدوديت در ساختار و طراحي است. مي توانيد از خدمات پشته عمومي كه در اين راهنما تشريح شده است استفاده كنيد تا بتوانيد كاربردهاي Flask را كه طراحي كرده ايد ارائه دهيد.
نحوه ارائه برنامه هاي كاربردي فلاش با Gunicorn و Nginx در اوبونتو 20.04
مقدمه
در اين راهنما يك برنامه Python را با استفاده از ميكروفون Flask در Ubuntu 20.04 ايجاد خواهيد كرد. بخش عمده اين مقاله در مورد نحوه تنظيم سرور برنامه Gunicorn و نحوه راه اندازي برنامه و پيكربندي Nginx براي عمل به عنوان يك پروكسي معكوس جلويي خواهد بود.
پيش نيازها
قبل از شروع اين راهنما ، بايد اين موارد را داشته باشيد:
• سروري با اوبونتو 20.04 نصب شده و يك كاربر غير ريشه با امتيازات sudo. براي راهنمايي ، راهنماي تنظيم اوليه سرور ما را دنبال كنيد.
• Nginx نصب شده ، مراحل زير 1 و 2 نحوه نصب Nginx در اوبونتو 20.04 را دنبال كنيد.
• نام دامنه پيكربندي شده براي اشاره به سرور شما. مي توانيد يكي از آنها را در Namecheap خريداري كنيد يا يكي از آنها را به صورت رايگان در Freenom دريافت كنيد. با دنبال كردن مستندات مربوط به دامنه ها و DNS مي توانيد ياد بگيريد كه چگونه دامنه ها را به DigitalOcean نشان دهيد. حتماً سوابق DNS زير را ايجاد كنيد:
o يك ضبط با your_domain كه به آدرس IP عمومي سرور شما نشان مي دهد.
o ضبط با www.your_domain كه به آدرس IP عمومي سرور شما نشان مي دهد.
• آشنايي با مشخصات WSGI ، كه سرور Gunicorn براي ارتباط با برنامه Flask شما استفاده خواهد كرد. اين بحث WSGI را با جزئيات بيشتري پوشش مي دهد.
مرحله 1 – نصب قطعات از مخازن اوبونتو
اولين قدم ما نصب تمام قطعات مورد نياز از مخازن اوبونتو خواهد بود. اين شامل پيپ ، مدير بسته پايتون است كه اجزاي پايتون ما را مديريت مي كند. ما همچنين پرونده هاي توسعه پايتون را براي ساختن برخي از اجزاي Gunicorn لازم دريافت خواهيم كرد.
ابتدا ، اجازه دهيد شاخص بسته محلي را به روز كنيم و بسته هايي را نصب كنيم كه به ما امكان مي دهد محيط Python خود را بسازيم. اين موارد شامل python3-pip ، همراه با چند بسته ديگر و ابزار توسعه لازم براي يك محيط برنامه نويسي قوي است:
با استفاده از اين بسته ها ، به سمت ايجاد يك فضاي مجازي براي پروژه خود برويم.
مرحله 2 – ايجاد يك محيط مجازي پايتون
در مرحله بعدي ، ما يك محيط مجازي تنظيم خواهيم كرد تا بتوانيم برنامه Flask خود را از ساير پرونده هاي Python روي سيستم جدا كنيم.
با نصب بسته python3-venv كه ماژول venv را نصب خواهد كرد شروع كنيد:
در مرحله بعد ، بياييد يك دايركتوري والدين براي پروژه Flask تهيه كنيم. بعد از ايجاد آن وارد پوشه شويد:
يك محيط مجازي ايجاد كنيد تا نيازهاي پايتون پروژه Flask خود را با تايپ كردن ذخيره كنيد:
با اين كار يك كپي محلي از Python نصب مي شود و به پوشه اي به نام myprojectenv درون فهرست پروژه شما مي پيوندد.
قبل از نصب برنامه ها در محيط مجازي ، بايد آن را فعال كنيد. اين كار را با تايپ كردن انجام دهيد:
اعلان شما تغيير مي كند و نشان مي دهد كه اكنون در محيط مجازي كار مي كنيد. چيزي شبيه به اين خواهد بود: (myprojectenv) user @ host: ~ / myproject $.
مرحله 3 – تنظيم يك برنامه فلاسك
اكنون كه در محيط مجازي خود قرار داريد ، مي توانيد Flask و Gunicorn را نصب كنيد و در طراحي برنامه خود شروع كنيد.
ابتدا بگذاريد چرخ را با نمونه محلي پيپ نصب كنيم تا اطمينان حاصل شود كه بسته هاي ما حتي در صورت وجود بايگاني چرخ هاي چرخي نصب نمي شوند:
توجه داشته باشيد
صرفنظر از اينكه از كدام نسخه Python استفاده مي كنيد ، هنگامي كه محيط مجازي فعال مي شود ، بايد از دستور pip استفاده كنيد (نه pip3).
بعد ، اجازه دهيد Flask و Gunicorn را نصب كنيم:
ايجاد يك برنامه نمونه
اكنون كه Flask را در دسترس داريد ، مي توانيد يك برنامه ساده ايجاد كنيد. فلاسك يك ميكرو فريم ورك است. اين شامل بسياري از ابزارهايي نيست كه ممكن است چهارچوبهاي كامل تري داشته باشند ، و عمدتاً به عنوان ماژول وجود دارد كه مي توانيد براي شروع برنامه هاي وب به شما كمك كنند تا بتوانيد به پروژه هاي خود وارد شويد.
در حالي كه ممكن است برنامه شما پيچيده تر باشد ، ما برنامه Flask خود را در يك پرونده واحد با نام myproject.py ايجاد خواهيم كرد:
كد برنامه در اين پرونده زندگي مي كند. اين فلاسك را وارد مي كند و يك شيء فلاسك را فوراً مي كند. شما مي توانيد از اين كار براي تعريف كاركردهايي استفاده كنيد كه بايد هنگام درخواست يك مسير خاص انجام شود:
اين اساساً مشخص مي كند كه هنگام دستيابي به حوزه root ، چه محتوايي ارائه شود. پس از اتمام پرونده را ذخيره و بسته كنيد.
اگر راهنماي اوليه تنظيم سرور را دنبال كرديد ، بايد فايروال UFW را فعال كنيد. براي تست برنامه ، بايد دسترسي به درگاه 5000 را داشته باشيد:
اكنون مي توانيد برنامه Flask خود را با تايپ كردن تست كنيد:
خروجي مانند موارد زير را مشاهده خواهيد كرد ، از جمله يك هشدار مفيد كه به شما يادآوري مي كند از اين تنظيم سرور در توليد استفاده نكنيد:
به آدرس IP سرور خود مراجعه كنيد و به دنبال آن: 5000 در مرورگر وب خود:
http: // your_server_ip: 5000
شما بايد چيزي شبيه به اين را ببينيد:
پس از اتمام ، CTRL-C را در پنجره ترمينال خود بزنيد تا سرور توسعه Flask متوقف شود.
ايجاد نقطه ورود WSGI
در مرحله بعدي ، بگذاريد فايلي را ايجاد كنيم كه به عنوان نقطه ورود برنامه ما باشد. اين به سرور Gunicorn ما مي گويد كه چگونه با برنامه ارتباط برقرار كنيد.
بياييد با پرونده wsgi.py تماس بگيريم:
در اين پرونده ، اجازه دهيد نمونه Flask را از برنامه ما وارد كنيم و سپس آن را اجرا كنيم:
پس از اتمام پرونده را ذخيره و بسته كنيد.
مرحله 4 – پيكربندي Gunicorn
برنامه شما اكنون با يك نقطه ورود تأسيس نوشته شده است. ما ميتوانيم
اكنون به پيكربندي Gunicorn برويد.
قبل از حركت ، بايد بررسي كنيم كه Gunicorn مي تواند به درستي برنامه را ارائه دهد.
ما مي توانيم اين كار را با ساده تر كردن نام ورودي خود انجام دهيم. اين به عنوان نام ماژول ساخته شده است (منهاي پسوند .py) ، به علاوه نام تماس گيرنده درون برنامه. در مورد ما ، اين wsgi است: برنامه.
ما همچنين مي خواهيم رابط و پورت را به هم متصل كنيم تا برنامه در يك رابط در دسترس عمومي شروع شود:
شما بايد خروجي مانند موارد زير را ببينيد:
آدرس IP سرور خود را با بازديد كنيد: 5000 بار ديگر در پايان در مرورگر وب خود اضافه كنيد:
http: // your_server_ip: 5000
بايد خروجي برنامه خود را مشاهده كنيد:
وقتي تأييد كرد كه عملكرد مناسب دارد ، CTRL-C را در پنجره ترمينال خود فشار دهيد.
ما اكنون با محيط مجازي خود انجام داده ايم ، بنابراين مي توانيم آن را غيرفعال كنيم:
هر دستور پايتون اكنون دوباره از محيط پايتون سيستم استفاده خواهد كرد.
در مرحله بعدي ، بياييد پرونده واحد خدمات سيستم شده را ايجاد كنيم. ايجاد يك فايل واحد سيستمي به سيستم اوليه Ubuntu اجازه مي دهد تا هر زمان كه سرور بوت شود ، Gunicorn را به طور خودكار شروع كرده و به برنامه Flask سرويس دهد.
براي شروع يك فايل واحد كه در قسمت service استفاده مي شود در فهرست / etc / systemd / system ايجاد كنيد:
در داخل ، ما با بخش [Unit] شروع خواهيم كرد ، كه براي مشخص كردن ابرداده و وابستگي ها استفاده مي شود. بياييد شرح خدمات خود را در اينجا قرار دهيم و به سيستم init بگوييم كه فقط پس از رسيدن به هدف شبكه ، اين كار را شروع مي كند:
بعد ، اجازه دهيد بخش [خدمات] را باز كنيم. با اين كار كاربر و گروهي را كه مي خواهيم تحت روند كار قرار بگيرند مشخص مي كند. بياييد به طور منظم مالكيت حساب كاربري ما را از اين فرآيند بدست آوريم زيرا اين پرونده در اختيار همه پرونده هاي مربوطه است بياييد مالكيت گروه را به گروه داده هاي www نيز واگذار كنيم تا Nginx بتواند به راحتي با فرآيندهاي Gunicorn ارتباط برقرار كند. به ياد داشته باشيد كه نام كاربري خود را در اينجا با نام كاربري خود جايگزين كنيد:
در مرحله بعدي ، بگذاريد فهرست كار را مشخص كنيم و متغير محيطي PATH را تنظيم كنيم تا سيستم اوليه بداند كه اجرايي اين فرآيند در محيط مجازي ما قرار دارند. بياييد فرمان شروع سرويس را نيز مشخص كنيم. اين دستور به شرح زير است:
• 3 فرآيند كارگر را شروع كنيد (اگرچه لازم است اين كار را در صورت لزوم تنظيم كنيد)
• به يك پرونده سوكت يونيكس ، myproject.sock ، در فهرست پروژه ما بسازيد و به آن وصل شويد. ما يك مقدار umask 007 تنظيم مي كنيم تا پرونده سوكت ايجاد شود و دسترسي به مالك و گروه را در حاليكه دسترسي ديگر را محدود مي كند ، ايجاد كند.
• نام پرونده ورود WSGI را به همراه پايتون قابل تماس در آن پرونده مشخص كنيد (wsgi: app)
Systemd مستلزم اين است كه ما مسير كاملي را به اجراي Gunicorn ، كه در محيط مجازي ما نصب شده است ، بدهيم.
به ياد داشته باشيد كه نام كاربري و مسير پروژه را با اطلاعات شخصي خود جايگزين كنيد:
در آخر ، بياييد يك بخش [نصب] اضافه كنيم. اگر سيستم را فعال كنيم كه در بوت شروع شود ، اين سيستم را به چه سيستم وصل مي كند. ما مي خواهيم با شروع به كار سيستم معمولي چند كاربره ، اين سرويس شروع شود:
با اين كار ، فايل سرويس سيستمهاي ما كامل است. اكنون آن را ذخيره كنيد و ببنديد.
اكنون مي توانيم سرويس Gunicorn را كه ايجاد كرديم شروع كنيم و آن را فعال كنيم تا در بوت شروع شود:
بگذاريد وضعيت را بررسي كنيم:
شما بايد خروجي مانند اين را مشاهده كنيد:
در صورت مشاهده هر گونه خطا ، حتما آنها را قبل از ادامه آموزش برطرف كنيد.
مرحله 5 – پيكربندي Nginx در درخواستهاي پروكسي
اكنون سرور برنامه Gunicorn ما بايد فعال و فعال باشد و منتظر درخواست هاي موجود در پرونده سوكت در دايركتوري پروژه باشد. اكنون اجازه دهيد Nginx را پيكربندي كنيم تا با انجام برخي اضافات كوچك در پرونده پيكربندي خود ، درخواست هاي وب را به آن سوكت منتقل كنيم.
با ايجاد يك فايل پيكربندي بلوك جديد سرور در فهرست موجود سايتهاي Nginx شروع كنيد. بياييد با اين پروژه تماس بگيريم تا با بقيه راهنما مطابقت داشته باشد:
يك بلوك سرور باز كنيد و به Nginx بگوييد كه به درگاه پيش فرض 80 گوش كند. بياييد به او نيز بگوييم كه از اين بلوك براي درخواست هاي نام دامنه سرور ما استفاده كند:
بعد ، بياييد يك بلوك موقعيت مكاني اضافه كنيم كه مطابق با هر درخواست باشد. در اين بلوك ، پرونده غير مجاز مي باشد_params را درج خواهيم كرد كه پارامترهاي عمومي پروكسي را كه بايد تنظيم شوند را مشخص مي كند. سپس ما درخواست ها را به سوكت تعريف شده با استفاده از بخشنامه غير مجاز مي باشد_pass منتقل خواهيم كرد:
پس از اتمام پرونده را ذخيره و بسته كنيد.
براي فعال كردن پيكربندي بلوك سرور Nginx كه اخيراً ايجاد كرده ايد ، پرونده را به فهرست فعال شده سايتها پيوند دهيد:
با استفاده از پرونده موجود در آن فهرست ، مي توانيد خطاهاي نحوي را آزمايش كنيد:
اگر اين بدون نشان دادن مشكلي برمي گردد ، فرايند Nginx را دوباره شروع كنيد تا پيكربندي جديد را بخوانيد:
در آخر ، اجازه دهيد دوباره ديوار آتش را تنظيم كنيم. ما ديگر نيازي به دسترسي از طريق بندر 5000 نداريم ، بنابراين مي توانيم اين قانون را حذف كنيم. سپس مي توانيم دسترسي كامل به سرور Nginx داشته باشيم:
اكنون بايد بتوانيد در مرورگر وب خود به نام دامنه سرور خود برويد:
http: // your_domain
بايد خروجي برنامه خود را مشاهده كنيد:
اگر با خطايي مواجه شديد ، موارد زير را بررسي كنيد:
• sudo كمتر /var/log/nginx/error.log: سياهههاي مربوط به خطاي Nginx را بررسي مي كند.
• sudo كمتر /var/log/nginx/access.log: سياهههاي مربوط به دسترسي Nginx را بررسي مي كند.
• sudo journalctl -u nginx: گزارش هاي مربوط به فرآيند Nginx را بررسي مي كند.
• sudo journalctl -u myproject: بررسي هاي مربوط به Gunicorn برنامه Flask شما را بررسي مي كند.
مرحله ششم – امنيت برنامه
براي اطمينان از ايمن ماندن ترافيك به سرور شما ، اجازه دهيد يك گواهي SSL براي دامنه شما بدست آوريم. روش هاي مختلفي براي اين كار وجود دارد ، از جمله دريافت گواهينامه رايگان از Let Encrypt ، توليد يك گواهي خود امضا شده يا خريد يكي از ارائه دهنده ديگر و پيكربندي Nginx براي استفاده از آن با دنبال كردن مراحل 2 تا 6 نحوه ايجاد يك خود امضا. گواهي SSL براي Nginx در اوبونتو 20.04. ما به خاطر مصلحت ، با گزينه ي اول خواهيم رفت.
بسته Nginx Certbot را با كاربردي نصب كنيد:
Certbot روشهاي مختلفي براي به دست آوردن گواهينامه هاي SSL از طريق افزونه ها ارائه مي دهد. افزونه Nginx براي تنظيم مجدد Nginx و بارگيري مجدد پيكربندي در صورت لزوم ، مراقبت خواهد كرد. براي استفاده از اين افزونه ، موارد زير را تايپ كنيد:
اين كار با افزونه –nginx با استفاده از -d براي مشخص كردن نام هايي كه مي خواهيم براي آنها اعتبار داشته باشد ، تأييد مي شود.
اگر اين اولين بار است كه در حال اجرا كردن گواهي نامه است ، از شما خواسته مي شود كه آدرس ايميل را وارد كنيد و با شرايط خدمات موافقت كنيد. بعد از انجام اين كار ، certbot با سرور Letry Encrypt ارتباط برقرار مي كند ، سپس براي تأييد اينكه دامنه مورد نظر خود را كنترل مي كنيد ، يك چالش را اجرا كنيد.
اگر اين موفقيت آميز باشد ، certbot از شما مي خواهد كه چگونه مي خواهيد تنظيمات HTTPS خود را پيكربندي كنيد:
انتخاب خود را انتخاب كنيد و سپس وارد ENTER شويد. پيكربندي به روز خواهد شد ، و Nginx بارگيري مي كند تا تنظيمات جديد را انتخاب كند. certbot با پيغامي همراه خواهد شد كه به شما مي گويد روند موفقيت آميز بود و گواهي نامه هاي شما در كجا ذخيره شده است:
اگر دستورالعمل نصب Nginx را در پيش شرط ها دنبال كرديد ، ديگر نيازي به كمك هزينه اضافي مشخصات HTTP نخواهيد داشت:
براي تأييد پيكربندي ، با استفاده از https: // دوباره به دامنه خود برويد.
https: // your_domain
شما بايد يك بار ديگر خروجي برنامه خود را همراه با نشانگر امنيتي مرورگر خود مشاهده كنيد ، كه بايد نشانگر امنيت سايت باشد.
نتيجه
در اين راهنما ، يك برنامه ساده Flask را در يك محيط مجازي Python ايجاد و امن كرده ايد. شما يك نقطه ورود WSGI ايجاد كرده ايد تا هر سرور برنامه WSGI قادر به استفاده از آن باشد و سپس سرور برنامه Gunicorn را براي ارائه اين عملكرد پيكربندي كنيد. پس از آن ، شما يك فايل خدمات سيستمي ايجاد كرديد تا سرور برنامه به صورت خودكار راه اندازي شود. شما همچنين يك بلوك سرور Nginx ايجاد كرده ايد كه ترافيك سرويس دهنده وب را به سرور برنامه منتقل مي كند ، درخواست هاي خارجي را منتقل مي كند و با رمزگذاري Let’s Encrypt ، ترافيك را به سرور خود ايمن مي كنيد.
فلاسك يك چارچوب بسيار ساده اما بسيار انعطاف پذير به معناي ارائه كاربردهاي شما با قابليت هاي بدون محدوديت در مورد ساختار و طراحي است. مي توانيد از خدمات پشته اي كه در اين راهنما تشريح شده است استفاده كنيد تا بتوانيد كاربردهاي فلاسكي را كه طراحي كرده ايد ارائه دهيد.
خريد vps – خريد سرور مجازي – خريد سرور – سرور هلند – فروش vps – سرور مجازي آمريكا – خريدvps – سرور مجازي هلند – فروش سرور مجازي – سرور آمريكا – vps – سرور مجازي انگليس – سرور مجازي آلمان – سرور مجازي كانادا – خريد vps آمريكا – خريد وي پي اس – سرور – خريد سرور مجازي هلند – vps خريد – سرور مجازي فرانسه – سرور مجازي هلند – خريد vps آمريكا – خريد سرور مجازي ارزان هلند – vps – خريد vps هلند – خريد سرور مجازي آمريكا – خريد vps فرانسه – تست vps – سرور مجازي تست – سرور مجازي ويندوز – ارزانترين vps – خريد وي پي اس – vps ارزان –
برچسبها:Flask, Gunicorn, pip, برنامه Python
برچسب: ،