Apache Nginx ortida

Assalomu alaykum, hurmatli Opennetchilar! Men bu maqolani uzoq tanaffusdan keyin, xuddi birinchi marta maqola yozayotganday yozayapman. Shuning uchun maqolada ortiqchalik yoki kamchiliklar bo'lsa ma'zur tutgaysizlar.

Maqolaning kirish qismi balki sizga uzunroqday tuyular, ammo o'quvchini men ushbu maqolada nima haqida yozishim haqida to'laroq tasavvur hosil qilishi va u nimalarga yechim bo'lishi haqida ko'proq narsa bilishini xohlaganim sababli shunday qildim.

Eslatma: Ushbu maqola Apache nimaligini va uni o'rnatib vhostlarni yaratib ishga tushirishni biladigan kishilarga mo'ljallangan.

Oramizda loyihalarini o'zlarining serverlarida yoki VDS/VPS (Virtual Dedicated/Private Server)larida web server ko'tarib ishga tushurgan kishilar ham bor. Ana shunday vaziyatlarda web sayt, loyihalar bilan ishlagan kishilar ilgari uchramangan ba'zi yangicha muammolarga duch kelishadi. Shulardan biri bu — resurs yetishmasligi, ya'ni loyihaning sifatli va bardavom ishlashi uchun server sifatida ishlatilayotgan kompyuterning fizik quvvati yetishmay qolishi kabi holatlardir.


Bunday holatga men toki VDS olib unda web server o'rnatib saytlarni ishga tushirgunimga qadar duch kelmagan edim. Hostinglarda joy bo'lmagan, ya'ni hostinglar ko'tara olmagan saytlarni VDSda ishga tushirish tavsiya etilishi, aynan shu — VDSlar shunday holatlar uchun chiqarilgani haqida o'qigandim. Ammo web serverni olib, unda Debian o'rnatib, kyin Apache2, MySQL server, php larni o'rnatganimdan keyin faqat buning o'zi yetarli emasligiga guvoh bo'ldim. Web serverlar server dasturlar o'rnatilgan kompyuterlar bo'libgina qolmay, ular puxta sozlangan (настройка) ham qilingan bo'larkan. Men o'rnatgan VDS hali undagi saytlarga aytarlicha foydalanuvchilar kirib ulgurmasdan, yoki foydalanuvchilar soni 1000dan oshgach DDR (RAM/ОЗУ) to'la yoki 90% band bo'lish holati, CPUni aytmasa bo'ladi, kabi muammolar paydo bo'la boshladi. Tekshirib qarasam, DDR va CPUni ba'zan MySQL ba'zan Apache2 band qilib olyapti.

Shu yerda maqolaning yozilishiga sabab bo'lgan asosiy gapni boshlasam. Yuqorida serverlardagi dasturiy ta'minotni optimallashtirish mavzusiga ishora berib o'tdim. Ammo bu mavzu yetarlicha katta mavzu hisoblanadi. Bu maqolada esa, uning kichik bir tomoniga — Apache2 serverining qanday qilib kompyuter resusrlarining asosiy qismini band qilib qo'ymasligiga erishish usullaridan biriga to'xtalib o'tmoqchiman.

Oramizda ba'zilar Apache2 dan boshqa HTTP serverlar borligini bilishmaydi ham hatto. Ammo ishonavering Apache2 eng qadimiy, HTTP serverlari qiroli hisoblansada, ko'pchilikning aytishicha uning davri o'tdi, so'ngi kunarini yashamoqda.

Hozirgi kunda Apache o'rniga da'vogarlardan eng muvofaqqiyat qozonayotgani Nginx bo'lsa kerak. Ha, Nginx Apachega nisbatan ancha resusr tejash jihatidan ancha afzal hisoblanadi (Google qilib ko'rsangiz so'zimni tasdiqlaydigan ancha-muncha maqola topasiz, nasib etsa.).

Demak, atroda aylanmasdan maqsadga o'tsak. Ushbu maqolada qnaday qilib Apache2 «o'rniga» Nginx qo'yishni ko'rib chiqamiz.

Apache2 O'RNIGA deganda Apache2ni o'chirib tashlaymizmi degan hayolga bormang. Apache2 qoladi, ammo boshqa o'rinda bo'ladi endi, Apache2ning «taxt»i endi Nginxga tegishli, haqli ravishda.

Demak bu usul Apache2 Nginx ortida («Apache behind Nginx frontend proxy») deb nomalanadi.
Apache Nginx ortida

Bu usulni ma'nosi nima? Bu usulda serverdan qilingan murojaat avval Nginxga yo'naltiriladi, keyin static fayl (css,js,pdf,jpg/png/gif)lar to'g'ridan to'g'ri yuklanadi, php sahifalar va qolgan murojaatlar Apachega yo'naltiriladi. Bunday holatda six ham kuymaydi, kabob ham — Nginx klient bn ishlab, resusrni tejaydi, Apache2 esa saytlarni hardoimgiday, .htaccess — mod_rewritelari bilan ishga tushiraveradi.

