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.
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:
Bu yerda Apachega port sifatida 8000 ni berdik.
endi, Apacheda www.site.uz uchun ochilgan vhost config faylini tahrirlaymiz:
deyilgan joyini:
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:
Va loglarni to'g'ri olib borilishini ta'minlash maqsadida Apachening libapache2-mod-rpaf modini o'rnatamiz:
Endi Apacheni qayta yuklaymiz:
Hali Nginx o'rnatilmagan bo'lsa, o'rnatamiz:
Tizim ishga tushganda Nginx ishga tushadigan qilamiz:
Endi Nginx 80 port bilan muammosiz ishlaydi.
Proxy xosslalarini kiritamiz:
Ushbu fayl keyinchalik Nginx vhost config fayllarida yuklanadi. Shu sababli agar istasangiz ushbu faylda ba'zi bir qo'shimcha xossalarni ham kiritishingiz mumkin masalan:
Endi Nginx 'sites-available' papkasida www.site.uz uchun vhost config fayl yaratamiz:
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:
O'zgartirishlar joriy etilishi uchun Nginxni qayta yuklaymiz:
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:
Hattoki ushbu statik fayllar browser cachelarida qancha vaqt qolishini mumkinligini ham belgilashimiz mumkin:
Va hatto barcha Nginx qo'llashi mumkin bo'lgan murojaatlarni o'zi bajarib qolganlarinigina Apachega yuboradigan qilishimiz ham mumkin:
Endi Nginxni qayta yuklaymiz:
Albatta bular namunaviy sozlashlar, siz o'zingizning ehtiyojlaringizdan kelib chiqqan holda ko'plab aniqroq sozlashlarni ham amalga oshirishingiz mumkin.
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.
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.
Hali xazinada bularni davomi bor, nasib etsa ularni ham yozib chop qilaman.
site.uz debsiz, va unga link quyibsiz, ammo unaqa sayt haqiqatdan xam mavjudku?
Maqola zo'r, oldin umuman qilmagan ishim :)