Nginx + php-fpm + MariaDB + memcached + OPcache ( HeidiSQL и BBClone )


Устанавливаем и настраиваем высокопроизводительный веб сервер для движка livestreet 1.0.3 — php5-fpm | livestreet 2.0 — php7.0-fpm.

Имеем:

Debian: 8.6 (Jessie)
Nginx: 1.10.2
PHP-FPM: 5.6.24 | 7.0.12
MariaDB: 10.0.27
Memcached: 3.0.8
OPcache: 4.0.7
BBClone: 0.6.4

Погнали!

Проверяем дату и время:
# date
ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Подключаем репозиторий:
# nano /etc/apt/sources.list
# DotDeb
deb http://packages.dotdeb.org stable all

Импортируем ключ dotdeb'а:
# wget http://www.dotdeb.org/dotdeb.gpg -O - -q | apt-key add -

Обновляем список зеркал и пакеты:
# apt-get update && apt-get upgrade

Устанавливаем необходимые пакеты:
Для livestreet 1.0.3:
# apt-get install php5-fpm php-pear php5-common php5-mcrypt php5-mysqlnd php5-cli php5-gd php5-dev php-mail sendmail nginx mariadb-server unzip

Для livestreet 2.0:
# apt-get install php7.0-fpm php-pear php7.0-common php7.0-mcrypt php7.0-mysqlnd php7.0-cli php7.0-gd php7.0-dev php-mail sendmail php7.0-mbstring php7.0-curl nginx mariadb-server unzip

В процессе установки будет предложено задать пароль:
MySQL-Root = pass

PHP-FPM

В конец дописываем:
[php5-fpm]
# nano /etc/php5/fpm/php-fpm.conf
[php7.0-fpm]
# nano /etc/php/7.0/fpm/php-fpm.conf
;Add
pm = dynamic
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500

Проверяем, чтобы php-fpm работал через сокет:
[php5-fpm]
# nano /etc/php5/fpm/pool.d/www.conf
listen = /var/run/php5-fpm.sock
# /etc/init.d/php5-fpm restart
[php7.0-fpm]
# nano /etc/php/7.0/fpm/pool.d/www.conf
listen = /run/php/php7.0-fpm.sock
# /etc/init.d/php7.0-fpm restart

Nginx

Создаем директорию для сайта:
# mkdir /var/www/site.ru
# rm /etc/nginx/sites-enabled/default
# cp /etc/nginx/sites-available/default /etc/nginx/sites-available/site.ru

Настраиваем конфиг нашего сайта:
# cp /dev/null /etc/nginx/sites-available/site.ru
# nano /etc/nginx/sites-available/site.ru
server {
        listen 80;
        server_name site.ru;

        access_log off;
        error_log /var/log/nginx/site.ru.error_log;

        root /var/www/site.ru;
        index index.php;

	# Задаем максимальное количество одновременных соединений для одной сессии.
	limit_conn addr 5;

	# Коннекты только к своему домену.
	if ($host !~ ^(site.ru|www.site.ru)$ ) {
	        return 444;
	}

	# Количество доступных методов обращения к Web-серверу.
	if ($request_method !~ ^(GET|HEAD|POST)$ ) {
	        return 444;
	}

	location ~* ^.+.(css|js|jpg|jpeg|gif|png|ico|txt|woff)$ {
                expires 1M;
        }

        location / {
		try_files $uri $uri/ /index.php?q=$uri&$args;
        }

	# Запрет на доступ к скрытым файлам
		location ~ /\. {
		deny all;
	}

	# Запрет на доступ к загруженным скриптам
		location ~* /(?:uploads)/.*\.php$ {
		deny all;
	}

        location ~ \.php {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

        location = /favicon.ico {
		log_not_found off;
	}

        location ~ \.(tpl|log)$ {
                deny all;
        }
}

Для php7.0-fpm: меняем fastcgi_pass unix:/var/run/php5-fpm.sock;, на
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

Включаем его созданием симлинка в папку sites-enabled:
# ln -s /etc/nginx/sites-available/site.ru /etc/nginx/sites-enabled/site.ru

Настройка Nginx:
# nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	# Максимальное количество соединений одного воркера.
		worker_connections 768;
	# Метод выбора соединений.
		use epoll;
	# Принимать максимально возможное количество соединений.
		multi_accept on;
}