Xo'sh, endi buni qanday amalga oshirish mumkinligini ko'rib chiqsak:

Manba sifatida Howtoforgega murojaat qilaman.

Demak, serverimizda OS sifatida Debian/Ubuntu o'rnatilgan. Unda Apache2, php, mysql o'rnatilgan va bidda www.site.uz ishlab turibdi. Serverimiz ip manzili: 213.230.55.66.

Agar bularni bilmasangiz bu yerni o'qib chiqing.

Apache va Nginxlar HTTP server bo'lgani uchun 80 port bilan ishlashadi. Ammo ikkalasi ham bir vaqtda 80 port bilan ishlay olmaydi. Shuning uchun Apachening portlar bilan bog'liq sozlanmalarini keraklicha tahrirlaymiz:

nano /etc/apache2/ports.conf



# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default
# This is also true if you have upgraded from before 2.2.9-3 (i.e. from
# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
# README.Debian.gz

NameVirtualHost *:8000
Listen 8000

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
Listen 443
</IfModule>

<IfModule mod_gnutls.c>
Listen 443
</IfModule>


Bu yerda Apachega port sifatida 8000 ni berdik.

endi, Apacheda www.site.uz uchun ochilgan vhost config faylini tahrirlaymiz:

nano /etc/apache2/sites-available/site.uz.vhost


deyilgan joyini:

<VirtualHost 127.0.0.1:8000>
[...]

ga o'zgartiramiz.

Endi murojaatlar Apachega Nginx orqali ya'ni 127.0.0.1 ipsi orqali keladi. Ammo biz loglarda haqiqiy murojaat qiuvchilarning haqiqiy iplarini yozib qo'yishimiz uchun quyidagi tahrirlashlarni amalga oshiramiz:

nano /etc/apache2/apache2.conf



[...]
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[...]


Va loglarni to'g'ri olib borilishini ta'minlash maqsadida Apachening libapache2-mod-rpaf modini o'rnatamiz:

apt-get install libapache2-mod-rpaf


Endi Apacheni qayta yuklaymiz:

/etc/init.d/apache2 restart


Hali Nginx o'rnatilmagan bo'lsa, o'rnatamiz:

apt-get install nginx


Tizim ishga tushganda Nginx ishga tushadigan qilamiz:


update-rc.d nginx defaults
/etc/init.d/nginx restart


Endi Nginx 80 port bilan muammosiz ishlaydi.

Proxy xosslalarini kiritamiz:

nano /etc/nginx/proxy_params



proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


Ushbu fayl keyinchalik Nginx vhost config fayllarida yuklanadi. Shu sababli agar istasangiz ushbu faylda ba'zi bir qo'shimcha xossalarni ham kiritishingiz mumkin masalan:


proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size 100M;
client_body_buffer_size 1m;
proxy_intercept_errors on;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 256 16k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_max_temp_file_size 0;
proxy_read_timeout 300;


Endi Nginx 'sites-available' papkasida www.site.uz uchun vhost config fayl yaratamiz:

nano /etc/nginx/sites-available/site.uz.vhost



server {
       listen 80;
       server_name www.site.uz site.uz;
       root /var/www/site.uz/web;
       if ($http_host != "www.site.uz") {
                 rewrite ^ http://www.site.uz$request_uri permanent;
       }
       index index.php index.html;

       location / {
                proxy_pass http://localhost:8000;
                include /etc/nginx/proxy_params;
       }
}


Eslatma! www.site.uz root papkasi Apache dagi www.site.uz uchun yaratilgan vhost config fayldagi document root manzil bilan bir xil bo'lishi kerak.

Endi yangi yaratilgan vhostimizni Nginxda akivlashtiramiz:


cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/site.uz.vhost site.uz.vhost


O'zgartirishlar joriy etilishi uchun Nginxni qayta yuklaymiz:

/etc/init.d/nginx reload


Ushbu vhost conf juda oddiy, siz istasangiz ushbu config fayldagi sozlashlarni mukammalshatirishingiz mumkin. Masalan yuqorida aytilganday, statik fayllarni to'g'ridan to'g'ri ochi uchun quyidagicha sozlashlarni amalga oshirishimiz mumking:


server {
       listen 80;
       server_name www.site.uz site.uz;
       root /var/www/site.uz/web;
       if ($http_host != "www.site.uz") {
                 rewrite ^ http://www.site.uz$request_uri permanent;
       }
       index index.php index.html;

       location / {
                proxy_pass http://localhost:8000;
                include /etc/nginx/proxy_params;
       }
       location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
       }
}


