XenForo - nginx кэширование

Скачать XenForo - nginx кэширование
Недавно искали:

Itnull

Команда форума
Администратор
Регистрация
22.05.13
Сообщения
25.593
Реакции
9.520
Веб-сайт
itnull.me
  • Автор темы
  • Администратор
  • Модер.
  • Команда форума
  • #1

1c940e7179c34223af540d8bb363b7e3.png

Подготовка VPS​


В качестве операционной системы была выбрана CentOS 7.3 просто потому, что администратору rpm-based OSes ближе, чем deb-based :)

VPS располагает 25Gb дискового пространства, 4Gb RAM, а команда:

# cat /proc/cpuinfo | grep processor | wc -l

показывает число 8.

Сначала удаляем все ненужные пакеты, такие как Samba, httpd, и все, что посчитаете ненужным. Затем устанавливаем все доступные апдейты из официального репозитория с помощью:

# yum update

Далее нужно подключить все необходимые third-party репозитории и установить нужные нам компоненты. Первым устанавливаем сервер баз данных Percona. Подключаем репозиторий и устанавливаем необходимые пакеты:

# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
# yum install Percona-Server-server-57

Здесь тонкость в том, что во время установки генерируется временный админский пароль, который нужно найти с помощью команды:

# grep 'temporary password' /var/log/mysqld.log

Он нам потребуется для дальнейшей security настройки Percona Server командой:

# /usr/bin/mysql_secure_installation

После этого вы получите постоянный пароль для вашего сервера баз данных.

Далее устанавливаем репозиторий nginx и сам пакет nginx:

# yum install epel-release # yum install nginx

После этого устанавливаем свежайшую версию PHP со всеми необходимыми компонентами:

Код:
# cd /tmp
# curl 'https://setup.ius.io/' -o setup-ius.sh
# bash setup-ius.sh
# yum install php71u-fpm-nginx php71u-cli php71u-mysqlnd php71u-pecl-memcached php71u-opcache php71u-gd memcached

Включаем все нужные сервисы с помощью

Код:
# systemctl enable nginx
# systemctl enable memcached
# systemctl enable mysql
# systemctl enable php-fpm

чтобы после перезагрузки сервера, все они запускались автоматически. На этом подготовку заканчиваем и приступаем к самому сложному — настройке всего этого хозяйства для оптимальной работы нашего XenForo форума.


Настройка сервисов​


В этом разделе не следует принимать все, как истину в последней инстанции. Опытные администраторы могут указать гораздо более лучшие тонкие настройки. Неопытным предлагаются некие общие рекомендации, которые они могут использовать один в один, как реально работающую конфигурацию, либо использовать их, как шаблон для собственной индивидуальной конфигурации.

Итак, для начала в файле /etc/php.ini установим значение параметра cgi.fix_pathinfo=0. Затем идем в файл /etc/php-fpm.d/www.conf, комментируем строчку listen = 127.0.0.1:9000 и раскомментируем listen = /run/php-fpm/www.sock. Дополнительно включаем listen.acl_users = nginx. Должно быть что-то вроде:

Код:
;listen = 127.0.0.1:9000
listen = /run/php-fpm/www.sock
listen.acl_users = nginx

В файле /etc/nginx/conf.d/php-fpm.conf тоже включаем работу через сокет:

Код:
#server 127.0.0.1:9000;
server unix:/run/php-fpm/www.sock;

Перезапускаем php-fpm:

# systemctl restart php-fpm

Сервис memcached по соображениям безопасности привязываем только к адресу 127.0.0.1:

# cat /etc/sysconfig/memcached
Код:
PORT="11211"
USER="memcached"
MAXCONN="2048"
CACHESIZE="1024"
OPTIONS="-l 127.0.0.1"

Запускаем его с помощью:

# systemctl start memcached

убеждаемся, что порт 11211 открылся для соединений и настраиваем в конфиге XenForo его использование для кэширования backend-а в соответствии с официальной документацией XenForo. Но тут есть тонкость, вместо строчки:

$config['cache']['backend'] = 'Memcached';

у меня заработала строчка:

