From 6f4f97a5185a35114cd084e367df96ef52068fc5 Mon Sep 17 00:00:00 2001 From: Manuchehr Usmonov Date: Fri, 18 Aug 2023 16:41:24 +0500 Subject: [PATCH] New blogposts --- .gitignore | 3 +- data/blog.json | 2 +- ...mysqlga-juniorcha-va-seniorcha-sorovlar.md | 129 ++++++++++++++++++ ...tekshirish-qanday-amalga-oshirilgan-edi.md | 127 +++++++++++++++++ 4 files changed, 259 insertions(+), 2 deletions(-) create mode 100644 posts/mysqlga-juniorcha-va-seniorcha-sorovlar.md create mode 100644 posts/nginxda-ichki-redireksiya-yoxud-katta-stream-servisda-havolalarni-tekshirish-qanday-amalga-oshirilgan-edi.md diff --git a/.gitignore b/.gitignore index 48692fa..c0ad247 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ yalc.lock .yalc .idea yarn-error.log -.env.local \ No newline at end of file +.env.local +package-lock.json diff --git a/data/blog.json b/data/blog.json index e9a34ca..fd26312 100644 --- a/data/blog.json +++ b/data/blog.json @@ -1 +1 @@ -[{"title":"MySQL va o‘lib borayotgan MariaDB","description":"Shaxiy kompyuterlar erasining boshlanish davrida, yaʼni 1979-yilda TcX kompaniyasi tomonidan maʼlumotlarni boshqarish...","slug":"mysql-va-olib-borayotgan-mariadb","date":"April 14, 2023","body":null},{"title":"Korrektor.uz uchun api va texnik hujjatlar","description":"Uzinfocom Open Source jamoasidan korrektor.uz foydalanuvchilari uchun bahorgi sovg'a.","slug":"korrektor-uz-api-docs","date":"March 9, 2023","body":null},{"title":"Avr uchun kodlarni optimizatsiya qilish","description":"Arduino board resurs tejamaydigan parazit dasturchilar uchun juda foydali qurilma hisoblanadi. Chunki ushbu kichik...","slug":"avr-uchun-kodlarni-optimizatsiya-qilish","date":"February 10, 2023","body":null},{"title":"C++(QT)'da fluent interface","description":"Obyektning bunday qobiliyati bilan ishlashni php, javascript, java dasturchilar juda yaxshi bilishadi. Asosan javascriptda...","slug":"cqtda-fluent-interface","date":"February 7, 2023","body":null},{"title":"Tashlandiq laboratoriyadagi tajribalar - yoxud Iphone siri","description":"Iphone qurilmasing tarixi va siz bilmagan Stiv Jobs","slug":"tashlandiq-laboratoriyadagi-tajribalar-yoxud-iphone-siri","date":"January 24, 2023","body":null},{"title":"Nokia - Ajdarning o'limi","description":"Tarixdagi eng kuchli kompaniyaning achinarli tarixi haqida","slug":"nokia-ajdarning-olimi","date":"January 21, 2023","body":null},{"title":"Virtual KVM (Qurilmalarni tarmoq orqali ulashamiz)","description":"Bir nechta kompyuterni birgina sichqoncha va klaviatura orqali boshqaramiz","slug":"virtual-kvm-qurilmalarni-tarmoq-orqali-ulashamiz","date":"January 15, 2023","body":null},{"title":"rm (remove) uchun qo'lbola alternativ","description":"Fayllarni o'chirish uchun qo'lbola kod yozamiz...","slug":"rm-remove-uchun-qolbola-alternativ","date":"January 10, 2023","body":null},{"title":"Linux swap bu nima?","description":"Linux swap haqida siz bilmagan ma'lumotlar","slug":"linux-swap-bu-nima","date":"January 6, 2023","body":null},{"title":"Php dasturlash tilida o'yin yaratish: 4-qism","description":"PHP dasturlar tilida otishma o'yinini ishlab chiqish...","slug":"php-dasturlash-tilida-oyin-yaratish-4-qism","date":"December 6, 2022","body":null},{"title":"Php dasturlash tilida o'yin yaratish: 3-qism","description":"PHP dasturlar tilida Snake Xenzia o'yinini ishlab chiqish...","slug":"php-dasturlash-tilida-oyin-yaratish-3-qism","date":"December 5, 2022","body":null},{"title":"Php dasturlash tilida o'yin yaratish: 2-qism","description":"Buyruqlar qatoriga mos keladigan o'yinlardan eng soddalaridan biri bu Tic Tac Toe bo'lsa kerak...","slug":"php-dasturlash-tilida-oyin-yaratish-2-qism","date":"December 4, 2022","body":null},{"title":"Php dasturlash tilida o'yin yaratish: 1-qism","description":"Yaqinda youtubeda eski kompyuterlar haqidagi hujjatli filmni ko'rayotganimda buyruq satri (cli) yordamida...","slug":"php-dasturlash-tilida-oyin-yaratish-1-qism","date":"December 3, 2022","body":null},{"title":"Telegram instant view nima va qanday ishlaydi?","description":"Instant view vazifa jihatdan kontentni foydalanuvchilarga ortiqcha harakatlarsiz tezkorlik bilan yetkazishni ta'minlaydi...","slug":"telegram-instant-view-nima-va-qanday-ishlaydi","date":"November 22, 2022","body":null},{"title":"Telegram chat botlar. Bu qanday ishlaydi?","description":"Chat botlar odamlarning texnologiya bilan o'zaro munosabatida inqilob qilmoqda. So'nggi yillarda ularning ishlab chi...","slug":"telegram-chat-botlar-bu-qanday-ishlaydi","date":"November 18, 2022","body":null},{"title":"Mantiqiy eshiklar","description":"Ko'pgina zamonaviy kompyuterlarda mantiqiy eshiklar rezistorlar, diodlar va boshqa elektr komponentlar bilan birlashtirilgan tranzistorlar yordamida qurilgan...","slug":"mantiqiy-eshiklar","date":"October 17, 2022","body":null},{"title":"Nol va birdan assemblergacha","description":"Maktabdagi informatika o'qituvchingiz sizga kompyuter 0 va 1 orqali ishlashini aytgani bilan lekin uni aslida qanday ishlashini tushuntirib bermagan bo'lsa kerak a?","slug":"nol-va-birdan-assemblergacha","date":"October 16, 2022","body":null},{"title":"Led ring uchun ikkinchi hayotni bag'shlash","description":"Yaqinda veb kamera yorug'ligini ta'minlash uchun do'kondan Led RING sotib olishga to'g'ri keldi. Boshida muammosiz ishla...","slug":"led-ring-uchun-ikkinchi-hayotni-bagshlash","date":"September 12, 2022","body":null},{"title":"WAFni yorib kirish ( kiberxavfsizlik )","description":"Axmoqlar uchun ishlab chiqilgan WAF tizimini chetlab o'tish. Saytlar xavfsizligini turli usullarda yorib kirish...","slug":"wafni-yorib-kirish-kiberxavfsizlik","date":"August 30, 2022","body":null},{"title":"Multilanguage (ko'ptilli dasturlar) bu qanday ishlaydi?","description":"Dasturiy ta'minot auditoriyasini oshirishning eng yaxshi usullaridan biri bu uning interfeysni ko'p tillar uchun moslay olish hisoblanadi...","slug":"multilanguage-koptilli-dasturlar-bu-qanday-ishlaydi","date":"August 25, 2022","body":null},{"title":"Raspberry PIni radioxuliganlarning orzusiga aylantiramiz","description":"RPI bizga ortiqcha elektron komponentlarsiz radio uzatgich yaratishni amalga oshirishga yordam beradi...","slug":"raspberry-pini-radioxuliganlarning-orzusiga-aylantiramiz","date":"August 6, 2022","body":null},{"title":"Bo'lajak dasturchilar uchun tavsiyalar","description":"Dasturlash tillari kundan kunga ko'payib rivojlanib boryapti. Lekin muammo yechimini bunda deb bilmaslik kerak. Dasturlash tillari bu shunchaki muammoni yechishga yordam beruvchi vositalar xolos.","slug":"bolajak-dasturchilar-uchun-tavsiyalar","date":"August 3, 2022","body":null},{"title":"Dasturchiga matematikadan ko'ra mantiq ko'proq kerakmi?","description":"Barcha matematik jarayonlar mantiqqa asoslanib ishlab chiqilgan bo'lsada, har ikkisi xilma-xil maqsadlarga ega bo'lgan turlicha vositalardir.","slug":"dasturchiga-matematikadan-kora-mantiq-koproq-kerakmi","date":"August 2, 2022","body":null},{"title":"Psevdo kod (palag'da algoritm) nima va u biz uchun nega kerak?","description":"Psevdo kod (palag'da algoritm) nima va u biz uchun nega kerak?","slug":"psevdokod","date":"June 27, 2022","body":null},{"title":"Operatsion tizim nima va u qanday ishlaydi?","description":"Shaxsiy kompyuterlarning operatsion tizimlari yaratilish tarixiga nazar solsak, sakkiz razryadli shaxsiy kompyuterlar...","slug":"operatsion_tizim_nima_va_u_qanday_ishlaydi","date":"June 25, 2022","body":null},{"title":"SVG Caching with ","description":"Smaller DOM size by reusing existing SVG icons","slug":"svg-caching-with-use","date":"June 25, 2020","og":"https://i.microlink.io/https%3A%2F%2Fcards.microlink.io%2F%3Fpreset%3Dpaco%26title%3DSVG%2520Caching%2520with%2520%253Cuse%253E%23","body":null}] \ No newline at end of file +[{"title":"Mysqlga juniorcha va seniorcha so'rovlar","description":"Ma'lumotlar bazasiga amalga oshiriladigan so'rovlarni optimizatsiya qilish uchun kichik misol...","slug":"mysqlga-juniorcha-va-seniorcha-sorovlar","date":"August 18, 2023","body":null},{"title":"Nginxda ichki redireksiya yoxud katta stream servisda havolalarni tekshirish qanday amalga oshirilgan edi?","description":"Odatda statik fayllarni uzatish uchun nginx server ko'targanda indeksatsiyadan himoyalash ancha muammoga aylanadi...","slug":"nginxda-ichki-redireksiya-yoxud-katta-stream-servisda-havolalarni-tekshirish-qanday-amalga-oshirilgan-edi","date":"July 27, 2023","body":null},{"title":"MySQL va o‘lib borayotgan MariaDB","description":"Shaxiy kompyuterlar erasining boshlanish davrida, yaʼni 1979-yilda TcX kompaniyasi tomonidan maʼlumotlarni boshqarish...","slug":"mysql-va-olib-borayotgan-mariadb","date":"April 14, 2023","body":null},{"title":"Korrektor.uz uchun api va texnik hujjatlar","description":"Uzinfocom Open Source jamoasidan korrektor.uz foydalanuvchilari uchun bahorgi sovg'a.","slug":"korrektor-uz-api-docs","date":"March 9, 2023","body":null},{"title":"Avr uchun kodlarni optimizatsiya qilish","description":"Arduino board resurs tejamaydigan parazit dasturchilar uchun juda foydali qurilma hisoblanadi. Chunki ushbu kichik...","slug":"avr-uchun-kodlarni-optimizatsiya-qilish","date":"February 10, 2023","body":null},{"title":"C++(QT)'da fluent interface","description":"Obyektning bunday qobiliyati bilan ishlashni php, javascript, java dasturchilar juda yaxshi bilishadi. Asosan javascriptda...","slug":"cqtda-fluent-interface","date":"February 7, 2023","body":null},{"title":"Tashlandiq laboratoriyadagi tajribalar - yoxud Iphone siri","description":"Iphone qurilmasing tarixi va siz bilmagan Stiv Jobs","slug":"tashlandiq-laboratoriyadagi-tajribalar-yoxud-iphone-siri","date":"January 24, 2023","body":null},{"title":"Nokia - Ajdarning o'limi","description":"Tarixdagi eng kuchli kompaniyaning achinarli tarixi haqida","slug":"nokia-ajdarning-olimi","date":"January 21, 2023","body":null},{"title":"Virtual KVM (Qurilmalarni tarmoq orqali ulashamiz)","description":"Bir nechta kompyuterni birgina sichqoncha va klaviatura orqali boshqaramiz","slug":"virtual-kvm-qurilmalarni-tarmoq-orqali-ulashamiz","date":"January 15, 2023","body":null},{"title":"rm (remove) uchun qo'lbola alternativ","description":"Fayllarni o'chirish uchun qo'lbola kod yozamiz...","slug":"rm-remove-uchun-qolbola-alternativ","date":"January 10, 2023","body":null},{"title":"Linux swap bu nima?","description":"Linux swap haqida siz bilmagan ma'lumotlar","slug":"linux-swap-bu-nima","date":"January 6, 2023","body":null},{"title":"Php dasturlash tilida o'yin yaratish: 4-qism","description":"PHP dasturlar tilida otishma o'yinini ishlab chiqish...","slug":"php-dasturlash-tilida-oyin-yaratish-4-qism","date":"December 6, 2022","body":null},{"title":"Php dasturlash tilida o'yin yaratish: 3-qism","description":"PHP dasturlar tilida Snake Xenzia o'yinini ishlab chiqish...","slug":"php-dasturlash-tilida-oyin-yaratish-3-qism","date":"December 5, 2022","body":null},{"title":"Php dasturlash tilida o'yin yaratish: 2-qism","description":"Buyruqlar qatoriga mos keladigan o'yinlardan eng soddalaridan biri bu Tic Tac Toe bo'lsa kerak...","slug":"php-dasturlash-tilida-oyin-yaratish-2-qism","date":"December 4, 2022","body":null},{"title":"Php dasturlash tilida o'yin yaratish: 1-qism","description":"Yaqinda youtubeda eski kompyuterlar haqidagi hujjatli filmni ko'rayotganimda buyruq satri (cli) yordamida...","slug":"php-dasturlash-tilida-oyin-yaratish-1-qism","date":"December 3, 2022","body":null},{"title":"Telegram instant view nima va qanday ishlaydi?","description":"Instant view vazifa jihatdan kontentni foydalanuvchilarga ortiqcha harakatlarsiz tezkorlik bilan yetkazishni ta'minlaydi...","slug":"telegram-instant-view-nima-va-qanday-ishlaydi","date":"November 22, 2022","body":null},{"title":"Telegram chat botlar. Bu qanday ishlaydi?","description":"Chat botlar odamlarning texnologiya bilan o'zaro munosabatida inqilob qilmoqda. So'nggi yillarda ularning ishlab chi...","slug":"telegram-chat-botlar-bu-qanday-ishlaydi","date":"November 18, 2022","body":null},{"title":"Mantiqiy eshiklar","description":"Ko'pgina zamonaviy kompyuterlarda mantiqiy eshiklar rezistorlar, diodlar va boshqa elektr komponentlar bilan birlashtirilgan tranzistorlar yordamida qurilgan...","slug":"mantiqiy-eshiklar","date":"October 17, 2022","body":null},{"title":"Nol va birdan assemblergacha","description":"Maktabdagi informatika o'qituvchingiz sizga kompyuter 0 va 1 orqali ishlashini aytgani bilan lekin uni aslida qanday ishlashini tushuntirib bermagan bo'lsa kerak a?","slug":"nol-va-birdan-assemblergacha","date":"October 16, 2022","body":null},{"title":"Led ring uchun ikkinchi hayotni bag'shlash","description":"Yaqinda veb kamera yorug'ligini ta'minlash uchun do'kondan Led RING sotib olishga to'g'ri keldi. Boshida muammosiz ishla...","slug":"led-ring-uchun-ikkinchi-hayotni-bagshlash","date":"September 12, 2022","body":null},{"title":"WAFni yorib kirish ( kiberxavfsizlik )","description":"Axmoqlar uchun ishlab chiqilgan WAF tizimini chetlab o'tish. Saytlar xavfsizligini turli usullarda yorib kirish...","slug":"wafni-yorib-kirish-kiberxavfsizlik","date":"August 30, 2022","body":null},{"title":"Multilanguage (ko'ptilli dasturlar) bu qanday ishlaydi?","description":"Dasturiy ta'minot auditoriyasini oshirishning eng yaxshi usullaridan biri bu uning interfeysni ko'p tillar uchun moslay olish hisoblanadi...","slug":"multilanguage-koptilli-dasturlar-bu-qanday-ishlaydi","date":"August 25, 2022","body":null},{"title":"Raspberry PIni radioxuliganlarning orzusiga aylantiramiz","description":"RPI bizga ortiqcha elektron komponentlarsiz radio uzatgich yaratishni amalga oshirishga yordam beradi...","slug":"raspberry-pini-radioxuliganlarning-orzusiga-aylantiramiz","date":"August 6, 2022","body":null},{"title":"Bo'lajak dasturchilar uchun tavsiyalar","description":"Dasturlash tillari kundan kunga ko'payib rivojlanib boryapti. Lekin muammo yechimini bunda deb bilmaslik kerak. Dasturlash tillari bu shunchaki muammoni yechishga yordam beruvchi vositalar xolos.","slug":"bolajak-dasturchilar-uchun-tavsiyalar","date":"August 3, 2022","body":null},{"title":"Dasturchiga matematikadan ko'ra mantiq ko'proq kerakmi?","description":"Barcha matematik jarayonlar mantiqqa asoslanib ishlab chiqilgan bo'lsada, har ikkisi xilma-xil maqsadlarga ega bo'lgan turlicha vositalardir.","slug":"dasturchiga-matematikadan-kora-mantiq-koproq-kerakmi","date":"August 2, 2022","body":null},{"title":"Psevdo kod (palag'da algoritm) nima va u biz uchun nega kerak?","description":"Psevdo kod (palag'da algoritm) nima va u biz uchun nega kerak?","slug":"psevdokod","date":"June 27, 2022","body":null},{"title":"Operatsion tizim nima va u qanday ishlaydi?","description":"Shaxsiy kompyuterlarning operatsion tizimlari yaratilish tarixiga nazar solsak, sakkiz razryadli shaxsiy kompyuterlar...","slug":"operatsion_tizim_nima_va_u_qanday_ishlaydi","date":"June 25, 2022","body":null},{"title":"SVG Caching with ","description":"Smaller DOM size by reusing existing SVG icons","slug":"svg-caching-with-use","date":"June 25, 2020","og":"https://i.microlink.io/https%3A%2F%2Fcards.microlink.io%2F%3Fpreset%3Dpaco%26title%3DSVG%2520Caching%2520with%2520%253Cuse%253E%23","body":null}] \ No newline at end of file diff --git a/posts/mysqlga-juniorcha-va-seniorcha-sorovlar.md b/posts/mysqlga-juniorcha-va-seniorcha-sorovlar.md new file mode 100644 index 0000000..bf4f0bc --- /dev/null +++ b/posts/mysqlga-juniorcha-va-seniorcha-sorovlar.md @@ -0,0 +1,129 @@ +--- +title: "Mysqlga juniorcha va seniorcha so'rovlar" +description: "Ma'lumotlar bazasiga amalga oshiriladigan so'rovlarni optimizatsiya qilish uchun kichik misol..." +slug: mysqlga-juniorcha-va-seniorcha-sorovlar +date: August 18, 2023 +--- + +Tasavvur qilaylik bizda sotilgan mahsulotlar ma'lumotlari saqlanadigan jadval bor. Unda mahsulot nomi, idenfikatori va vaqti kabi ma'lumotlar saqlanadi. Bizdan talab etiladigani esa buyurtmachiga statistika chiqarib berishim lozim. Odatda statistikalar haftalik yoki oylik ko'rinishda beriladi. + +## Junior bu holatda nima qiladi? + +Albatta oylar yoki haftadagi kunlarning har biri bilan ma'lum shartlar asosida qayta qayta so'rov amalga oshiradi. Bu holatda esa ma'lumotlar ombori uchun so'rovlar soni oshib yuklamalar keltirib chiqaradi. + +Psevdo kod misolida: + +``` +for loop { + date = getDate() + query = "select query" +} +``` + +## Seniorcha yechim: + +Yuqoridagi muammoni mysqlning o'zidagi tayyor funksiyalardan foydalanib birgina so'rov asosida chiqarish imkoni mavjud. + +- COALESCE() - Ro'yxatdagi NULL bo'lmagan birinchi qiymatni qaytaradi +- YEARWEEK() - Berilgan vaqtga nisbatan yil va haftani qaytaradi +- NOW() - Real vaqtni qaytaradi + +Demak yuqoridagilarga asoslanib ushbu haftada sotilgan maxsulotlarni kunlik sonini chiqaramiz: + +```sql +SELECT + COALESCE( COUNT( id ), 0 ) AS count, + DAYNAME( datetime ) as dayname +FROM sales +WHERE YEARWEEK( datetime ) = YEARWEEK( NOW() ) +GROUP BY datetime; +``` + +Yoki unix timestamp saqlanadigan holat uchun: + +```sql +SELECT + COALESCE( COUNT( id ), 0 ) AS count, + DAYNAME( FROM_UNIXTIME( datetime ) ) as dayname +FROM sales +WHERE + YEARWEEK( FROM_UNIXTIME( datetime ) ) = YEARWEEK( NOW() ) +GROUP BY FROM_UNIXTIME( datetime ); +``` + +YEARWEEK( NOW() ) qiymatini YEARWEEK( 'yyyy-mm-dd' ) ko'rinishida berib xohlagan sanaga moslab ma'lumotlarni chiqarish ham mumkin. + +Oylar bo'yicha statistika: + +```sql +SELECT + COALESCE( COUNT( id ), 0 ) AS count, + MONTHNAME( datetime ) as monthname, + EXTRACT(YEAR_MONTH FROM datetime ) as month +FROM sales +GROUP BY EXTRACT(YEAR_MONTH FROM datetime); +``` + +Oylar bo'yicha statistika (unix timestamp uchun): + +```sql +SELECT + COALESCE( COUNT( id ), 0 ) AS count, + MONTHNAME( FROM_UNIXTIME( datetime ) ) as monthname, + EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME( datetime ) ) as month +FROM sales +GROUP BY EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME( datetime ) ); +``` + +Yuqorida keltirilgan birgina so'rov asosida mysql mahsulotlarning sotilgan sonini hafta yoki oy nomlari asosida qaytaradi. Tayyor ma'lumot olingach, uni o'zingiz bilgan tilda manipulatsiya qilish qiyinchilik tug'dirmaydi. + +## Bonus + +Tasavvurimizni yana bir ishga tushirsakda sotilgan mahsulotlarni foizlardagi nisbatini ham chiqarsak. Bunda albatta so'rov natijasini yana qayta ishlashga ehtiyoj sezilmaydi. + +```sql +SELECT id, COUNT(*) AS count, 100 * COUNT(*)/s.total_sum AS percentage +FROM sales +CROSS JOIN ( + SELECT COUNT(*) AS total_sum + FROM sales +) AS s +GROUP BY id; +``` + +``` +id count percentage +1 218022 15.9904 +2 533122 39.1009 +3 574475 42.1339 +4 37833 2.7748 +``` + +Endi yuqoridagi so'rovlarni birlashtirish orqali sotilgan maxsulotlar sonini oylarga nisbatini ham olish mumkin bo'ladi + +```sql +SELECT + id, + MONTHNAME( datetime ) as month, + EXTRACT(YEAR_MONTH FROM datetime ) as date, + COUNT( id ) AS count, + CONCAT(ROUND( (100 * COUNT( id )/s.total_sum), 2 ), '%') as percentage +FROM sales +CROSS JOIN ( + SELECT COUNT( id ) AS total_sum FROM sales +) AS s +GROUP BY EXTRACT( YEAR_MONTH FROM datetime ) +ORDER BY count DESC +``` + +``` +id month date count percentage +1 November 202211 10739 8.17% +2 October 202210 8970 6.82% +3 September 202209 8672 6.59% +4 July 202207 8623 6.56% +``` + +## Xulosa + +Albatta bu birgina so'rovlar orqali amalga oshirish mumkin bo'lgan ishlar uchun kichik misol xolos, ammo sizning optimizatsiya masalasidagi qarashlaringizga oz bo'lsada tasir ko'rsata oladi degan umiddaman. \ No newline at end of file diff --git a/posts/nginxda-ichki-redireksiya-yoxud-katta-stream-servisda-havolalarni-tekshirish-qanday-amalga-oshirilgan-edi.md b/posts/nginxda-ichki-redireksiya-yoxud-katta-stream-servisda-havolalarni-tekshirish-qanday-amalga-oshirilgan-edi.md new file mode 100644 index 0000000..1f5e864 --- /dev/null +++ b/posts/nginxda-ichki-redireksiya-yoxud-katta-stream-servisda-havolalarni-tekshirish-qanday-amalga-oshirilgan-edi.md @@ -0,0 +1,127 @@ +--- +title: "Nginxda ichki redireksiya yoxud katta stream servisda havolalarni tekshirish qanday amalga oshirilgan edi?" +description: "Odatda statik fayllarni uzatish uchun nginx server ko'targanda indeksatsiyadan himoyalash ancha muammoga aylanadi..." +slug: nginxda-ichki-redireksiya-yoxud-katta-stream-servisda-havolalarni-tekshirish-qanday-amalga-oshirilgan-edi +date: July 27, 2023 +--- + +Uzmovi.com menga real foydalanuvchilar doirasida juda ko'p tajribalar qilish imkonini yaratib bergan platformalardan biri hisoblanadi. Katta oqimdagi foydalanuvchilar optimizatsiya va himoya tizimlaridagi turlicha metodlarni ishlab chiqish uchun yaxshi sabab bo'la oladi. Masalan bulardan biri bugun men sizlarga aytib bermoqchi bo'lgan ichki redireksiya hisoblanadi. + +Odatda statik fayllarni uzatish uchun nginx server ko'targanda indeksatsiyadan himoyalash ancha muammoga aylanadi. Garchand nginxni o'zida juda ko'plab imkoniyatlar bo'lsada ulardan har doim ham maqsadli foydalanish imkoni mavjud emas. Yoki lua dasturlash tilini olaylik yaqin yillargacha nginxda qo'lbola funksiyalarni yozish uchun yaxshi metod edi. Lekin ubuntu 20.04dan boshlab Ubuntu server jamoasi ushbu moduldan quyidagi sabablarga ko'ra voz kechishdi. + +- Lua modulining eskirishi +- Luaning eski versiyalari uchun liblua-dev qo'llash imkoni mavjud emas +- Luani yangi darajaga olib chiqish uchun qayta modullar yozish talabi + +Aynan shu sababli nginx ham yangi versiyalardan luani qo'llab quvvatlashni to'xtatdi. Ammo umidni uzishga shoshilmang. Siz uchun nginxning ko'pchilik bexabar boshqa qismi ham bor. + +Menimcha barcha dasturchilar http 301 redireksiyasidan xabardor bo'lsalar kerak. + +```http +HTTP/1.1 301 Moved Permanently +Location: http://www.example.org/another_page +``` +Bu metod odatda foydalanuvchi brauzerini bir sahifadan boshqasiga yo'naltirish uchun ishlatiladi. Lekin biz buni tashqi redireksiya deb ataymiz. Chunki foydalanuvchi o'zgargan sahifadan xabardor bo'ladi. + +Xuddi shu tartibda ishlaydigan ichki redireksiya ham mavjud, unda foydalanuvchi http://www.example.org/mypage sahifasiga murojaat qilsa redireksiya backend qismni o'zida amalga oshiriladi va foydalanuvchiga u murojaat qilgan havolani o'zidayoq ma'lumotlarni olib qolish imkoni mavjud bo'ladi. + +Ho'sh bu qanday imkoniyatlar beradi? + +Tasavvur qiling sizda ikkita server mavjud, birida sizning asosiy saytingiz, ikkinchisida esa yuklash uchun beriladigan statik fayllar joylashgan. Lekin siz static faylni yuklash ruxsatini faqatgina ro'yxatdan o'tgan foydalanuvchigagina berishingiz kerak. Yoki yana bir holatda sizda /download.php fali bor deylik unga siz ?file_id=123 so'rovini berganingizda 123 idenfikatorga asoslanib fayl joylashuvini topadi va binary faylni uzatishi kerak. + +Odatda ko'pchilik o'zi foydalanadigan backend texnologiyada header orqali transfer qilish metodini qiladi. Masalan phpda: + +```php +$file_url = '/home/user/file.exe'; +header('Content-Type: application/octet-stream'); +header("Content-Transfer-Encoding: Binary"); +header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); +readfile($file_url); +``` +Ammo bu metodda siz ishlatayotgan texnologiya reader va proxy vazifasini bajarib serverdagi butun resursni band qilishga urinadi. Ya'ni oddiyroq aytganda download.php fayli 10Mb hajmga ega faylni uzatish uchun operativ xotiradan yana 10Mb joy egallashga majbur bo'ladi. Katta fayllar haqidaku bunday metodda o'ylamagan ham maqul. + +Ichki redireksiyada barchasi boshqacha ishlaydi. Siz avvalo kerakli texnologiyangiz bilan (menda php) foydalanuvchi barcha shartlarni bajarayonganini tekshirasiz, keyin esa xuddi 301 kabi uni boshqa ichki locationga yo'naltirasiz. + +PHP kod: + +```php +$file_id = $_GET['file_id']; +$row = $db->query( "SELECT id, filename, file_path FROM files WHERE id = {$file_id}" )->fetch(); + +header('Content-Type: application/octet-stream'); +header("Content-Transfer-Encoding: Binary"); +header('Content-Disposition: attachment; filename="'.$row["filename"].'"'); +header("Content-Length: ".filesize( "/home/user/files/{$row["file_path"]}" )); + +$location = "/internal_download/{$row["file_path"]}"; +header("X-Accel-Redirect: " . $location); +``` + +Nginx konfiguratsiya: + +``` +server { + listen 80 default_server; + listen [::]:80 default_server; + + root /var/www/html; + server_name _; + + types { + image/jpeg jpg; + video/mp4 mp4; + audio/mpeg mp3; + } + + location / { + try_files $uri $uri/ = 404; + } + + location ~ ^/internal_download/(?.*)$ { + sendfile on; + sendfile_max_chunk 512; + tcp_nopush on; + tcp_nodelay on; + include mime.types; + alias /home/user/files/$filename; + internal; + } + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/run/php/php8.1-fpm.sock; + } +} +``` + +Yuqoridagi misoldan tushunishingiz mumkinki "X-Accel-Redirect" orqali phpdan ichki redireksiya berilmoqda, nginxda esa internel seksiyasi orqali ichki redireksiya qabul qilib olinyapti. Bu usulning yana bir yaxshi tomoni borki foydalanuvchi internal blokga (Mendagi misolda: internal_download) murojaat qilgan vaqtda server uchun 404 xatoligini qaytaraveradi, ya'ni bu blok faqatgina server ichki qismidan ishlaydi xolos. + +Shuningdek php fayl o'z ishini bajarib bo'lgach nginx fpm protsesdan murojaat qilingan php faylni o'chiradi, bu esa foydalanuvchi yuklab olguncha fpm protsess kuzatib turmasligini ta'minlab beradi. + +Nginx orqali katta hajmdagi fayllarni uzatishni ko'zda tutganlar uchun qo'shimcha bonus ham qilishni maqul ko'rdim va quyidagi konfiguratsiyalarni /etc/nginx/nginx.conf fayliga qo'shishni yoki ularni quyidagicha o'zgartirishni unutmang. + +Bunda: + +- worker_rlimit_nofile linuxdagi bitta protses uchun oldindan belgilangan maksimal fayllarni ochish sonini oshirib beradi. +- worker_connections nginx bir vaqtni o'zida maksimal qancha ulanishni qabul qila olishini belgilaydi +- multi_accept ichki protsess bir vaqtda bir necha fayllarga ulanish imkonini beradi + +Agarda sizda fayllar hajmi 100Mbdan oshsa: + +- tcp_nodelay paket hajmidan qat'iy nazar ma'lumotlarni buferga yuborishni ta'minlaydi +- tcp_nopush uzatilgan ma'lumotlar miqdorini optimallashtiradi +- keepalive_timeout bo'sh qolgan aloqa yopilish vaqti, ya'ni foydalanuvchi o'z ishini bajarib bo'lsa uni odatdagidek 75 soniya kutilmaydi. Balkim aloqa o'z o'rnida uziladi. + + +``` +worker_rlimit_nofile 65535; +events { + worker_connections 20000; + multi_accept on; +} +http{ + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 0; +} +``` \ No newline at end of file