http {

	##
	# Basic Settings
	##

	# Метод отправки данных sendfile эффективнее чем read+write.
		sendfile on;
	# Ограничивает объём данных, который может передан за один вызов sendfile(). Нужно для исключения ситуации когда одно соединение может целиком захватить воркер.
		sendfile_max_chunk  128k;
	# Отправлять заголовки и и начало файла в одном пакете.
		tcp_nopush on;
		tcp_nodelay on;
	# Сбрасывать соединение если клиент перестал читать ответ.
		reset_timedout_connection on;
		types_hash_max_size 2048;
	# Отключить вывод версии nginx в ответе.
		server_tokens off;
	# Максимальный размер буфера для хранения тела запроса клиента
		client_body_buffer_size 64K;
	# Максимальный размер буфера для хранения заголовков запроса клиента
		client_header_buffer_size 1k;
	# Максимальный размер тела запроса клиента, прописанный в поле Content-Length заголовка. Если сервер должен поддерживать загрузку файлов, это значение необходимо увеличить
		client_max_body_size 128k;
	# Количество и размер буферов для чтения большого заголовка запроса клиента
		large_client_header_buffers 2 1k;
	# Таймаут при чтении тела запроса клиента
		client_body_timeout 5;
	# Таймаут при чтении заголовка запроса клиента
		client_header_timeout 3;
	# Таймаут, по истечению которого keep-alive соединение с клиентом не будет закрыто со стороны сервера
		keepalive_timeout 5 5;
	# Таймаут при передаче ответа клиенту
		send_timeout 3;
	# Описываем зону (limit_conn addr, находится в server), в которой будут храниться состояния сессий. Зона размером 1 Мб может хранить около 32000 состояний, мы устанавливаем ее размер равным 5 Мб
		limit_conn_zone $binary_remote_addr zone=addr:5m;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log off;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";

	gzip_vary on;
	gzip_proxied any;
	gzip_comp_level 6;
	gzip_buffers 16 8k;
	gzip_http_version 1.1;
	gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# nginx-naxsi config
	##
	# Uncomment it if you installed nginx-naxsi
	##

	#include /etc/nginx/naxsi_core.rules;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
# 
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}

Перезагружаем nginx:
# /etc/init.d/nginx reload

Немного тестируем:
# nano /var/www/site.ru/index.php
<?php
phpinfo();
?>

MariaDB

Создаем новую базу, пользователя и присваиваем ей привилегии:
# mysql -uroot -p
CREATE USER ls@localhost IDENTIFIED BY 'pass_user';
CREATE DATABASE ls;
GRANT ALL PRIVILEGES ON ls.* TO ls@localhost IDENTIFIED BY 'pass_user';
FLUSH PRIVILEGES;
quit;

LiveStreet

Устанавливаем Livestreet:
# wget -P /tmp https://github.com/livestreet/livestreet/archive/1.0.3.zip
# unzip /tmp/livestreet-1.0.3.zip -d /var/www/site.ru/
# chown -R www-data:www-data /var/www/site.ru/
# rm -r /var/www/site.ru/install/

Memcached:
[php5-fpm]
# apt-get install memcached php5-memcache
# /etc/init.d/php5-fpm restart
# nano /var/www/site.ru/config/config.local.php
$config['sys']['cache']['type'] = 'memory';
[php7.0-fpm]
# apt-get install memcached php7.0-memcache
# /etc/init.d/php7.0-fpm restart
# nano /var/www/site.ru/application/config/config.local.php
$config['sys']['cache']['type'] = 'memory';

OPcache: Включаем его и редактируем настройки
[php5-fpm]
# nano /etc/php5/fpm/php.ini
[php7.0-fpm]
# nano /etc/php/7.0/fpm/php.ini
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
[php5-fpm]
# /etc/init.d/php5-fpm restart
[php7.0-fpm]
# /etc/init.d/php7.0-fpm restart

BBClone — статистика для сайта
# wget -P /tmp http://bbclone.de/dist/bbclone-0.6.4.zip
# unzip /tmp/bbclone-0.6.4.zip -d /var/www/site.ru/
# nano /var/www/site.ru/index.php
<?php  
 define("_BBC_PAGE_NAME", "Stats-LS");  
 define("_BBCLONE_DIR", "bbclone/");  
 define("COUNTER", _BBCLONE_DIR."mark_page.php");  
 if (is_readable(COUNTER)) include_once(COUNTER);  
 ?>
# chown -R www-data:www-data /var/www/site.ru/bbclone - устанавливаем права.
# nano /var/www/site.ru/bbclone/conf/config.php - отключаем показ конфига
$BBC_SHOW_CONFIG = "";

UPDATE!

LiveStreet
Включаем компрессию css-файлов и js-файлов
# nano /var/www/site.ru/config/config.local.php
/**
 * Параметры компрессии css-файлов
 */
$config['smarty']['compile_check']    = false;	// Проверять или нет файлы шаблона на изменения перед компиляцией, false может значительно увеличить быстродействие, но потребует ручного удаления кеша при изменения шаблона
 
$config['compress']['css']['merge'] = true;	// указывает на необходимость слияния файлов по указанным блокам.
$config['compress']['css']['use']   = true;	// указывает на необходимость компрессии файлов. Компрессия используется только в активированном режиме слияния файлов.

/**
 * Параметры компрессии js-файлов
 */
$config['compress']['js']['merge']  = true;    // указывает на необходимость слияния файлов по указанным блокам.
$config['compress']['js']['use']    = true;    // указывает на необходимость компрессии файлов. Компрессия используется только в активированном режиме слияния файлов.

Отключаем отображение ошибок PHP, тем самым предотвращаем раскрытие путей на сервере:
# nano /var/www/site.ru/index.php
ini_set('display_errors', 0);