$config['cache']['backend']='Libmemcached';

Percona Server можно попробовать оптимизировать с помощью их визарда, либо известным скриптом mysqltuner.pl Все на ваше усмотрение и в соответствии с ресурсами вашего железа.

Имейте только в виду, что конфигурационный файл находится в /etc/percona-server.conf.d/mysqld.cnf

Самая сложная часть в этой истории — конфигурация nginx. В основных настройках ничего особенного. Только правильно выставите значения worker_processes (количество процессоров определяется командой cat /proc/cpuinfo | grep processor | wc -l) и worker_connections (worker_processes * 1024):

NGINX:
user nginx;
worker_processes 8;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 8192;
    use epoll;
    multi_accept on;
}

Дальше идет блок httpd. Тут тоже особенных тонкостей нет, за исключением одной, весьма важной. Дело в том, что у нас используется кэширование FastCGI, и для этого потребуются дополнительные настройки. Это кэширование требует включения двух блоков конфигурации в разных блоках nginx.conf. Для начала, как все выглядит в блоке httpd:
NGINX:
http {

    access_log  off;
    server_tokens off;
    charset utf-8;
    reset_timedout_connection on;
    send_timeout 15;
    client_max_body_size 5m;
    client_header_buffer_size    1k;
    client_header_timeout 15;
    client_body_timeout 30;
    large_client_header_buffers  2 1k;
    open_file_cache max=2000 inactive=20s;
    open_file_cache_min_uses 5;
    open_file_cache_valid 30s;
    open_file_cache_errors off;
    output_buffers      1 32k;
    postpone_output     1460;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    keepalive_requests  100000;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    ### FastCGI Cache ################
    map $http_cookie $nocachecookie {
     default                   0;
    ~xf_fbUid                  1;
    ~xf_user                   1;
    ~xf_logged_in              1;
}

    map $request_uri $nocacheuri {
       default              0;
    ~^/register             1;
    ~^/login                1;
    ~^/validate-field       1;
    ~^/captcha              1;
    ~^/lost-password        1;
    ~^/two-step             1;
}

fastcgi_cache_path              /tmp/nginx_fastcgi_cache levels=1:2 keys_zone=fastcgicache:200m inactive=30m;
fastcgi_cache_key               $scheme$request_method$host$request_uri;
fastcgi_cache_lock              on;
fastcgi_cache_use_stale         error timeout invalid_header updating http_500;
fastcgi_ignore_headers          Cache-Control Expires Set-Cookie;
### FastCGI Cache ################

Дальше мы еще вернемся к особенностям включения FastCGI кэширования в другом блоке, а пока посмотрим на следующий блок, server:

Код:
server {
    listen  80 reuseport;
    server_name  domain.com;
    return 301 https://domain.com$request_uri;
}
server {
    listen 443 ssl reuseport http2;
    server_name  domain.com;
    root  /var/www/html;
    ssl_certificate "/etc/nginx/ssls/ssl-bundle.crt";
    ssl_certificate_key "/etc/nginx/ssls/domain_com.key";
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_ciphers "EECDH:+AES256:-3DES:RSA+AES:RSA+3DES:!NULL:!RC4";
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 77.88.8.8 valid=300s;
    resolver_timeout 5s;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header Strict-Transport-Security max-age=31536000;



Здесь важно конфигурирование SSL сертификата. В нашем случае используется сертификат от Comodo. Инструкцию по его подключению можно найти на их сайте, а для генерации /etc/ssl/certs/dhparam.pem используем команду:

# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Последующую проверку правильности настройки SSL сертификата можно сделать тут.

И, наконец, последние важные блоки конфига nginx:

Код:
location / {
  index  index.php index.html;
  try_files $uri /index.php?$uri&$args;
  }

location ~ /(internal_data|library) {
         internal;
    }

location ~ /wp-content/ { return 444; }
location ~ /wp-includes/ { return 444; }

# define error page
error_page 404 = @notfound;

# error page location redirect 301
location @notfound {
    return 301 /;
}

error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }

location ~ \.php$ {
    fastcgi_max_temp_file_size 1M;
    fastcgi_cache_use_stale updating;
    fastcgi_pass_header Set-Cookie;
    fastcgi_pass_header Cookie;
    fastcgi_pass  unix:/run/php-fpm/www.sock;
    fastcgi_index index.php;
    fastcgi_intercept_errors on;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 256 16k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
    proxy_buffer_size 8k;
    include fastcgi_params;

    ### fastcgi_cache ###
    fastcgi_cache           fastcgicache;
    fastcgi_cache_bypass    $nocachecookie $nocacheuri;
    fastcgi_no_cache        $nocachecookie $nocacheuri;
    fastcgi_cache_valid     200 202 302 404 403 5m;
    fastcgi_cache_valid     301 1h;
    fastcgi_cache_valid     any 1m;
    add_header X-Cache      $upstream_cache_status;
    ### fastcgi_cache end ###

        }

    gzip                   on;
    gzip_http_version      1.1;
    gzip_vary              on;
    gzip_min_length        1100;
    gzip_buffers           64 8k;
    gzip_comp_level        6;
    gzip_proxied           any;
    gzip_types             image/png image/gif image/svg+xml image/jpeg image/jpg text/xml text/javascript text/plain text/css application/json application/javascript application/x-javascript application/vnd.ms-fontobject
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";


location ~* \.(ico|css|js|gif|jpeg|jpg|png|woff|ttf|svg)$ {
    add_header "Access-Control-Allow-Origin" "*";
    root /var/www/html;
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

}

}


