Uploaded by kjfjksrfjk

NGINX va NGINX Plus

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 proksiserverdir. NGINX HTTP ulanishlari va trafikni boshqarish uchun barcha asosiy vebtezlashtirish 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 proksi-serverlari 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.

indeks

modullar |

keyingi |

oldingi |

uWSGI 2.0 hujjatlari »

Django va veb-serveringizni uWSGI va nginx bilan sozlash
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 proksi-serveridir.
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'ridan-to'g'ri Django ilovalari
bilan gaplasha olmaydi ; ilovani ishga tushiradigan, veb-mijozlarning (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.Ydevbu 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 veb-server 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_params 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;
amend as required
}
location /static {
# your Django project's media files -
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/sitesenabled/
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 www-data
--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
hujjatlari va misollariga qarang .
bir
necha
usullarini
qo'llab-quvvatlaydi. uWSGI
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