Доброго времени уважаемые.
Хочу поделиться одним из способов настройки высокопроизводительного кэширующего прокси Varnish в связке с Nginx для Prestashop с поддержкой HTTPS. Конечно, в Prestashop имеется встроенная система кеширования, но мне ЗАХОТЕЛОСЬ поднять серверный кэш страниц именно на Varnish.
Проблема в том, что Varnish, в силу понятных причин, не поддерживает HTTPS кэширование.
Предлагаемый способ позволяет преодолеть данное ограничение.
«Varnish - ускоритель веб-приложений, также известный как обратный прокси-сервер HTTP кэширования.» - цитата из официальной документации. Желающие без труда смогут найти в сети подробное описание этого продукта.
https://www.varnish-cache.org/docs/4.1/reference/index.htmlКоротко, принцип его работы следующий: - сохранять в оперативной памяти HTML код страниц и выдавать его пользователю, не обращаясь к WEB серверу и обработчику PHP. Кэшированием нужно управлять и Varnish осуществляет этот процесс, согласно правилам конфигурационного файла. HTTPS шифрование делает процесс распознавания кэша невозможным и, поэтому, шифрование должно производиться Nginx на «выходе в мир», а Backend с PHP и Varnish должны работать только через HTTP. Но в этом случае, необходимо как минимум, переписывать все HTTP URL на HTTPS. Кроме того, PHP должно «знать», что обращение идёт по HTTPS…. Существует возможность осуществить изменения URL в Nginx, некоторые любители изящных решений используют LUA. Процесс творческий, предлагаю выкладывать свои решения, а я предложу своё.
Итак:
Prestashop 1.6
Реализация PHP: php-fpm, php 6.0
Сервер: Nginx -1.11
Varnish5
Предполагается уровень подготовки читателя, не требующий объяснения азов установки и настройки софта в *NIX системах.
Схема решения простая – полный HTTPS и «внутри» и «снаружи». Но ведь это противоречит поставленной задаче, делает её невыполнимой! На самом деле, это не так. Есть в Prestashop полезная опция– служебные IP адреса (Настройки\Обслуживание). Как известно, Prestashop позволяет HTTP соединения с этих адресов, несмотря на то, что весь остальной трафик идёт только через HTTPS. Нужно добавить 127.0.0.1 в список служебных адресов.
Принципиальная схема решения:
__________________NGINX____________________
| |
HTTPS BACKEND HTTPS FRONTEND <==HTTPS==> INET
127.0.0.1:8080 proxy_pass
http://127.0.0.1:80 |_____________| |_____________|
|_____<==>_____ |
VARNISH HTTP Таким образом, Varnish получает\обрабатывает запросы по HTTP с сохранением схемы HTTPS.
Varnish кеширует сгенерированные Бэкендом страницы, объём кеша - 256 Мб
Статика берётся Фронтэндом с диска, минуя Бэкенд и кешируется на стороне клиента.
Cookies проксируются Varnish «насквозь», не кэшируются.
HTML траффик зарегистрированных пользователей не кэшируется.
В заметке просто обсуждается идея HTTPS+VARNISH. А сложные схемы кэширования – отдельная, большая тема.
Настройка:
NGINX установлен с опциями:
DSO=on: Enable dynamic modules support
FILE_AIO=on: Enable file aio
HTTP=on: Enable HTTP module
HTTP_ADDITION=on: Enable http_addition module
HTTP_AUTH_REQ=on: Enable http_auth_request module
HTTP_CACHE=on: Enable http_cache module
HTTP_DAV=on: Enable http_webdav module
HTTP_FLV=on: Enable http_flv module
HTTP_GZIP_STATIC=on: Enable http_gzip_static module
HTTP_GUNZIP_FILTER=on: Enable http_gunzip_filter module
HTTP_MP4=on: Enable http_mp4 module
HTTP_PERL=on: Enable http_perl module
HTTP_RANDOM_INDEX=on: Enable http_random_index module
HTTP_REALIP=on: Enable http_realip module
HTTP_REWRITE=on: Enable http_rewrite module
HTTP_SECURE_LINK=on: Enable http_secure_link module
HTTP_SLICE=on: Enable http_slice module
HTTP_SSL=on: Enable http_ssl module
HTTP_STATUS=on: Enable http_stub_status module
HTTP_SUB=on: Enable http_sub module
MAIL=on: Enable IMAP4/POP3/SMTP proxy module
MAIL_SSL=on: Enable mail_ssl module
HTTPV2=on: Enable HTTP/2 protocol support (SSL req.)
STREAM=on: Enable stream module
STREAM_SSL=on: Enable stream_ssl module (SSL req.)
STREAM_SSL_PREREAD=on: Enable stream_ssl_preread module (SSL req.)
THREADS=on: Enable threads support
WWW=on: Enable html sample files
LUA=on: 3rd party lua module
Схема конфига Nginx. Почему не весь конфиг? ….. весь выкладывать нельзя.
Для понимания идеи заметки – более чем достаточно.
Опции расписывать не буду – кому нужно, смотрите справочник.
http://nginx.org/ru/docsnginx.conf
user польз-ль, от имени которого работает сервис;
worker_processes auto;
worker_rlimit_nofile 40000;
error_log ./error.log;
pid ./nginx.pid;
events {
worker_connections 1024;
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log ./access.log main;
server_tokens off;
#HTTP to HTTPS – слушаем 80-й порт и перенаправляем на 443 HTTPS
server {
listen X.X.X.X:80;
server_name mydomain.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
# HTTPS Frontend
server {
server_name mydomain.com;
listen x.x.x.x.:443 ssl ;
access_log ./access2.log main;
#SSL параметры A+
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_certificate ./cert.pem;
ssl_certificate_key ./key.pem;
ssl_stapling on;
ssl_dhparam ./dhparam.pem;
ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https:
# Strict-Transport-Security
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
#Компрессия
gzip on;
gzip_min_length 1024;
gzip_buffers 40 8k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
gzip_disable "msie6";
gzip_proxied expired no-cache no-store private auth;
####################Опции проксирования VARNISH #####################################
location / {
proxy_pass http://127.0.0.1:80; # Запросы к VARNISH
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header X-Forwarded-Ssl on;
}
# Статические данные
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js|woff|woff2|ttf|zip)$ {
root Корень сайта;
proxy_ignore_headers Cache-Control Expires;
add_header Cache-Control public;
expires max;
access_log off;
}
}
# BackEnd
server {
listen 127.0.0.1:8080; # Канал от VARNISH
listen х.х.х.х.:443 ssl;
server_name mydomain.com;
root Корень сайта;
index index.php index.html index.htm;
# Достаточно сертификата и ключа
ssl_certificate ./cert.pem;
ssl_certificate_key ./key.pem;
# Ниже локэйшены бэкенда
…..
}
Пример дл. Престашоп - можно использовать, как бэкенд
https://gist.github.com/julienbourdeau/79961e9caa4263e9e34d2d056948d335VARNISH 5 – устанавливается без опций.
Пользователь varnish должен быть членом той же группы, что и Nginx
Пермиссии:
Каталог с конфигом пользователь varnish - чтение\запись\ выполнение
Файл конфига - для п-теля varnish только чтение
Рабочий пример конфига:
https://github.com/CleverCloud/varnish-examples/blob/master/prestashop.vclСвой не привожу, поскольку использую его как дополнительный фаервол.
Проверка конфига varnishd -C -f путь/default.vcl
Перезапуск конфига, без рестарта, с сохранением кеша
varnishd reload
Параметры запуска: Адрес – петля, объём кэша 256М и путь до конфига
varnishd_flags="-a 127.0.0.1:80 -s malloc,256m -f путь/default.vcl"
Статистика varnishstat
varnishstat -1
Консоль управленияvarnishadm
Контроль работы кэша:1. varnishstat
2. HTTP заголовки
X-Varnish-Cache HIT
Age - возраст кэша страницы. Если не ноль - выдано из кэша.
Имейте в виду, что первая проверка покажет отсутствие кэша, страницы должны сначала закэшироваться.
-----------------------------------------
Документация по varnish:https://www.varnish-cache.org/docs/4.1/reference/index.htmlНичего нового, наверняка подобные решения уже не раз обсуждались где-то. Но надеюсь, заметка будет кому-то полезной.
Конструктивная критика приветствуется!