Вход

Ускоряем работу сайта на PHP 7.0 с помощью PHP-FPM, Memcached и Varnish для DLE

Пошаговая инструкция для установки и настройки PHP-FPM, Memcached и Varnish на Ubuntu 16.04 с VestaCP.

Перед началом выполнения инструкции рекомендуется сделать бекап сайта. Я же делал все это на рабочем сервере без бекапа, на своем блоге. Все прошло успешно и без всяких усилий.
Автор: PunPun https://punpun.name/

PHP-FPM нужен для установки Memcached на PHP 7.0, Memcached в свою же сторону позволит кешировать данные DLE и ускорить работу сайта. Varnish - это гибкое решение для кэширования страниц на уровне Web сервера. Memcached и Varnish оба являются кэширующими средствами и никак не влияют между собой, потому что Varnish находится на front стороне веб сервера и работает как обратный http прокси который кэширует.

1. Начнем с установки PHP-FPM для Ubuntu 16.04
Установим пакеты для работы с PPA (Personal Package Archive (PPA) это такой репозиторий, в котором сторонние разработчики собирают пакеты для Debian и Ubuntu не по официальным каналам.)
Выполним команду
apt-get install software-properties-common python-software-properties
Далее добавим репозиторий в нашу систему
add-apt-repository ppa:ondrej/php
И обновим индекс пакетов
apt-get update
После выполнения команды приступим к установке PHP-FPM для PHP 7.0
apt-get install php7.0-fpm
apt-get install php7.0-mysql
После этого переходим в раздел
cd /home/admin/conf/web
И открываем файл nginx.conf или snginx.conf (если у вас установлен SSL сертификат) и перед строкой
location / {
Вставляем
root /home/admin/web/ВАШ ДОМЕН/public_html;
index index.php;
Если у вас установлен SSL и вы переносили сайт в папку public_shtml то укажите ее. Далее перед строкой
location /error/ {
Вставить нужно
location ~ \.php$ {
	try_files $uri =404;
	fastcgi_split_path_info ^(.+\.php)(/.+)$;
	fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
	fastcgi_index index.php;
	fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
	include fastcgi_params;
}
Сохраняем файл и перезапускаем nginx
service nginx restart
Если все прошло удачно то никаких ошибок не будет.

2. Далее установим Memcached
Выполним команды
apt-get install php-memcached
И
apt-get install memcached
После чего перезапустим php-fpm
service php7.0-fpm restart


3. Устанавливаем и настраиваем Varnish для DLE
Выполним команду для его установки
apt-get install varnish
После установки останавливаем его
service varnish stop
Далее открываем файл
/etc/default/varnish
И в строке
DAEMON_OPTS="-a :6081 \
Меняем порт на 80, получится
DAEMON_OPTS="-a :80 \
Сохраняем файл и открываем следующий
/etc/varnish/default.vcl
И меняем весь на следующий
vcl 4.0;

backend default {
	.host = "IP сервера";
	.port = "80";
}

acl purge {
    "localhost";
	"ДОМЕН";
    "IP сервера";
}

# Получение запроса от клиента
sub vcl_recv {
    # Разрешить очистку кэша вышеописанному диапазону
    if (req.method == "PURGE") {
        # Если запрос не из списка, то разворачивать
        if (!client.ip ~ purge) {
            return(synth(405, "This IP is not allowed to send PURGE requests."));
        }
        return (purge);
    }

    # POST-запросы а также страницы с Basic-авторизацией пропускать
    if (req.http.Authorization || req.method == "POST") {
        return (pass);
    }

	# Пропускать админку
    if (req.url ~ "НАЗВАНИЕ ФАЙЛА АДМИН ПАНЕЛИ БЕЗ ОКОНЧАНИЯ PHP") {
        return (pass);
    }
	
    # Пропускать sitemap и файл robots
    if (req.url ~ "sitemap" || req.url ~ "robots") {
        return (pass);
    }

    # Удаляем cookies, содержащие "has_js" и "__*", добавляемые CloudFlare и Google Analytics, так как Varnish не будет кэшировать запросы, для которых установлены cookies.
    set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)([a-z]+|has_js)=[^;]*", "");

    # Удаление префикса ";" в cookies, если вдруг будет обнаружен
    set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");

    # Удаляем cookie, состоящие только из пробелов (или вообще пустые)
    if (req.http.cookie ~ "^ *$") {
		unset req.http.cookie;
    }

    # Для статических документов удаляем все cookies, пусть себе кэшируются 
    if (req.url ~ "\.(css|js|png|gif|jp(e)?g|swf|ico|woff|svg|htm|html)") {
        unset req.http.cookie;
    }

    # Если установлены cookies "dle_" пропускаем напрямую к бэкенду
    if (req.http.Cookie ~ "dle_") {
        return (pass);
    }

    # Если cookie не найдено, удаляем данный параметр из пришедшего запроса как таковой
    if (!req.http.cookie) {
        unset req.http.cookie;
    }

    # Не кэшировать запросы с установленными cookies
    if (req.http.Authorization || req.http.Cookie) {
        return (pass);
    }

    # Кэшировать всё остальное
    return (hash);
}

sub vcl_pass {
    return (fetch);
}

sub vcl_hash {
    hash_data(req.url);

    return (lookup);
}

# Приём ответа от бэкенда
sub vcl_backend_response {
    # Удаляем ненужные заголовки
    unset beresp.http.Server;
    unset beresp.http.X-Powered-By;

    # Не хранить в кэше robots и sitemap
    if (bereq.url ~ "sitemap" || bereq.url ~ "robots") {
        set beresp.uncacheable = true;
        set beresp.ttl = 30s;
        return (deliver);
    }

    # Для статических файлов, которые отдаёт бэкенд...
    if (bereq.url ~ "\.(css|js|png|gif|jp(e?)g)|swf|ico|woff|svg|htm|html") {
        # Удаляем все куки 
        unset beresp.http.cookie;
        # Устанавливаем срок хранения в кэше - неделю
        set beresp.ttl = 7d;
        # Устанавливаем заголовки Cache-Control и Expires, сообщая браузеру о том, что эти файлы стоит сохранить в кэше клиента и не нагружать лишниий раз наш сервер
        unset beresp.http.Cache-Control;
        set beresp.http.Cache-Control = "public, max-age=604800";
        set beresp.http.Expires = now + beresp.ttl;
    }

	# Не кэшировать админку
    if (bereq.url ~ "НАЗВАНИЕ ФАЙЛА АДМИН ПАНЕЛИ БЕЗ ОКОНЧАНИЯ PHP") {
        set beresp.uncacheable = true;
        set beresp.ttl = 30s;
        return (deliver);
    }
	
    # Не кэшировать результат ответа на POST-запрос или Basic авторизации
    if ( bereq.method == "POST" || bereq.http.Authorization ) {
        set beresp.uncacheable = true;
        set beresp.ttl = 120s;
        return (deliver);
    }

    # Не кэшировать страницы ошибок, только нужные вещи в кэше!
    if ( beresp.status != 200 ) {
        set beresp.uncacheable = true;
        set beresp.ttl = 120s;
        return (deliver);
    }

    # Хранить в кэше всё прочее на протяжении одного дня
    set beresp.ttl = 1d;
    # Срок жизни кэша после истечения его TTL
    set beresp.grace = 30s;

    return (deliver);
}

# Действия перед отдачей результата пользователю
sub vcl_deliver {
    # Удаляем ненужные заголовки
    unset resp.http.X-Powered-By;
    unset resp.http.Server;
    unset resp.http.Via;
    unset resp.http.X-Varnish;

    return (deliver);
}

В этом коде заменить
IP сервера (2 раза) - на свой. Пример 85.143.223.176
ДОМЕН заменить на свой. Пример какой должен быть punpun.name (без всяких слешей, http, https, www и т.п)
НАЗВАНИЕ ФАЙЛА АДМИН ПАНЕЛИ БЕЗ ОКОНЧАНИЯ PHP (2 раза) на название админ панели, если у вас к примеру файл админ панели называется по стандарту то вписать admin (не нужно указывать .php)

Сохраняем файл и после этого выполняем команду запуска
service varnish start
Если все прошло хорошо и вы не допустили ошибки то после выполнения команды
varnishstat
Увидите такую картину (примерно)
Ускоряем работу сайта на PHP 7.0 с помощью PHP-FPM, Memcached и Varnish для DLE


На этом все.
Собрано 50 рублей Поддержать автора

Войдите на сайт


Данное дополнение сделано на энтузиазме для пользователей. Вы можете помочь автору материально сделав вклад в развитие, создание и поддержку других бесплатных дополнений. Любая помощь это добрый шаг с вашей стороны, вы становитесь одним из спонсоров раздела и непосредственным образом влияете на его дальнейшее развитие.
10
4 445
Добавлено: 16 ноябрь 2017 в 06:02:38
Прокомментировать
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent

Комментарии (10)

  1. morefilms
    morefilms Клиенты 24 апреля 2018 23:25
    2
    Было бы круто увидеть подробную пошаговую инструкцию и для CentOS
  2. Yuki
    Yuki Клиенты 24 апреля 2018 13:46
    0
    А что писать в "IP сервера", если сайт на трёх IP адресах расположен? И как это написать?
  3. Samales
    Samales Клиенты 9 апреля 2018 18:23
    0
    Попробовал данный метод. Работает действительно намного быстрее, но проблемы с админкой. Не могу зайти, мол часто логинился неправильно. В остальном всё хорошо
  4. Oooops
    Oooops Клиенты 24 ноября 2017 17:57
    0
    Вопрос ? Тут :
    root /home/admin/web/ВАШ ДОМЕН/public_html;
    index index.php

    В конце index index.php , надо ставить ;
    1. PunPun
      PunPun Разработчик 25 ноября 2017 11:15
      0
      Нужно, спасибо поправил.
  5. zemekis
    zemekis Клиенты 22 ноября 2017 16:53
    0
    Супер, спасибо. давно собирался.
  6. FR13NDS
    FR13NDS Гости 21 ноября 2017 03:06
    0
    А работает в связке это всё намного шустрее чем просто установленные memcashed?
    1. PunPun
      PunPun Разработчик 21 ноября 2017 05:17
      0
      Намного быстрее.
      1. FR13NDS
        FR13NDS Гости 23 ноября 2017 06:45
        0
        А такое кэширование через Vesta CP разве чем то хуже? http://joxi.ru/82QZzZNIjJZx0A
        Мануал - https://goo.gl/S1M1Ro
        1. PunPun
          PunPun Разработчик 23 ноября 2017 09:05
          0
          Не использовал кэширование через nginx. Нет, не плохо. nginx хорошо кеширует, просто я решил попробовать то что мало используется а это Varnish.
© PunPun. 2018. При копировании, ссылка на источник обязательна.
Дизайн и верстка: Webrambo