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 |


18 комментариев
Забавно что в конфиге nginx позаботились об ie6
А так да, прирост обеспечен…
Да можно и чз spawn-fcgi, по сути php-fpm работает тоже как fcgi ) Кому как нравится…
с подобным содержимым:
далее chmod +x script.sh и добавить в cron?
+ HeidiSQL вместо phpMyAdmin
/etc/php5/fpm/php-fpm.conf
/etc/nginx/sites-available/site.ru
/etc/nginx/nginx.conf
Логи ошибки не показывает, сайт выдает 500 ошибку. Где искать проблему, в чем может быть проблема? Кто сможет помочь.
Как устанавливали и что делали не знаю, провайдер делал
Как выяснил цмс не поддерживает mysqli на данный момент. Поэтому нужно обновится и стоит ли обновлять на новую 2.0.1? Или есть другой способ перевести БД на mysqli