Verification: a143cc29221c9be0

Opcache php 7 как включить apache

Opcache php 7 как включить apache

Первоначальные настройки Centos 7

Обновляем ОС

yum update

Подключаем репозиторий EPEL

yum install epel-release

Список подключенных репозиториев можем посмотреть командой:

yum repolist

Для наблюдения за загрузкой и производительностью сервера устанавливаем ATOP (вызывается командой atop):

yum install atop

Установка Apache на Centos 7

Apache у нас будет использоваться для отдачи динамического содержимого, непосредственно с клиентом будет общаться nginx.

Установка apache из репозитория:

yum install httpd

В файле конфигурации httpd.conf, который находится по пути /etc/nginx, меняем порт на 8080

Listen 8080

Запускаем сервис и настраиваем его для автозапуска

systemctl start httpd 
systemctl enable httpd

Установка PHP 5.6 с оптимизацией opcache

Устанавливаем PHP 5.6 c opcache и модулем для работы с mysqlnd

rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install -y php56w php56w-opcache php56w-mysqlnd

Для проверки работы Apache и php временно открываем порт 8080 для внешних подключений (после перезагрузки он будет снова закрыт). В Centos 7 вместо привычной всем IPtables установлена более современная служба файрвола Firewalld.

firewall-cmd --add-port=8080/tcp

В папке /var/www/html создаем файл phpinfo.php со следующим содержимым.

Заходим на сервер из любого браузера по нашему IP адресу с указанием порта 8080 — http://IP-сервера:8080/phpinfo.php . Мы должны увидеть информацию о php, apache и установленных модулях.

Установка MySQL (MariaDB) на Centos 7

MariaDB является полностью совместимым и более производительным аналогом MySQL, поэтому я на своих серверах устанавливаю именно ее и проблем пока не встречал.

yum -y install mariadb-server
systemctl start mariadb 
systemctl enable mariadb

Для настройки безопасности MySQL запускаем соответствующий скрипт

mysql_secure_installation

В процессе выполнения скрипта Вам будет задано несколько простых вопросов и будут сделаны основные настройки безопасности.

Установка nginx на Centos 7

Устанавливаем nginx

yum install nginx

Дописываем в конфигурационный файл /etc/nginx/nginx.conf в секции location следующие строки

location / {
            proxy_pass      http://127.0.0.1:8080/;
            proxy_redirect    off;
            proxy_set_header  Host $host;
            proxy_set_header  X-Real-IP $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 10m;
            proxy_connect_timeout 90;
        }

Запускаем nginx и настраиваем его автозапуск

systemctl start nginx
systemctl enable nginx

Теперь нам необходимо на файрволе открыть 80 порт (http), чтобы наш сервер стал доступен снаружи.

firewall-cmd --add-service=http --permanent

Ключ —permanent указывает на то, что порт открывается на постоянной основе и после перезагрузки останется открытым.

Перезагружаем сервер

reboot

Пробуем в браузере набрать IP адрес нашего сервера, мы должны увидеть страницу «nginx error!». Значит nginx установлен и работает!

Настройка SELinux

В Centos 7 много сделано для повышения безопасности, однако это иногда добавляет головной боли. В частности, в Centos 7 по умолчанию включен SELinux. Скорее всего сервер будет работать как-то не так и в файле /var/log/nginx/error.log выдавать ошибку:

2015/10/20 14:44:16 [crit] 11593#0: *20 connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream, client: X.X.X.X, server: msadmin.ru, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "msadmin.ru"

Для простоты SELinux можно просто отключить. Для этого находим файл /etc/sysconfig/selinux, исправляем в нем соответствующую строчку на SELINUX=disabled и перезагружаемся.

Но поступать таким варварским способом я считаю неправильно. Лучше не нарушать безопасность и использовать политики SELinux для nginx:

yum install policycoreutils-python
cat /var/log/audit/audit.log|grep nginx | grep denied | tail -n 1 |audit2allow -M mynginx
semodule -i mynginx.pp

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

Настройка сервера apache+nginx для обслуживания веб домена

Настройки нашего сервера для обслуживания веб домена состоит из двух простых шагов:

  • написание конфигурационного фала apache для домена
  • написание конфигурационного фала nginx для домена

Предположим нам необходимо сделать, чтобы сервер обслуживал домен msadmin.ru. В папке /etc/httpd/conf.d создаем файл msadmin.ru.conf со следующим содержимым:

    ServerName msadmin.ru
    DirectoryIndex index.php
    DocumentRoot /var/www/msadmin.ru
    ServerAdmin webmaster@hotdem.ru
    ServerAlias www.msadmin.ru
    CustomLog /var/log/httpd/msadmin.access.log combined
    ErrorLog /var/log/httpd/msadmin.error.log


    AllowOverride All
    Options +Includes

