Uploaded by kjfjksrfjk

nginx and gunicorn with django

advertisement
NGINX va NGINX Plus-dan uWSGI va Django bilan amaliy
shlyuz sifatida foydalanish
NGINX yuqori unumdor, kengaytiriladigan, xavfsiz va ishonchli veb-server va
teskari proksi-serverdir. NGINX HTTP ulanishlari va trafikni boshqarish uchun
barcha asosiy veb-tezlashtirish usullarini taqdim etadi. Ko'p yillar
davomida yuklarni muvozanatlash , SSL-ni tugatish , ulanish va
so'rovlarni tartibga solish , statik kontentni tushirish va kontentni keshlash kabi
NGINX imkoniyatlari NGINX foydalanuvchilariga ishonchli va tezkor vebsaytlarni tez va samarali yaratishga yordam berdi.
NGINX shuningdek, trafikni foydalanuvchilardan ilovalarga o‘tkazish uchun bir
qator maxsus o‘rnatilgan interfeyslarni taklif qiluvchi xavfsiz ilovalar shlyuzi
sifatida ham harakat qilishi mumkin. Shu nuqtai nazardan, NGINX proksiserverlari HTTP va HTTPS-ni nafaqat HTTP yoqilgan ilovalar konteyneriga
o'tkazishi mumkin, balki FastCGI , Memcached kabi modullarda amalga
oshirilgan optimallashtirilgan ilova-shlyuz interfeyslari orqali mashhur engil
dastur serverlari va veb-ramkalar bilan bevosita gaplashishi mumkin.
, scgi va uwsgi . Ko'p ishlatiladigan dastur konteynerlarida ba'zi marshrutlash
imkoniyatlariga ega tashqi HTTP interfeyslari o'rnatilgan, ammo NGINX dan
dastur shlyuzi sifatida foydalanishning muhim sabablaridan biri shundaki, u
HTTP ulanishini boshqarish, yuk balansi, kontentni keshlash va trafik uchun
yaxlit yechimni taqdim etadi. xavfsizlik. Kengaytirish va ishlashni yaxshilash
uchun dasturning orqa qismi NGINX orqasida xavfsiz tarzda joylashadi.
Bundan tashqari, yuqori darajada mavjud ilovalarni yaratish uchun NGINX
orqasida ilova misollarini klasterlash juda oson.
Django-Nginx-Gunicorn Stekini Tushunish:
•
•
Django - bu tezkor rivojlanish va toza, pragmatik dizaynni
rag'batlantiradigan yuqori darajadagi Python veb-ramka.
•
Nginx yuqori samarali HTTP serveri va teskari proksi-server bo'lib, u
barqarorligi, boy funksiyalar to'plami va kam resurslar iste'moli bilan
mashhur.
•
Gunicorn ('Green Unicorn') bu UNIX uchun Python WSGI HTTP
serveri bo'lib, u Ruby's Unicorn loyihasidan ko'chirilgan pre-fork ishchi
modelidir.
Django va veb-serveringizni uWSGI va nginx yordamida sozlash
Ushbu qo'llanma ishlab chiqarish veb-serverini o'rnatmoqchi bo'lgan Django
foydalanuvchisiga qaratilgan. Bu sizni Django-ni uWSGI va nginx bilan yaxshi
ishlashi uchun sozlash uchun zarur bo'lgan bosqichlardan o'tadi. U veb-ilova va
server dasturiy ta'minotining to'liq to'plamini ta'minlab, barcha uch komponentni
qamrab oladi.
Django tezkor rivojlanish va toza, pragmatik dizaynni rag'batlantiradigan yuqori
darajadagi Python veb-ramkasidir.
nginx ( motor-x deb talaffuz qilinadi ) bu bepul, ochiq manbali, yuqori samarali
HTTP serveri va teskari proksi-server, shuningdek, IMAP/POP3 proksiserveridir.
Ushbu qo'llanma haqida ba'zi eslatmalar
Eslatma
Bu o'quv qo'llanma . U ma'lumotnomani taqdim etish uchun mo'ljallanmagan,
qo'llash mavzusiga to'liq ma'lumot bermang.
nginx va uWSGI Django-ni joylashtirish uchun yaxshi tanlovdir, lekin ular
yagona yoki "rasmiy" emas. Ikkalasiga ham ajoyib alternativalar mavjud va siz
ularni tekshirishga taklif qilasiz.
Django - ni bu yerda joylashtirishimiz yaxshi yo'l, lekin bu yagona yo'l emas ;
ba'zi maqsadlar uchun, ehtimol, hatto eng yaxshi yo'l emas.
Biroq, bu ishonchli va oson yo'l va bu erda keltirilgan material sizni Django-ni
joylashtirish uchun foydalanadigan har qanday dastur bilan tanishishingiz kerak
bo'lgan tushunchalar va protseduralar bilan tanishtiradi. Sizga ishlaydigan
sozlashni taqdim etish va u erga borish uchun kerak bo'lgan qadamlarni takrorlash
orqali u sizga bunga erishishning boshqa usullarini o'rganish uchun asos bo'ladi.
Eslatma
Ushbu qo'llanmada siz foydalanayotgan tizim haqida ba'zi taxminlar mavjud.
Siz Unix-ga o'xshash tizimdan foydalanasiz va unda qobiliyatga o'xshash paket
menejeri mavjud deb taxmin qilinadi. Ammo, agar sizga “Mac OS X da qobiliyat
ekvivalenti nima?” kabi savollarni berishingiz kerak bo'lsa, bunday yordamni
juda oson topishingiz mumkin.
Ushbu qo'llanma yangi loyihangizda avtomatik ravishda wsgi modulini
yaratadigan Django 1.4 yoki undan keyingi versiyalarini nazarda tutsa-da,
ko'rsatmalar oldingi versiyalar bilan ishlaydi. Siz o'sha Django wsgi modulini
o'zingiz olishingiz kerak bo'ladi va siz Django loyihasi katalog tuzilishi biroz
boshqacha ekanligini bilib olishingiz mumkin.
Kontseptsiya
Veb-server tashqi dunyoga qaraydi. U to'g'ridan-to'g'ri fayl tizimidan fayllarga
(HTML, tasvirlar, CSS va boshqalar) xizmat qilishi mumkin. Biroq, u to'g'ridanto'g'ri Django ilovalari bilan gaplasha olmaydi ; ilovani ishga tushiradigan, vebmijozlarning (masalan, brauzerlar) so'rovlarini ta'minlaydigan va javoblarni
qaytaradigan narsa kerak.
Veb-server shlyuzi interfeysi - WSGI - bu vazifani bajaradi. WSGI Python
standartidir.
uWSGI - bu WSGI ilovasi. Ushbu qo'llanmada biz uWSGI-ni shunday
o'rnatamizki, u Unix soketini yaratadi va uwsgi protokoli orqali veb-serverga
javob beradi. Oxirida bizning to'liq komponentlar to'plami quyidagicha ko'rinadi:
the web client <-> the web server <-> the socket <-> uwsgi <-> Django
uWSGI ni sozlashni boshlashdan oldin
virtualenv
Biz o'rnatishimiz kerak bo'lgan dasturiy ta'minot uchun virtualenvda
ekanligingizga ishonch hosil qiling (tizim bo'ylab uwsgi-ni qanday o'rnatishni
keyinroq tasvirlab beramiz):
virtualenv uwsgi-tutorial
cd uwsgi-tutorial
source bin/activate
Django
Django-ni virtualenv-ga o'rnating, yangi loyiha yarating va cdloyihaga:
pip install Django
django-admin.py startproject mysite
cd mysite
Domen va port haqida
Ushbu qo'llanmada biz sizning domeningizga qo'ng'iroq qilamiz example.com.
O'zingizning FQDN yoki IP manzilingizni almashtiring.
Butun vaqt davomida biz veb-serverni nashr qilish uchun 8000 portidan
foydalanamiz, xuddi Django server serveri sukut bo'yicha. Albatta, siz xohlagan
portdan foydalanishingiz mumkin, lekin men buni tanladim, shuning uchun u
veb-server allaqachon qilayotgan hech narsaga zid kelmaydi.
Asosiy uWSGI o'rnatilishi va konfiguratsiyasi
uWSGI-ni virtualenv-ga o'rnating
pip install uwsgi
Albatta, uWSGI-ni o'rnatishning boshqa usullari mavjud, ammo bu har qanday
kabi yaxshi. Python ishlab chiqish paketlarini o'rnatishingiz kerakligini
unutmang. Debian yoki Ubuntu kabi Debian-dan olingan tizimlar uchun siz
o'rnatishingiz kerak bo'lgan narsa - pythonX.Y-devbu XY sizning Python
versiyangiz.
Asosiy test
deb nomlangan fayl yarating test.py:
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
Eslatma
Python 3 talab qilishini hisobga oling bytes().
uWSGI-ni ishga tushiring:
uwsgi --http :8000 --wsgi-file test.py
Variantlar quyidagilarni anglatadi:
•
http :8000: http protokolidan foydalaning, port 8000
•
wsgi-file test.py: belgilangan faylni yuklang, test.py
Bu to'g'ridan-to'g'ri 8000 portidagi brauzerga "salom dunyo" xabarini yuborishi
kerak. Bu erga tashrif buyuring:
http://example.com:8000
tekshirmoq. Agar shunday bo'lsa, bu quyidagi komponentlar to'plamining
ishlashini anglatadi:
the web client <-> uWSGI <-> Python
Django loyihangizni sinab ko'ring
Endi biz uWSGI ni xuddi shunday qilishini, lekin test.pymodul o'rniga Django
saytini ishga tushirishni xohlaymiz.
Agar buni hali qilmagan bo'lsangiz, loyihangiz mysitehaqiqatda ishlayotganiga
ishonch hosil qiling:
python manage.py runserver 0.0.0.0:8000
Va agar bu ishlayotgan bo'lsa, uni uWSGI yordamida ishga tushiring:
uwsgi --http :8000 --module mysite.wsgi
•
module mysite.wsgi: belgilangan wsgi modulini yuklang
Brauzeringizni serverga qarating; Agar sayt paydo bo'lsa, demak uWSGI sizning
virtualenvingizdan Django ilovangizga xizmat qila oladi va bu stek to'g'ri
ishlaydi:
the web client <-> uWSGI <-> Django
Endi bizda odatda brauzer to'g'ridan-to'g'ri uWSGI bilan gaplashmaydi. Bu vebserver uchun ish bo'lib, u o'zaro yordam vazifasini bajaradi.
Asosiy nginx
nginx ni o'rnating
sudo apt-get install nginx
sudo /etc/init.d/nginx start # start nginx
Va endi nginx xizmat ko'rsatayotganini 80-portdagi veb-brauzerga tashrif buyurib
tekshiring - siz nginx-dan xabar olishingiz kerak: "nginx-ga xush kelibsiz!". Bu
shuni anglatadiki, to'liq stekning ushbu komponentlari birgalikda ishlaydi:
the web client <-> the web server
Agar 80-portda boshqa narsa allaqachon xizmat qilayotgan bo'lsa va siz u erda
nginx-dan foydalanmoqchi bo'lsangiz, nginx-ni boshqa portda xizmat qilish
uchun qayta sozlashingiz kerak bo'ladi. Ushbu qo'llanma uchun biz 8000 portidan
foydalanamiz.
Saytingiz uchun nginx sozlang
Sizga
uWSGI
tarqatish
katalogida
yoki https://github.com/nginx/nginx/blob/master/conf/uwsgi_paramsuwsgi_para
ms manzilida mavjud bo'lgan fayl kerak bo'ladi.nginx
Uni loyiha katalogingizga nusxalang. Birozdan keyin biz nginx-ga unga murojaat
qilishni aytamiz.
Endi /etc/nginx/sites-available/ katalogida mysite_nginx.conf nomli fayl yarating
va uni ichiga qo'ying:
# mysite_nginx.conf
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen
8000;
# the domain name it will serve for
server_name example.com; # substitute your machine's IP address or FQDN
charset
utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /path/to/your/mysite/media; # your Django project's media files amend as required
}
location /static {
alias /path/to/your/mysite/static; # your Django project's static files amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include
/path/to/your/mysite/uwsgi_params; # the uwsgi_params file you
installed
}
}
Ushbu conf fayli nginx-ga fayl tizimidagi media va statik fayllarga xizmat
ko'rsatishni, shuningdek, Django aralashuvini talab qiladigan so'rovlarni
bajarishni aytadi. Katta o'rnatish uchun bitta serverga statik/media fayllarni,
boshqasiga esa Django ilovalarini boshqarishga ruxsat berish yaxshi amaliyot
hisoblanadi, ammo hozircha bu juda yaxshi bo'ladi.
Nginx uni ko'rishi uchun /etc/nginx/sites-enabled dan ushbu faylga simli havola:
sudo ln -s /etc/nginx/sites-available/mysite_nginx.conf /etc/nginx/sites-enabled/
Statik fayllarni joylashtirish
Nginx-ni ishga tushirishdan oldin barcha Django statik fayllarini statik papkada
to'plashingiz kerak. Avvalo, mysite/settings.py-ni tahrirlashingiz kerak:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
va keyin yugur
python manage.py collectstatic
Asosiy nginx testi
Nginx-ni qayta ishga tushiring:
sudo /etc/init.d/nginx restart
Media fayllar toʻgʻri xizmat koʻrsatilayotganligini tekshirish uchun media.pngga
chaqirilgan
rasmni
qoʻshing ,
soʻng http://example.com:8000/media/media.png saytiga tashrif buyuring - agar
bu
ishlayotgan
boʻlsa,
hech
boʻlmaganda
nginx
fayllarga
xizmat
koʻrsatayotganini
bilib
olasiz.
to'g'ri./path/to/your/project/project/media directory
Bu nafaqat nginx-ni qayta ishga tushirishga, balki uni to'xtatishga va keyin uni
qayta ishga tushirishga arziydi, bu sizga muammo borligini va qaerdaligini
bildiradi.
nginx va uWSGI va test.py
Keling, “salom dunyo” ilovasi bilan gaplashish uchun nginx-ni olaylik test.py.
uwsgi --socket :8001 --wsgi-file test.py
Bu avvalgidek deyarli bir xil, faqat bu safar variantlardan biri boshqacha:
•
socket :8001: uwsgi protokolidan foydalaning, port 8001
nginx shu portdagi uWSGI bilan va 8000 portdagi tashqi dunyo bilan aloqa qilish
uchun sozlangan. Tashrif buyuring:
http://example.com:8000/
tekshirmoq. Va bu bizning to'plamimiz:
the web client <-> the web server <-> the socket <-> uWSGI <-> Python
Shu bilan birga, siz http://example.com:8001 manzilida uwsgi chiqishini ko'rib
chiqishga urinib ko'rishingiz mumkin - lekin ehtimol, u ishlamaydi, chunki
brauzeringiz uWSGI emas, http tilida gapiradi, lekin uWSGI dan chiqishni
quyidagi sahifada ko'rishingiz kerak. sizning terminalingiz.
Portlar o'rniga Unix soketlaridan foydalanish
Hozirgacha biz TCP port soketidan foydalanganmiz, chunki bu oddiyroq, lekin
aslida portlardan ko'ra Unix rozetkalaridan foydalangan ma'qul - u erda kamroq
yuk.
Tahrirlash mysite_nginx.conf, mos keladigan qilib o'zgartirish:
server unix:///path/to/your/mysite/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
va nginx-ni qayta ishga tushiring.
uWSGI ni qayta ishga tushiring:
uwsgi --socket mysite.sock --wsgi-file test.py
Bu safar socketvariant uWSGI ga qaysi fayldan foydalanishni aytadi.
Brauzerda http://example.com:8000/ ni sinab ko'ring .
Agar bu ishlamasa
Nginx xato jurnalini tekshiring (/var/log/nginx/error.log). Agar siz shunga
o'xshash narsani ko'rsangiz:
connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)
keyin, ehtimol, nginx-dan foydalanishga ruxsat berish uchun rozetkadagi
ruxsatlarni boshqarishingiz kerak.
Sinab ko'ring:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very
permissive)
yoki:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more
sensible)
Shuningdek, nginx rozetkangizga to'g'ri o'qish va yozish uchun foydalanuvchini
nginx guruhiga (ehtimol www-data) yoki aksincha qo'shishingiz kerak bo'lishi
mumkin.
Nginx jurnalining chiqishini terminal oynasida ishlayotgan holda saqlashga
arziydi, shuning uchun muammolarni bartaraf etishda unga osongina murojaat
qilishingiz mumkin.
Django ilovasini uwsgi va nginx bilan ishga tushirish
Keling, Django ilovamizni ishga tushiramiz:
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664
Endi uWSGI va nginx nafaqat "Salom dunyo" moduliga, balki Django
loyihangizga ham xizmat qilishi kerak.
uWSGI .ini fayli bilan ishlashga sozlanmoqda
Biz uWSGI bilan ishlatgan variantlarni faylga qo'yishimiz va keyin uWSGI dan
ushbu fayl bilan ishlashni so'rashimiz mumkin. Bu konfiguratsiyalarni
boshqarishni osonlashtiradi.
deb nomlangan fayl yarating `mysite_uwsgi.ini`:
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir
= /path/to/your/project
# Django's wsgi file
module
= project.wsgi
# the virtualenv (full path)
home
= /path/to/virtualenv
# process-related settings
# master
master
= true
# maximum number of worker processes
processes
= 10
# the socket (use the full path to be safe
socket
= /path/to/your/project/mysite.sock
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum
= true
Va bu fayl yordamida uwsgi-ni ishga tushiring:
uwsgi --ini mysite_uwsgi.ini # the --ini option is used to specify a file
Yana bir bor, Django sayti kutilganidek ishlashini tekshiring.
UWSGI ni butun tizim bo'ylab o'rnating
Hozircha uWSGI faqat bizning virtualenvda o'rnatilgan; tarqatish uchun biz uni
butun tizim bo'ylab o'rnatishimiz kerak.
Virtualenv-ni o'chirib qo'ying:
deactivate
va butun tizim bo'ylab uWSGI o'rnating:
sudo pip install uwsgi
# Or install LTS (long term support).
pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz
uWSGI wiki bir nechta o'rnatish tartiblarini tasvirlaydi . UWSGI-ni butun
tizimga o'rnatishdan oldin, qaysi versiyani tanlash va uni o'rnatishning eng mos
usulini ko'rib chiqishga arziydi.
UWSGI-ni avvalgidek ishga tushirishingiz mumkinligini yana bir bor tekshiring:
uwsgi --ini mysite_uwsgi.ini # the --ini option is used to specify a file
Imperator rejimi
uWSGI "imperator" rejimida ishlashi mumkin. Ushbu rejimda u uWSGI
konfiguratsiya fayllari katalogini kuzatib boradi va topilgan har biriga misollar
(“vassallar”) hosil qiladi.
Agar konfiguratsiya fayli o'zgartirilsa, imperator avtomatik ravishda vassalni
qayta ishga tushiradi.
# create a directory for the vassals
sudo mkdir -p /etc/uwsgi/vassals
# symlink from the default config directory to your config file
sudo ln -s /path/to/your/mysite/mysite_uwsgi.ini /etc/uwsgi/vassals/
# run the emperor
uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
Sudo bilan uWSGI-ni ishga tushirishingiz kerak bo'lishi mumkin:
sudo uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
Variantlar quyidagilarni anglatadi:
•
emperor: vassallarni qaerdan qidirish kerak (konfiguratsiya fayllari)
•
uid: jarayon boshlangandan keyin foydalanuvchi identifikatori
•
gid: jarayon boshlangandan keyin uning guruh identifikatori
Saytni tekshiring; u ishlayotgan bo'lishi kerak.
Tizim ishga tushganda uWSGI ni ishga tushiring
Oxirgi qadam, tizimni ishga tushirish vaqtida hammasini avtomatik ravishda
amalga oshirishdir.
Ko'pgina tizimlar uchun buni qilishning eng oson (eng yaxshi bo'lmasa) usuli
fayldan foydalanishdir rc.local.
Tahrirlash /etc/rc.localva qo'shish:
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid wwwdata --daemonize /var/log/uwsgi-emperor.log
"0 dan chiqish" qatoridan oldin.
Va shunday bo'lishi kerak!
Qo'shimcha konfiguratsiya
Bu sizni boshlash uchun o'quv qo'llanma ekanligini tushunish muhimdir
. Siz nginx va uWSGI hujjatlarini o'qib chiqishingiz va ishlab chiqarish muhitida
joylashtirishdan oldin mavjud variantlarni o'rganishingiz kerak .
Nginx ham, uWSGI ham konfiguratsiya va foydalanish bo'yicha bebaho
maslahatlar berishga qodir bo'lgan do'stona jamoalardan foyda ko'radi.
nginx
Nginx-ning umumiy konfiguratsiyasi ushbu qo'llanmaning doirasiga kirmaydi,
lekin siz uni ishlab chiqarish veb-sayti uchun 8000 emas, balki 80-portda
tinglashni xohlaysiz.
Bundan tashqari, Django bo'lmagan fayllarga xizmat ko'rsatish uchun alohida
nginx joylashuv blokini sozlashingiz kerak. Masalan, uWSGI orqali statik
fayllarga xizmat ko'rsatish samarasiz. Buning o'rniga, ularga to'g'ridan-to'g'ri
Nginx-dan xizmat qiling va uWSGI-ni butunlay chetlab o'ting.
uWSGI
uWSGI uni sozlashning bir necha usullarini qo'llab-quvvatlaydi. uWSGI
hujjatlari va misollariga qarang .
Ba'zi uWSGI variantlari ushbu qo'llanmada aytib o'tilgan; Ishlab chiqarishda
joylashtirish uchun qarashingiz kerak bo'lgan boshqalar (misol sozlamalari bilan
bu erda keltirilgan):
env = DJANGO_SETTINGS_MODULE=mysite.settings # set an environment
variable
safe-pidfile = /tmp/project-master.pid # create a pidfile
harakiri = 20 # respawn processes taking more than 20 seconds
limit-as = 128 # limit the project to 128 MB
max-requests = 5000 # respawn processes after serving 5000 requests
daemonize = /var/log/uwsgi/yourproject.log # background the process & log
Download