Данная статья достаточно подробно показывает, как можно перейти на разработку сайтов Друпал с серьезной стрессоустойчивостью и возможностью обрабатывать большой трафик.
Это мой первый опыт подобной настройки, но как будет далее видно из статистики достаточно удачно справляющийся со своей основной задачей — ускорением работы сайта. Интересно будет услышать и увидеть настройки, дополнительные материалы от всех кто сталкивался с подобными задачами, так как в рунете пока еще мало свободной и качественной информации по этой теме относительно системы Друпал.
Довольно долго для разработки я использовал связку Drupal + Nginx с настройками сервера по умолчанию:
Суть этих настроек проста — разгрузить апач и оставить на нем только php процессы, а всю статику(картинки, файлы) перекидывать на Nginx. Апач у меня настроен на 8080 порт, а Nginx на 80. Nginx на фронтенде анализируют, что запрашивает и выкидывает статические данные сам или же перекидывает все на апач. Данный подход разгружает сервер и немного повышает производительность.
Для анализа сайта на Друпал, я использовал отличный сервис LoadImpact.com, который выкинул мне вот такой отчет:
Недолго нужно анализировать, чтобы понять, чем больше трафик на сайте, тем больше приходится ждать ответа от сервера. Это плохо. Решение я нашел в следующей связке:
Вот ссылки для скачки Pressflow:
fourkitchens.com/pressflow-makes-drupal-scale/downloads
launchpad.net/pressflow/+download
Ссылка для скачивания Varnish:
www.varnish-cache.org/releases
Идея этой связки не многим сложнее: на запрос к серверу выкидываем статику через Nginx, иначе идем за кешироваными данными к Varnish+Pressflow, и к апачу если нам нужно что-то от PHP.
Установка Pressflow вообщем-то ничем не отличается от установки Drupal :)
fourkitchens.com/pressflow-makes-drupal-scale/installation
Перейдите на mysite.com/admin/settings/performance и включите кеширование. Вот собственно и все.
Если Вы далеки от понятий SSH и Linux, попробуйте создать запрос к своим хостерам на инсталяцию Varnish. Я использовал этот мануал под FreeBSD www.varnish-cache.org/installation/freebsd. Все достаточно просто.
Это один из самых сложных пунктов по настройке всей системы:
1. Добавляем запуск varnish deamon и varnish log в конфигурационный файл /etc/rc.conf:
varnishd_enable=«YES»
varnishlog_enable=«YES»
2. Меняем дефолтные настройки под себя varnish deamon:
Как уже упоминалось ранее, на моем сервере Nginx слушает 80 порт, а Apache 8080. Varnish же поставим на прослушку порта 8081, а перекидывать с него опять же будем на апач, тоесть 8080 порт.
Тут:
-varnishd_config — путь к дефолтному файлу настроек поведения Varnish
-varnishd_storage — размер и путь к файлу кеша
3. Настраиваем Varnish на работу с Pressflow:
3. Настраиваем Ngnix на работу с Varnish:
Step 5: Перегружаем сервер
Теперь нужно убедиться, что Varnish запущен — попробуйте запустить комманду 'top' на терминале и проверьте, что процесс varnish запущен.
Убедитесь, что Varnish + Pressflow работают — запустите varnishlog комманду под SSH и попробуйте открыть свой сайт mysite.com, varnishlog после этого должен будет показать HTTP заголовки, это будет означать, что все работает отлично.
После всех этих настроек, я еще раз loadimpact`ом прогнал тест и получил:
Теперь ситуация значительно лучше, задержка от сервера стабильна и при повышении трафика не валит сервер.
Вот такие нехитрые настройки запустят Pressflow + Nginx + Varnish на Вашем сервер для ускорения Drupal.
Также походу дела обнаружилось, что у Nginx есть специальные настройки под Друпал — wiki.nginx.org/Drupal.
Дополнительные ссылки:
Это мой первый опыт подобной настройки, но как будет далее видно из статистики достаточно удачно справляющийся со своей основной задачей — ускорением работы сайта. Интересно будет услышать и увидеть настройки, дополнительные материалы от всех кто сталкивался с подобными задачами, так как в рунете пока еще мало свободной и качественной информации по этой теме относительно системы Друпал.
Довольно долго для разработки я использовал связку Drupal + Nginx с настройками сервера по умолчанию:
server {
listen 62.xxx.xx.xx:80;
server_name mysite.com www.mysite.com;
rewrite>^(/manager/.*)$>https://$host$1>permanent;
location ~* ^/(webstat/|awstats|webmail/|myadmin/|manimg/) {
proxy_pass 62.xxx.xx.xx:8080;
proxy_redirect mysite.com:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_pass mysite.com:8080;
proxy_redirect mysite.com:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
root /home/pathto/drupal613;
access_log /home/httpd-logs/mysite.com.access.log;
error_page 404 = @fallback;
}
location @fallback {
proxy_pass 62.xxx.xx.xx:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
Суть этих настроек проста — разгрузить апач и оставить на нем только php процессы, а всю статику(картинки, файлы) перекидывать на Nginx. Апач у меня настроен на 8080 порт, а Nginx на 80. Nginx на фронтенде анализируют, что запрашивает и выкидывает статические данные сам или же перекидывает все на апач. Данный подход разгружает сервер и немного повышает производительность.
Для анализа сайта на Друпал, я использовал отличный сервис LoadImpact.com, который выкинул мне вот такой отчет:
Недолго нужно анализировать, чтобы понять, чем больше трафик на сайте, тем больше приходится ждать ответа от сервера. Это плохо. Решение я нашел в следующей связке:
Pressflow + Nginx + Varnish
Pressflow это дистрибутив Drupal с интегрированными усовершенствованиями производительности, расширяемости, эффективности, и тестирования.
Кажая версия Pressflow является API эквивалентом тойже версии Drupal. Например, Pressflow 6 совместим со всеми Drupal 6 модулями. Pressflow 6 также имеет интегрированную SimpleTest систему из Drupal 7 и патч для поддержки CDN.
Вот ссылки для скачки Pressflow:
fourkitchens.com/pressflow-makes-drupal-scale/downloads
launchpad.net/pressflow/+download
Varnish это ключевое ПО для ускорения Вашего сайта.
Varnish — это Open Source ПО, стандартизированное и требующее незначительных ресурсов.
Ссылка для скачивания Varnish:
www.varnish-cache.org/releases
Идея этой связки не многим сложнее: на запрос к серверу выкидываем статику через Nginx, иначе идем за кешироваными данными к Varnish+Pressflow, и к апачу если нам нужно что-то от PHP.
Шаг 1: Устанавливаем Pressflow
Установка Pressflow вообщем-то ничем не отличается от установки Drupal :)
fourkitchens.com/pressflow-makes-drupal-scale/installation
Шаг 2: Настраиваем Pressflow
Перейдите на mysite.com/admin/settings/performance и включите кеширование. Вот собственно и все.
Шаг 3: Установка Varnish
Если Вы далеки от понятий SSH и Linux, попробуйте создать запрос к своим хостерам на инсталяцию Varnish. Я использовал этот мануал под FreeBSD www.varnish-cache.org/installation/freebsd. Все достаточно просто.
Шаг 4: Настраиваем Varnish
Это один из самых сложных пунктов по настройке всей системы:
1. Добавляем запуск varnish deamon и varnish log в конфигурационный файл /etc/rc.conf:
varnishd_enable=«YES»
varnishlog_enable=«YES»
2. Меняем дефолтные настройки под себя varnish deamon:
${varnishd_enable:="NO"}
${varnishd_pidfile:="/var/run/${name}.pid"}
${varnishd_listen:=":8081"}
${varnishd_admin:="localhost:8090"}
${varnishd_backend:="localhost:8080"}
${varnishd_config:="/usr/local/etc/varnish/default.vcl"}
${varnishd_storage:="file,/usr/local/varnish.cache,1G"}
${varnishd_hash:="classic,16383"}
${varnishd_user:="www"}
${varnishd_group:="www"}
Как уже упоминалось ранее, на моем сервере Nginx слушает 80 порт, а Apache 8080. Varnish же поставим на прослушку порта 8081, а перекидывать с него опять же будем на апач, тоесть 8080 порт.
Тут:
-varnishd_config — путь к дефолтному файлу настроек поведения Varnish
-varnishd_storage — размер и путь к файлу кеша
3. Настраиваем Varnish на работу с Pressflow:
backend default {
.host = "127.0.0.1";
.port = "8080";
.connect_timeout = 600s;
.first_byte_timeout = 600s;
.between_bytes_timeout = 600s;
}
sub vcl_recv {
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
// Remove has_js and Google Analytics cookies.
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+)=[^;]*", "");
// To users: if you have additional cookies being set by your system (e.g.
// from a javascript analytics file or similar) you will need to add VCL
// at this point to strip these cookies from the req object, otherwise
// Varnish will not cache the response. This is safe for cookies that your
// backed (Drupal) doesn't process.
//
// Again, the common example is an analytics or other Javascript add-on.
// You should do this here, before the other cookie stuff, or by adding
// to the regular-expression above.
// Remove a ";" prefix, if present.
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
// Remove empty cookies.
if (req.http.Cookie ~ "^\s*$") {
unset req.http.Cookie;
}
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
// Skip the Varnish cache for install, update, and cron
if (req.url ~ "install\.php|update\.php|cron\.php") {
return (pass);
}
// Normalize the Accept-Encoding header
// as per: varnish-cache.org/wiki/FAQ/Compression
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
# No point in compressing these
remove req.http.Accept-Encoding;
}
elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
}
else {
# Unknown or deflate algorithm
remove req.http.Accept-Encoding;
}
}
// Let's have a little grace
set req.grace = 30s;
return (lookup);
}
sub vcl_hash {
if (req.http.Cookie) {
set req.hash += req.http.Cookie;
}
}
// Strip any cookies before an image/js/css is inserted into cache.
sub vcl_fetch {
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
// This is for Varnish 2.0; replace obj with beresp if you're running
// Varnish 2.1 or later.
unset beresp.http.set-cookie;
}
}
sub vcl_error {
// Let's deliver a friendlier error page.
// You can customize this as you wish.
set obj.http.Content-Type = "text/html; charset=utf-8";
synthetic {"
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
"} obj.status " " obj.response {"
<стиль type="text/css">
#page {width: 400px; padding: 10px; margin: 20px auto; border: 1px solid black; background-color: #FFF;}
p {margin-left:20px;}
body {background-color: #DDD; margin: auto;}
</стиль>
<х1>Page Could Not Be Loaded</х1>
We're very sorry, but the page could not be loaded properly. This should be fixed very soon, and we apologize for any inconvenience.
<хр /> <х4>Debug Info:</х4>
<пре>
Status: "} obj.status {"
Response: "} obj.response {"
XID: "} req.xid {"
</пре>
<адресс><ссылка href="http://www.varnish-cache.org/">Varnish</ссылка></адресс>
"};
return (deliver);
}
3. Настраиваем Ngnix на работу с Varnish:
server {
listen 62.xxx.xx.xx:80;
server_name mysite.com www.mysite.com;
rewrite ^(/manager/.*)$>https://$host$1>permanent;
rewrite>^(/manager/.*)$>https://$host$1>permanent;
location ~* ^/(webstat/|awstats|webmail/|myadmin/|manimg/) {
proxy_pass 62.xxx.xx.xx:8080;
proxy_redirect mysite.com:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_pass 62.xxx.xx.xx:8081;
proxy_redirect mysite.com:8081/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
root /home/cross/data/www/mysite.com;
access_log /home/httpd-logs/mysite.com.access.log;
error_page 404 = @fallback;
}
location @fallback {
proxy_pass 62.xxx.xx.xx:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
Step 5: Перегружаем сервер
Теперь нужно убедиться, что Varnish запущен — попробуйте запустить комманду 'top' на терминале и проверьте, что процесс varnish запущен.
Убедитесь, что Varnish + Pressflow работают — запустите varnishlog комманду под SSH и попробуйте открыть свой сайт mysite.com, varnishlog после этого должен будет показать HTTP заголовки, это будет означать, что все работает отлично.
После всех этих настроек, я еще раз loadimpact`ом прогнал тест и получил:
Теперь ситуация значительно лучше, задержка от сервера стабильна и при повышении трафика не валит сервер.
Вот такие нехитрые настройки запустят Pressflow + Nginx + Varnish на Вашем сервер для ускорения Drupal.
Также походу дела обнаружилось, что у Nginx есть специальные настройки под Друпал — wiki.nginx.org/Drupal.
Дополнительные ссылки:
- www.varnish-cache.org/docs/2.1 — Varnish документация
- wiki.fourkitchens.com/display/PF/Documentation — Pressflow документация