В папке /etc/nginx/conf.d создаем файл с таким же именем msadmin.ru.conf со следующим содержимым:

server {
#  listen msadmin.ru:80;
    listen 80;
    server_name msadmin.ru;
# Ведём журнал доступа:
access_log  /var/log/nginx/msadmin.ru_access.log;

# Разделяем статику и динамку, статику храним в кэше 10 дней:
    location ~* \.(jpg|jpeg|png|ico|css|bmp|swf|doc|docx|pdf|xls|xlsx|rar|zip|tbz|7z|exe)$ {
    root /var/www/msadmin.ru/;
    expires 10d;
    }

location / {
    proxy_pass         http://127.0.0.1:8080/;
    proxy_redirect     off;
    log_not_found      off;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   Host $http_host;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Создаем папку /var/www/msadmin.ru и располагаем в ней файлы нашего сайта. После создания или внесения изменений в конфигурационных файлах необходимо перезапустить сервисы.

service httpd restart
service nginx restart

Поздравляем, настройка сервера завершена!

Кэширование PHP

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

  • Кэширование готовых страниц - страница генерируется php, а потом пользователю отдается готовая страница без обращения к php. Я расскажу как это сделать через fastcgi, но не рекомендую применять такой метод для wordpress или других движков, их лучше кэшировать с помощью специальных плагинов;
  • Кэширование байт кода и инструкций - а это уже интересно, кэшируется не вся страница, а только некоторые инструкции, и куски байт кода, которые не изменяются при вызовах скрипта. Перед тем как выполнять скрипт, интерпретатор должен преобразовать его в понятный для него формат, при кэшировании такое преобразование выполняется только первый запуск, а дальше берется версия из кэша;
  • Кэширование сессий - по умолчанию php сохраняет сессии пользователей в файлы и мы можем немного ускорить его работу, если будем сохранять сессии в оперативную память.

Дальше рассмотрим более подробно, как настроить каждый вид кэширования для вашего сервера. Начнем с кэширования opcode php.

Кэширования байткода в PHP

Начиная с PHP 5.5 в интерпретатор языка была добавлена поддержка кэширования байткода из ZendFramework. В новых версиях этот кэш позволяет очень сильно увеличить производительность вашего ресурса, например, есть сведения, что на PHP 7 Wordpres и другие движки работают чуть ли не в два раза быстрее. Перед тем как настраивать кєширование opcode php, нужно установить его пакет:

sudo apt install php-opcache

Или для Red Hat дистрибутивов:

sudo yum install php-opcache

Затем, чтобы включить кэширование нужно добавить несколько строк в php.ini, можно также создать отдельный файл в /etc/php/conf.d/

vi /etc/php.d/opcache.ini

zend_extension=opcache.so;
opcache.error_log=/var/log/php-fpm/opcache-error.log
opcache.enable=1;
opcache.memory_consumption=256;
opcache.interned_strings_buffer=8;
opcache.max_accelerated_files=4000;
opcache.revalidate_freq=180;
opcache.fast_shutdown=0;
opcache.enable_cli=0;
opcache.revalidate_path=0;
opcache.validate_timestamps=2;
opcache.max_file_size=0;
opcache.file_cache= /var/www/losst.ru/opcache;

Рассмотрим что означают эти строки, чтобы вы знали какие значения установить. Первая строка загружает расширение, здесь ничего менять не нужно.

  • opcache.error_log - указывает файл для записи лога ошибок, будет полезно при отладке;
  • opcache.log_verbosity_level - указывает насколько подробным должен быть лог файл, значение от 1 до 4;
  • opcache.enable - включает кэширование;
  • opcache.enable_cli - включает кэширование страниц php для консольной версии;
  • opcache.memory_consumption - количество оперативной памяти для хранения кэша;
  • opcache.max_accelerated_files - число скриптов/файлов, которые нужно кэшировать;
  • opcache.validate_timestamps - проверять время изменения данных в файле скрипта;
  • opcache.revalidate_freq - частота проверки для предыдущего параметра;
  • opcache.revalidate_path - установите в 0 чтобы выполнять проверку при include только первый раз;
  • opcache.enable_file_override - кэширует запросы к атрибутам файлов, например, существование и т д;
  • opcache.blacklist_filename - список файлов, которые не нужно кэшировать;
  • opcache.max_file_size - максимальный размер файла скрипта для кэширования, 0 - не ограниченно;
  • opcache.interned_strings_buffer - допустимое количество строк в буфере;
  • opcache.fast_shutdown - использовать быстрый способ освобождения памяти.

После сохранения всех настроек вам останется только перезапустить php или ваш веб-сервер:

systemctl restart php-fpm

Для того чтобы убедиться, что все работает вы можете захотеть посмотреть какие скрипты уже закэшированы. Для этого можно использовать скрипт opcache-status. Просто сохраните скрипт в директорию веб-сервера, а затем дайте ему права:

chmod 777 /var/www/losst.ru/opcode.php

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

http://localhost/opcache.php

Здесь можно видеть подробную статистику по кєширвоанию, настройки и количество занятой памяти.

Хранение сессий в memcached

По умолчанию php хранит сессии в файловой системе, в некоторых случаях, вы можете достаточно сильно ускорить работу php, если перенесете хранение сессий из файлов в оперативную память, например, memcached. Сначала нужно установить memcached и php библиотеку для работы с ней:

sudo apt install memcached php-memcached

Или для систем на базе Red Hat:

sudo yum install memcached php-memcached

Сначала нам нужно настроить memcached, откройте файл /etc/sysconfig/memcached и найдите строку CACHESIZE, здесь нужно указать объем оперативной памяти, которая выделяется под кэш:

vi /etc/sysconfig/memcached

CACHESIZE=256

Дальше осталось указать php использовать memcached для хранения сессий:

vi /etc/php.ini

session.save_handler = memcache
session.save_path = "tcp://localhost:11211"

Осталось перезапустить ваш php интерпретатор:

systemctl restart php-fpm

Если вы хотите проверить все ли правильно кэшируется и есть ли вообще что-либо в кэше, можно использовать phpmemcacheadmin.

Кэширование страниц fastcgi

Я не советую использовать кэширование fastgci для сайтов WordPress, потому что там есть специальные плагины, которые могут точно контролировать кэш, очищать его когда нужно и вовремя обновлять. Но во всех остальных случаях кэш fastcgi может очень сильно ускорить работу сайта. Настраивается он в конфиге, где вы включаете fastgci, например, в конфигурации веб-сервера Nginx. Минимально для настройки кэша fastgci достаточно добавить в блок server такие строки:

vi /etc/nginx/vhosts/site.conf

fastcgi_cache_path /var/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Первая строка настраивает сразу несколько параметров, во первых, она добавляет путь к кэшу, можно использовать любой, только чтобы папка существовала и у веб-сервера были права для записи в нее. Директива levels указывает сколько подпапок будет. Следующая строка указывает что будет использоваться в качестве ключа для кэша. Ключ будет хэширован в md5.

Теперь нужно настроить блок обработки php:

location ~ \.php$ {
fastcgi_pass unix:/var/run/php7-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_cache MYAPP;
fastcgi_cache_valid 200 60m;
}

Здесь мы обращаемся к уже настроенной зоне памяти MYAPP, а также указываем время жизни кэша в один час. Для проверки кэширования можно посмотреть содержимое папки:

ls -lR /var/nginx/cache/

С помощью таких методов ваши страницы будут загружаться намного быстрее. Если вам понадобится отключить кєширование php для отдельных страниц, то сначала создаем переменную no_cache со значением 0:

set $no_cache 0;

Затем проверяем нужные параметры, и если соответствует, то устанавливаем значение в 1:

if ($request_method = POST)
{
set $no_cache 1;
}

И на завершение передаем значение этой переменной таким директивам, это отключит кэширование когда не нужно:

fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

Не забудьте перезапустить Nginx перед тем как проверять:

systemctl restart nginx

Что такое PHP OPCache

Ускорение PHP OPCache – это кеширование байт-кода, которое выполняется один раз в момент первого исполнения определённого файла PHP. Затем перекомпилированный скрипт остаётся в памяти и не требует каждый раз нового исполнения при обращении, что увеличивает скорость работы PHP за счёт экономии времени на парсинг файла, выстраивание дерева операций, вычисление выражений, состоящих из констант и пр.

принцип кеширования PHP

Ускоритель работает по аналогии с кешированием файлов Joomla, когда при первом обращении к странице она создаётся и сохраняется в кеше, после чего загружается оттуда, что быстрее, чем создание страницы с нуля при каждом новом обращении. У стандартного кеширования минус большой объём памяти, который он занимает, если сайт крупный, ведь в папке cache приходится хранить кучу созданных страниц. С PHP OPCache такой проблемы нет, так как скрипты не могут занимать такой же объём, как текстовые страницы с картинками.

Что даёт сайту кеширование PHP

При использовании OPCache сайт получает преимущество не только по скорости загрузки страниц, но и:

  1. Улучшается его производительность.
  2. Экономятся ресурсы сервера.
  3. Улучшается ПФ и конверсия в коммерции.

Лично у меня писец как красиво уменьшилась нагрузка на MySQL в частности и в целом на аккаунт. Если до решения включить OPCache нагрузка MySQL была в границах 24-100, то после скатилась на 8. Неплохо. Заметно и ускорение по скорости загрузки страниц. Время загрузки первого контента по PageSpeed Insights было 1,5 сек, стало 0,9 секунд, а время загрузки достаточной части контента сократилось с 1,7 до 1 секунды.

Для коммерческого веб-сайта такая разницы солидны, да и информационнику она не помешает в существовании, тем более что ничего не стоит и включается на Spaceweb в один клик.

Как включить OPCache

Для включения PHP OPCache на хостинге SpaceWeb надо зайти в панель управления и найти там пункт Настройки сайта, где выбрать нужный домен и указать для него версию PHP:

Apache 2.2 + PHP 7.1opcache

Никакие параметры кеширования настраивать не надо, всё сделано до вас за что снимите шляпы. Сохраните настройки.

Теперь останется дождаться пока байт-код PHP перекомпилируются и сохранятся в памяти, откуда и будут в дальнейшем подгружаться для ускорения загрузки страниц и прочих радостей владельцу веб-сайта.

Установка OPcache используя PECL

# pecl install zendopcache

После установки будет сообщен путь размещения, например, You should add "zend_extension=/usr/lib64/php/modules/opcache.so" to php.ini.

Установка OPcache используя yum

# yum install php-pecl-zendopcache

Добавим OPcache в конфигурацию PHP, например, создадим файл /etc/php.d/opcache.ini и внесем в него инструкции:

zend_extension=/usr/lib64/php/modules/opcache.so
opcache.enable = 1
;opcache.enable_cli = 1
opcache.memory_consumption = 128
opcache.max_file_size = 1M
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 7963
opcache.fast_shutdown = 1
; Проверять изменение файла раз в 5 секунд
opcache.revalidate_freq = 5
opcache.use_cwd = 1

Перезапустим Apache:

# service httpd restart

Установка расширения OPcache

Перед установкой самого расширения, нужно подключить репозитории EPEL и remi, а затем обновить пакеты на сервере с помощью yum (dnf):

# dnf install epel-release -y
# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
# dnf update -y

Теперь можно установить opcahce для php:

# dnf install php-opcache -y

linux установка php-opcache

На этом установка расширения OPcache завершена.

Настройка параметров OPcache в конфигурационном файле

Конфигурационный файл OPCache находится в директории /etc/php.d. Откройте его и очистите от стандартных записей:

# nano /etc/php.d/10-opcache.ini

Добавьте следующие универсальные настройки, которые подходят для большинства php проектов:

zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=512
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=1
opcache.validate_timestamps=1
opcache.revalidate_freq=0
opcache.fast_shutdown=1
opcache.save_comments=1
opcache.load_comments=1
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist

подключение модуля opcache в конфигурационном файле php.d

После сохранения файла php.d перезапустите веб-сервера. В моем случае это apache:

# service httpd restart

Проверьт, что модуль Zend OPcache Engine подключён:

# php -v

php -v проверка что подключен модуль zend opcache engine

Модуль успешно подключен. Рассмотрим опции, которые мы исопльзовали в конфигурационном файле:

  • zend_extension=opcache.so – подключение модуля расширения
  • opcache.enable=1 — включение/отключение OPcache
  • opcache.memory_consumption=512 – размер памяти для хранения кэша
  • opcache.interned_strings_buffer=512 — размер памяти для пула строк
  • opcache.max_accelerated_files=100000 — максимальное количество ключей в хэн-таблице OPcache
  • opcache.max_wasted_percentage=1 – максимальный процент потерянной памяти, после которой планируется перезапуск
  • opcache.validate_timestamps=1 — включение возможности обнуления вручную или рестартом веб-сервера(регулируется opcache.validate_timestamps)
  • opcache.revalidate_freq=0 — промежуток, через который будет выполнена проверка изменения временных меток, для поддержания актуальности данных, 0 — постоянная проверка, любое другое значение количество секунд
  • opcache.fast_shutdown=1 — если параметр включен, то будет использована быстрая последовательность перезагрузки, при которой не происходит очистки всех выделенных блоков памяти.
  • opcache.save_comments=1 — если выключено, все комментарии будут отброшены из кеша опкодов для минимизации размера кода.
  • opcache.load_comments=1 — если выключено, то комментарии PHPDoc не будут загружаться из общей памяти.
  • opcache.blacklist_filename=/etc/php.d/opcache*.blacklist — местоположение списка php файлов, который OPcache должен пропускать. Файл содержит имена файлов, которые не нужно оптимизировать, по одной записи на строку. Допустимы шаблоны поиска и префиксы. Строки, начинающиеся с точки с запятой игнорируются

Более детальную настройку можно выполнить согласно официальной документации по OPcache.