Чтобы при обновлении движка эта правка не слетела — лучше эту запись сделать в конце файла:
/config/config.local.php до строки:
return $config;

PHP-FPM
Там где нужно, исправляем значения:
[php5-fpm]
# nano /etc/php5/fpm/php.ini
[php7.0-fpm]
nano /etc/php/7.0/fpm/php.ini
# Максимальное время исполнения скрипта.
max_execution_time = 30
# Максимальное время, которое может потратить скрипт на обработку данных запроса.
max_input_time = 60
# Максимальное количество памяти, выделяемое каждому скрипту.
memory_limit = 8M
# Максимальный размер данных, отсылаемых скрипту с помощью метода POST.
post_max_size = 8M
# Максимальный размер загружаемых файлов.
upload_max_filesize = 2M
# Не показывать ошибки PHP-скриптов пользователям.
display_errors = Off
# Защищаемся от утечки информации о PHP.
expose_php = Off
# Запрещаем открытие удаленных файлов.
allow_url_fopen = Off
# Обеспечиваем поддержку правильных PATH_INFO/PATH_TRANSLATED в CGI.
cgi.fix_pathinfo = 0
[php5-fpm]
/etc/init.d/php-fpm restart
[php7.0-fpm]
/etc/init.d/php7.0-fpm restart

Оптимизируем изображения без потери качества:

# apt-get install optipng jpegoptim
# cd /var/www/site.ru/uploads
# find -type f -iname "*.jpg" -exec jpegoptim --strip-all --all-progressive -pm85 {} \; -exec chmod 644 {} \;
# find -type f -iname "*.png" -exec optipng -strip all -o4 {} \; -exec chmod 644 {} \;
# chown -R www-data:www-data /var/www/site.ru/

HeidiSQL вместо phpMyAdmin

Запускаем PuTTY
В Host Name пишем IP нашего сервера.

Далее переходим в Connection -> SSH -> Tunneles в Source port пишем требуемый порт, в Destination пишем localhost:port (или 127.0.0.1:port), выбираем Local, добавляем (Add) и IPv4. Нажимаем Open.

Далее запускаем HeidiSQL
И настраиваем исходя из заданных параметров MySQL сервера.

Полезные ссылки:

Проверяем сайт на скорость работы — tools.pingdom | developers.google | loadimpact |

16 комментариев

avatar
Почему PHP5, непонятно, прекрасно работает на более быстрых HHVM и PHP7.
Забавно что в конфиге nginx позаботились об ie6
  • ff00
  • 0
avatar
Править движок для поддержки более нового PHP7 нет возможности =(
А так да, прирост обеспечен…
avatar
Ну так HHVM поставьте
avatar
Как нибудь попробую, Спасибо!
avatar
Репу эту лучше не подключать. Если Дебиан старый и не_хочется/нет_возможности/зависимости собирать пакет вручную, можно через этот свисток(spawn-fcgi), у меня на нем года два пыха работала. А в последнем он вроде как из коробки в репе есть.
avatar
Пока не сталкивался с проблемными пакетами из DotDeb… + более свежие версии )
Да можно и чз spawn-fcgi, по сути php-fpm работает тоже как fcgi ) Кому как нравится…
avatar
А у меня dotdeb ни в какую не захотел запускаться как php-fpm ни 5 ни 7, вот этот github.com/kasparsd/php-7-debian завелся с пол тыка с ним и работаю.
avatar
Пригодится, благодарю.
avatar
Да, вполне может быть пока не сталкивались, но они бывают, на спец.сайтах по linux встречаются. Люди не рекомендуют испытывать удачу, цена стабильности и времени на починку может быть выше.
avatar
А как бы заюзать jpegoptim и optipng непосредственно во время загрузки изображений при постинге? А то pagespeed все время ноет по поводу несжатых img's…
avatar
Фиг его, могу предложить такой вариант, создать — script.sh
с подобным содержимым:
#!/bin/bash
find /var/www/site.ru/uploads -iname *.jp*g -type f -print0 | xargs -0 jpegoptim -o --strip-all
find /var/www/site.ru/uploads -iname *.png -print0 | xargs -0 optipng -o2 -preserve -strip all

далее chmod +x script.sh и добавить в cron?
avatar
Никому не рекомендую работать с MariaDB — очень дырявая ну прям насквозь. Еще столкнетесь с этим, к сожалению
  • t889
  • 0
avatar
М.б. ) А так, MariaDB, является одной из лучших по производительности и кушающих в меру оперативную память СУБД среди форков MySQ…
avatar
Вот еще полезная связка.
  • MTv
  • 0
avatar
Обновил и добавил в топике:
+ HeidiSQL вместо phpMyAdmin
/etc/php5/fpm/php-fpm.conf
/etc/nginx/sites-available/site.ru
/etc/nginx/nginx.conf
  • MTv
  • 0
avatar
Добавил в установку PHP7 — для LS 2.0 (beta)
  • MTv
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.