SYN/ACKMemcached использует модуль slab-аллокациипамятиСовместная работа Nginx и ApacheINFOinfoСжатие методамиGzip и Deflate различаетсятолько тем, чтоGzip-упаковщик добавляетк результатунебольшой заголовоки контрольную сумму.# Ñòàíäàðòíûå íàñòðîéêèinclude /etc/nginx/mime.types;default_type application/octet-stream;server_names_hash_bucket_size 64;access_log /var/log/nginx/access.log;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;tcp_nodelay on;# Âêëþ÷àåì ñæàòèågzip on;gzip_proxied any;gzip_min_length 1100;gzip_http_version 1.0;gzip_buffers 4 8k;gzip_comp_level 9;gzip_types text/plain text/css application/x-javascript text/xml application/xmlapplication/xml+rss text/javascript;}include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;Ñîçäàåì êîíôèã íàøåãî õîñòà:# vi /etc/nginx/sites-enabled/host.comserver {listen 80;server_name host.com;access_log /var/log/nginx.access_log;# Âñþ ñòàòèêó Nginx îòäàåò ñàìîñòîÿòåëüíîlocation ~* \.(jpg|jpeg|gif|png|css|js|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx)$ {root /var/www/host.com/;index index.html index.php;access_log off;expires 30d;}# Äîñòóï ê ôàéëàì òèïà .htaccess çàïðåùåílocation ~ /\.ht {deny all;}# Âñå çàïðîñû êî âñåìó îñòàëüíîìó êîíòåíòóïåðåäàåì Apachelocation / {proxy_pass http://127.0.0.1:81/;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-for $remote_addr;proxy_set_header Host $host;proxy_connect_timeout 60;proxy_send_timeout 90;proxy_read_timeout 90;proxy_redirect off;proxy_set_header Connection close;proxy_pass_header Content-Type;proxy_pass_header Content-Disposition;proxy_pass_header Content-Length;}}Âñå, ïåðåçàïóñêàåì Apache è Nginx:$ sudo service apache2 restart$ sudo service nginx restartУСТАНОВКА MEMCACHEDMemcached — ñèñòåìà êýøèðîâàíèÿ äàííûõ â îïåðàòèâíîéïàìÿòè, êîòîðàÿ ìîæåò áûòü èñïîëüçîâàíà äëÿ ðàñïðåäåëåííîãîõðàíåíèÿ è óñêîðåíèÿ äîñòóïà ê äàííûì ëþáîãî òèïà.Ýòî îäíî èç ñàìûõ ïîïóëÿðíûõ ðåøåíèé â îáëàñòè òîòàëüíîéîïòèìèçàöèè âåá-ñàéòà äëÿ âûñîêèõ íàãðóçîê, íå òðåáóþùååíàñòðîéêè è äîëãîãî èçó÷åíèÿ API. Îáû÷íî memcachedèñïîëüçóåòñÿ, òàê ñêàçàòü, äâóìÿ ñòîðîíàìè, îäíà èç êîòîðûõïîìåùàåò äàííûå â êýø, à äðóãàÿ — èçâëåêàåò.  âåá-ñðåäåðîëü ïåðâîé ñòîðîíû îáû÷íî èãðàåò íåáîëüøîé PHP-ñêðèïò,êîòîðûé çàïèñûâàåò âàæíûå (ñ òî÷êè çðåíèÿ ñêîðîñòè îòäà-÷è) äàííûå â memcached, â òî âðåìÿ êàê âòîðàÿ ñòîðîíà — ýòîîáû÷íî ëåãêîâåñíûé ôðîíò-ýíä ñåðâåð (êàê ïðàâèëî, nginx),èñïîëüçóþùèé ñïåöèàëüíûé ìîäóëü äëÿ ÷òåíèÿ è îòäà÷èäàííûõ èç memcached. ×àñòî memcached èñïîëüçóåòñÿ äëÿêýøèðîâàíèÿ âñåõ ñòðàíèö âåá-ñàéòà öåëèêîì, áëàãîäàðÿ÷åìó ñêîðîñòü äîñòóïà ê ýòèì ñòðàíèöàì âîçðàñòàåò íà íåñêîëüêîïîðÿäêîâ.  ïðîñòåéøåì ñëó÷àå òàêàÿ êîíôèãóðàöèÿâûãëÿäèò ñëåäóþùèì îáðàçîì:1. Óñòàíàâëèâàåòñÿ memcached:$ sudo apt-get install memcached2.  ñåêöèþ server êîíôèãóðàöèîííîãî ôàéëà nginxäîáàâëÿå òñÿ ïðèìåðíî ñëåäóþùåå:# vi /etc/nginx/nginx.conflocation / {# Óñòàíàâëèâàåì êëþ÷ memcached, ðàâíûé çàïðàøèâàåìîìóURIset $memcached_key $uri;# Àäðåñ è ïîðò äåìîíà memcachedmemcached_pass 127.0.0.1:11211;130 XÀÊÅÐ 08 /139/ 10
Слоеный пирог типичного веб-сайтаNginx — гордость отечества :)# Çàãîëîâîê ïî óìîë÷àíèþdefault_type text/html;# Åñëè äàííûå â êýøå íå íàéäåíû — çàïðàøèâàåì èõ ó áýêýíäàerror_page 404 = /fallback;}location /fallback {proxy_pass backend;}3. Äëÿ PHP óñòàíàâëèâàåòñÿ ðàñøèðåíèå memcache (êëèåíò êmemcached):$ sudo pecl install memcache4.  ñòðàíèöû âñòðàèâàåòñÿ ïðèìåðíî òàêîé êîä:$ vi smaple.php# Èíèöèàëèçàöèÿ memcached îïóùåíàob_start();$html = ob_get_clean();$memcache->set($_SERVER['REQUEST_URI'], $html);echo $html;Âñå ýòî îòëè÷íî ðàáîòàåò, íî òîëüêî â îòíîøåíèè î÷åíü ïðîñòûõ, ïî÷òèñòàòè÷åñêèõ âåá-ñàéòîâ. Äåëî â òîì, ÷òî ñòðàíèöà íå âñåãäà äîëæíà áûòüîäèíàêîâîé äëÿ âñåõ ïîñåòèòåëåé. ×òî åñëè ãëàâíàÿ ñòðàíèöà áóäåò çàêýøèðîâàíàïðè âõîäå íà ñàéò ãîñòÿ, à ïîñëå íåãî íà ñàéò ïðèäåò çàðåãèñòðèðîâàííûéó÷àñòíèê, êîòîðîìó âíîâü ïðåäëîæàò çàðåãèñòðèðîâàòüñÿ.Íåïîðÿäîê. Îäíàêî åñòü äîñòàòî÷íî ïðîñòîé âûõîä èç ýòîé ñèòóàöèè.Ïðîáëåìó ìîæåò ðåøèòü ïîêðûòàÿ ìõîì è ïàóòèíîé òåõíîëîãèÿ ïîäíàçâàíèåì SSI (Server Side Includes). SSI ïîçâîëÿåò ðàçáèòü âåá-ñòðàíèöóíà íåñêîëüêî áëîêîâ, êîòîðûå áóäóò ñîáðàíû ôðîíò-ýíäîì âîåäèíî âìîìåíò îáðàáîòêè çàïðîñà êëèåíòà. Íàïðèìåð, èñïîëüçóÿ SSI, òû äåëèøüãëàâíóþ ñòðàíèöó âåá-ñàéòà íà äâå ÷àñòè:# vi /var/www/index.phpmemcachedÏðè íàëè÷èè äîñòàòî÷íî áîëüøèõ îáúåìîâ ïàìÿòè õîðîøåéïðàêòèêîé áóäåò çàïóñê äåìîíà memcached ñ ôëàãîì '-L'. ðåçóëüòàòå äåìîí çàðàíåå ïîäãîòîâèò ê èñïîëüçîâàíèþâñþ âûäåëåííóþ åìó ïàìÿòü. Ýòî íåìíîãî ïîäíèìåò îáùóþïðîèçâîäèòåëüíîñòü ðàáîòû memcached çà ñ÷åò èñêëþ÷åíèÿíåîáõîäèìîñòè ïðîèçâîäèòü ïîñòîÿííûå âûäåëåíèÿ ïàìÿòèâî âðåìÿ ðàáîòû.Ýòî ðîâíî òà æå ñòðàíèöà, êîä àóòåíòèôèêàöèè êîòîðîé âûíåñåí â ôàéëauth.php, à âñÿ îñòàëüíàÿ ÷àñòü — â body.php. Èçþìèíêà æå çàêëþ÷àåòñÿâ òîì, ÷òî ïðèâåäåííûé âûøå â ÷åòâåðòîì øàãå êîä êýøèðîâàíèÿ òûïîìåùàåøü òîëüêî âî âòîðîé èç ýòèõ ôàéëîâ. Êàê ðåçóëüòàò âûðèñîâûâàåòñÿñëåäóþùàÿ êàðòèíà:1. ×åëîâåê ïðèõîäèò íà ñàéò â ïåðâûé ðàç. Ïðîèñõîäèò çàïðîñ ãëàâíîéñòðàíèöû âåá-ñàéòà ê nginx.2. Ñåðâåð nginx çàïðàøèâàåò ôàéë index.php ó áýê-ýíäà (Apache), âñòðå-÷àåò âíóòðè íåãî SSI-äèðåêòèâû è äåëàåò åùå *2* çàïðîñà ê áýê-ýíäó(auth.php è body.php).3. Ïîëó÷èâ çàïðîñû, Apache çàïóñêàåò PHP-èíòåðïðåòàòîð äëÿ îáðàáîòêèçàïðàøèâàåìûõ ôàéëîâ, â ðåçóëüòàòå ÷åãî (êðîìå âñåãî ïðî÷åãî) ñîäåðæèìîåòÿæåëîãî ôàéëà body.php ïîïàäàåò â êýø memcached.4. Îòâåò âîçâðàùàåòñÿ nginx, êîòîðûé îáúåäèíÿåò ôàéëû â îäèí index.php è îòäàåò èõ êëèåíòó.5. Ïîñëå ýòîãî íà ñàéò ïðèõîäèò çàðåãèñòðèðîâàííûé ó÷àñòíèê, ïðîèñõîäèòçàïðîñ index.php ó áýê-ýíäà (õîòÿ, ñêîðåå âñåãî, îí áóäåò âçÿò èç êýøàñàìîãî nginx), îäíàêî ê Apache óéäåò òîëüêî çàïðîñ ïðîñòîãî è ëåãêîãîauth.php, òîãäà êàê body.php áóäåò âçÿò èç êýøà memcached.Ñàìî ñîáîé ðàçóìååòñÿ, SSI íåîáõîäèìî àêòèâèðîâàòü â êîíôèãóðàöèîííîìôàéëå nginx ñ ïîìîùüþ îïöèè «ssi on», ïîìåùåííîé â ñåêöèþ«location /». Ñòîèò îòìåòèòü, ÷òî áëîê auth.php òàêæå ïîääàåòñÿ êýøèðîâàíèþ,íî äëÿ ýòîãî ïðèäåòñÿ ïðèñâàèâàòü âñåì çàðåãèñòðèðîâàííûìïîëüçîâàòåëÿì èäåíòèôèêàòîð, ñîõðàíÿòü åãî â êóêèñàõ è èñïîëüçîâàòüäëÿ ãåíåðàöèè óíèêàëüíîãî êëþ÷à memcached.КЛИЕНТСКАЯ ОПТИМИЗАЦИЯÝòà ñòàòüÿ ïîñâÿùåíà ñåðâåðíîé îïòèìèçàöèè âåá-ñàéòîâ, îäíàêî áûëîáû êîùóíñòâîì íå ðàññêàçàòü è î êëèåíòñêîé ÷àñòè ýòîãî ïðîöåññà. Ïîýòîìóìû êðàòêî ïðîáåæèìñÿ ïî ñïèñêó ðåêîìåíäàöèé, íàïðàâëåííûõ íàìèíèìèçàöèþ îáùåãî îáúåìà ïåðåäàâàåìûõ äàííûõ:1. Èñïîëüçóé gzip èëè deflate äëÿ ñæàòèÿ ñòðàíèö è äàííûõ. Äëÿ ýòîãîìîæíî çàäåéñòâîâàòü ìîäóëè HTTP-ñåðâåðîâ: ngx_http_gzip_module äëÿnginx, mod_compress äëÿ lighttpd è mod_deflate äëÿ Apache.2. Èñïîëüçóé óïàêîâùèêè äëÿ îïòèìèçàöèè è óäàëåíèÿ ëèøíåãî ìóñîðàèç HTML è JavaScript (îáû÷íî îíè óäàëÿþò âñå êîììåíòàðèè è ïðîáåëû,çàìåíÿþò èìåíà íà áîëåå êîðîòêèå è ò.ä., íàïðèìåð, web-optimizator,code.google.com/p/web-optimizator).3. Âûíîñè CSS è JavaScript-êîä â îòäåëüíûå ôàéëû, òîãäà îíè ñìîãóò áûòüçàêýøèðîâàíû áðàóçåðîì è ïðèìåíåíû ê äðóãèì ñòðàíèöàì (òàêæå èõìîæíî ðàçìåñòèòü íà îòäåëüíîì ñåðâåðå, ÷òîáû èõ çàãðóçêà ïðîèñõîäèëàïàðàëëåëüíî).4. Äëÿ áîëåå ïëàâíîé è êîððåêòíîé çàãðóçêè ñòðàíèöû áðàóçåðîì ðàçìåñòèçàãðóçêó CSS â íà÷àëå ñòðàíèöû, à JavaScript — â êîíöå.6. Íå çàáûâàé óñòàíàâëèâàòü çàãîëîâêè Expires è Cache-control, ÷òîáûCSS è JavaScript ìîãëè áûòü çàêýøèðîâàíû áðàóçåðîì.7. Íå ïðèìåíÿé JPG è PNG òîãäà, êîãäà ìîæíî îáîéòèñü GIF (íàïðèìåð,äëÿ ìåëêèõ èêîíîê).zXÀÊÅÐ 08 /139/ 10 131