Hattoki ushbu statik fayllar browser cachelarida qancha vaqt qolishini mumkinligini ham belgilashimiz mumkin:


server {
       listen 80;
       server_name www.site.uz site.uz;
       root /var/www/site.uz/web;
       if ($http_host != "www.site.uz") {
                 rewrite ^ http://www.site.uz$request_uri permanent;
       }
       index index.php index.html;

       location / {
                proxy_pass http://localhost:8000;
                include /etc/nginx/proxy_params;
       }
       location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
                expires      30d;
       }
}


Va hatto barcha Nginx qo'llashi mumkin bo'lgan murojaatlarni o'zi bajarib qolganlarinigina Apachega yuboradigan qilishimiz ham mumkin:


server {
       listen 80;
       server_name www.site.uz site.uz;
       root /var/www/site.uz/web;
       if ($http_host != "www.site.uz") {
                 rewrite ^ http://www.site.uz$request_uri permanent;
       }
       index index.php index.html;

       location / {
                try_files $uri @proxy;
       }
       location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
                expires      30d;
       }
       location @proxy {
                proxy_pass http://127.0.0.1:8000;
                include /etc/nginx/proxy_params;
       }
       location ~* \.php$ {
                proxy_pass http://127.0.0.1:8000;
                include /etc/nginx/proxy_params;
       }
}



Endi Nginxni qayta yuklaymiz:

/etc/init.d/nginx reload


Albatta bular namunaviy sozlashlar, siz o'zingizning ehtiyojlaringizdan kelib chiqqan holda ko'plab aniqroq sozlashlarni ham amalga oshirishingiz mumkin.

17 комментариев

jamic
Zuuur maqola chiqibdi. Bu haqiqatdanam zur g`oya arxitektirasi. Mana urganvoldik endi experemantga…
0
SardorDushamov
vaaaooo, man anchadan beri kutib yurgan maqola. Raxmat.Endi biza ham experiment qilishni boshlimiz.
0
ruslanmedia
Judaaa ham zo‘r maqola bo‘libdi! Rahmat kattakon!
0
Anvar
Maqolam yoqqanidan xursandman. Ammo karmamda o'zgarish ko'rmayapmanku? :) :)
Hali xazinada bularni davomi bor, nasib etsa ularni ham yozib chop qilaman.
0
geniuz
maqola zur ammo domen ishlatish sal notogri bulibdimi deymanda?
site.uz debsiz, va unga link quyibsiz, ammo unaqa sayt haqiqatdan xam mavjudku?
0
Anvar
site.uz ni tizimni o'zi link qivorganda, oldidan www bo'lgani uchun.
0
bahriddin
Avval vhost o'rnatcolishim kerak ekan xperiment uchun.
0
Anvar
link borku, hali qo'shmaganlar uchun, qo'llanmaga.
0
SardorDushamov
Apacheda www.site.uz uchun ochilgan vhost config faylini tahrirlaymiz: Menda .vhost fayli yuq, .conf fayli bor bular ikkalasai bir hil narsami?
0
Anvar
odatda menda /etc/apache2/sites-available/site.uz turadi.
0
bahriddin
Menda xuddi shu ishlarni qilganimdan keyin vhost ishlamay qoldi. localhost/ deganda hammasi Welcome to NGINX deb yozdi, keyin /etc/nginx/sites-available dagi defaultʻdagi rootni almashtirdim. Shunda men koʻrsatgan papkadagi faqat index.htmlʻni ochyapti. (/test.php qilgandayam). Yordam!
0
geniuz
To'liq qiling to'liq, qaytadan…
0
bahriddin
/etc/apache2/apache2.confʻdagi mana bu toʻgʻrimi:

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combi$
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-$
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
0
Anvar
tekshirib ko'ring. Agar xatolik ketaversa, boshqichma bosqich bajarib tekshiring. Masalang proxyni sozlab ishlatib ko'ring, ishlasa keyin loglarni sozlashga o'ting.
0
shranet
Manimcha bu usulni CMS, Apache modullari bilan bog'liq va .htaccess ko'p ishlatilgan saytlarda ayrim muammolardan qochish uchun qilgan yaxshi. Man hozirgi kunda PHP-FPM ni ishlataman PHP li saytlar uchun.

Maqola zo'r, oldin umuman qilmagan ishim :)
0
geniuz
nginx oldida tursa uni yaxshi taraflari bor, masalan code php emas, python yo rubyda yozilgan bulsa, ularni uzini web serverini nginxni orqasida ishga tushursa judayam ideal buladi manimcha, usha python/ruby lar turli static filelarni uqib utirmaydida faqat uzini ishini qiladi, a nginx proxy + static filelarni renderi bn shugullanadi
0