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