Здесь очень важны параметры location для корректной работы ссылок ЧПУ, скриптов PHP и закрытия доступа к важным внутренним директориям internal_data и library. Кроме того, здесь включается gzip компрессия и кэширование статический медиа файлов. Ну и вторая часть настройки FastCGI кэширования.

Собственно сам переезд контента форума состоял в переносе дампа базы данных и tar.gz архива содержимого форумного root directory и разворачивании их на новом сервере.


Дополнительная информация о кэшировании в nginx​


В начале, я попытался использовать nginx microcaching. Для начала создал директорию для хранения кэша:

# mkdir /var/cache/nginx2

Создал файл /etc/nginx/conf.d/microcache.conf с содержимым:

Код:
fastcgi_cache_path /var/cache/nginx2 levels=1:2 keys_zone=microcache:5m max_size=1000m;
map $http_cookie $cache_uid {
  default nil; # hommage to Lisp
  ~SESS[[:alnum:]]+=(?<session_id>[[:alnum:]]+) $session_id;
}
map $request_method $no_cache {
  default 1;
  HEAD 0;
  GET 0;
}

и в конфиге nginx для php location сделал так:

Код:
location ~ \.php$ {
  fastcgi_cache microcache;
  fastcgi_cache_key $server_name|$request_uri;
  fastcgi_cache_valid 404 30m;
  fastcgi_cache_valid 200 10s;

В принципе, все заработало отлично, форум стал работать очень быстро, за исключением одной проблемы — стали странно работать сессии зарегистрированных и залогиненых пользователей. Внезапно вы обнаруживали, что вы разлогинены и нужно было логинится опять.

Оказалось, что проблема лежит в глубинах движка XenForo и решается установкой плагина Logged In Cookie и правкой темплейтов XenForo helper_login_form и login_bar_form заменой строки:

<label class="rememberPassword"><input type="checkbox" name="remember" value="1" id="ctrl_pageLogin_remember" tabindex="3" /> {xen:phrase stay_logged_in}</label>

на строку:

<input type="hidden" name="remember" checked="checked" value="1" />

Но все это я узнал позже, когда настроил описанное выше FastCGI кэширование, с которым теперь все работает отлично. Поэтому, я думаю, проблема с сессиями решилась бы и для nginx microcaching, но я не проверял. Вы можете попробовать этот вариант кэширования.
 
Последнее редактирование:
это все очень круто) немного устарело по версиям, но общий подход ясен.
я бы порекомендовал включать opcache для php. он дает именно оптимизацию и кеш по скриптам php уже переведенным в машинный код, т.е. серверу не нужно постоянно компилировать исходники
 
Назад
Сверху Снизу