Надійний LEMP сервер під велике навантаження з PHP 5.x для Debian 8
- Олександр Мойсеюк
- Лінукс та сервер
- Переглядів: 1355
-
Опишу реальний процес встановлення сервера починаючи з чистої системи і закінчуючи нормальною роботою. Очікується своєрідний список найнеобхідніших команд, який можна буде використовувати як шпаргалку чи інструкцію.
Зміст:
- Сервер NGINX
- База даних MySQL
- Гіпертекстовий препроцесор PHP
- Компіляція PHP з вихідних файлів
- Розширення OpCache
- Інструмент для керування БД phpMyAdmin
- Сервіс передачі файлів по FTP
Трохи довідки: LEMP — це абревіатура від Linux + NGINX (Е, бо вимовляється як Engine X) + MySQL + PHP, в нашому випадку (PHP-FPM). Історично так вийшло, що при виборі сервера і читанні мануалів по конфігурації різних зв'язок, наткнувся на варіант зменшити кількість використаних технологій - це саме встановити один тільки NGINX, типу він РНР і сам прекрасно піднімає. Отже, до суті:
1. Встановлення та налаштування NGINX
Встановити NGINX можна наступною командою:
apt-get install nginx
Система запропонує встановити схожі пакунки
libgd3 libvpx1 libxpm4 libxslt1.1 nginx nginx-common nginx-full. Погоджуємося і рухаємося даліТепер є можливість запустити сервер і перевірити роботу:
/etc/init.d/nginx start
Переходимо в браузері на IP сервера, або домен (чи на localhost, якщо це локальний) і якщо вас вітає схожий напис, можна переходити до наступних пунктів.
Налаштування серверу
Основні налаштування знаходяться в файлі
nano /etc/nginx/nginx.conf
Приводжу приклад основних опцій, необхідних для роботи. Для тих, хто любить знати, що означає кожен параметр, підготував окрему статтю про конфігурацію nginx
user www-data; worker_processes 8; pid /run/nginx.pid; events { worker_connections 2048; use epoll; multi_accept on; } http { sendfile on; charset utf-8; # кодування для кирилиці tcp_nopush on; tcp_nodelay on; keepalive_timeout 6000; keepalive_requests 1000; types_hash_max_size 2048; reset_timedout_connection on; server_tokens off; client_body_timeout 10; client_header_timeout 10; send_timeout 2; client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 200m; include /etc/nginx/mime.types; default_type application/octet-stream; # Logging Settings access_log off; error_log /home/logs/nginx-error.log; # Введіть власний існуючий шлях для логів # Gzip Settings gzip on; gzip_disable "msie6"; gzip_min_length 10240; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css application/json application/javascript$ # Virtual Host Configs include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; server { if ($request_method !~ ^(GET|HEAD|POST)$) { return 444; } if ($http_referer ~* (babes|forsale|girl|jewelry|love|nudit|org$ return 403; } proxy_connect_timeout 30; proxy_send_timeout 30; proxy_read_timeout 30; send_timeout 30; } }
У випадку якщо на сайті тільки один домен досить тільки конфігурації в файлі /etc/nginx/sites-available/default. Налатування додаткового домену розберемо пізніше на прикладі phpMyApmin. Відкриваємо файл редактором
nano /etc/nginx/sites-available/default
І вносимо наступні параметри
server { listen 80 default_server; # слухати порт 80 listen [::]:80 default_server; root /home/user/public_html; # Директорія сайту (використовуйте власну). index index.php index.html; # Додаємо index.php для динамічної частини server_name localhost; rewrite ^/(.*.php)(/)(.*)$ /$1?file=/$3 last; location / { try_files $uri $uri/ /index.php; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ .php$ { # include snippets/fastcgi-php.conf; try_files $uri =404; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; include fastcgi_params; fastcgi_read_timeout 600; fastcgi_pass 127.0.0.1:9000; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /.ht { # deny all; #} location ~* .(jpg|jpeg|gif|png|css|js|ico|xml)$ { access_log off; log_not_found off; expires 360d; } location ~ /. { access_log off; log_not_found off; deny all; } }
В деяких випадках може знадобитися:
chown -R www-data:www-data /home/user/public_html/*
2. Встановлення та налаштування MySQL
Для початку виконаємо команду, яка встановить клієнта і сервер баз даних:
apt-get install mysql-server mysql-client
В процесі інсталяції система попросить ввести пароль для користувача root. Раджу згенерувати (наприклад через LastPass) відразу складний пароль і зберегти його там же, або записати у надійне місце. Після інсталяції обов'язково виконати наступну команду і пройти всі пункти:
mysql_secure_installation
Enter current password for root (enter for none): # введіть пароль вказаний вище OK, successfully used password, moving on... Change the root password? [Y/n] n Remove anonymous users? [Y/n] y Disallow root login remotely? [Y/n] y Remove test database and access to it? [Y/n] y Reload privilege tables now? [Y/n] y
Налаштування сервісу зазвичай знаходяться в файлі:
nano /etc/mysql/my.cnf
Насправді, оптимізацією mysql краще займатися уже коли буде навантаження і буде видно яких параметрів не вистачає. Можна трохи погратися з наступними параметрами:
# Збільшити обмеження на максимальний розмір даних, які можна помістити в кеш query_cache_limit = 6M # Скільки виділити пам'яті для внутрішнього кешу запитів (туди поміщатимуться таблиці повернуті запитами) query_cache_size = 128M # максимальна кількість з'єднань max_connections = 2000 # число потоків серверу (зазвичай попереднє + 1) thread_cache_size = 2001 # число відкритих таблиць для всіх потоків. Для великої кількості одночасно відкритих таблиць можна зазначити: table_cache = 1024 # цей параметр встановіть вдвічі більшим числу ядер процесора, напр 8*2 =16 thread_concurrency = 16 # Перемістимо логи до зручнішої теки log_error = /home/user/logs/mysql-error.log
Краще не ставити надто великі значення query_cache_size , особливо при низьких query_cache_limit, бо це навпаки може сповільнити роботу. Дивіться більше деталей налаштування тут.
3. Встановлення та налаштування PHP
За замовчуванням Debian Jessie поставляється з PHP версії 5.6. Для деяких сайтів чи CMS це може не підходити, тому розберемо також варіант збірки PHP-FPM із сирців. Так саме php-fpm найкраще підходить для nginx та високо-навантажених ресурсів. Отже ті кого влаштовує 5.6, користуються командами:
# Встановлення apt-get install php5 php5-fpm php5-mysql # Конфігурація nano /etc/php5/fpm/php.ini nano /etc/php5/fpm/pool.d/www.conf # Керування /etc/init.d/php5-fpm restart
Інші можуть перейти на потрібний репозиторій debian і скопіювати посилання на оригінальний пакет. Далі перейдемо в каталог наприклад /usr/src, завантажимо туди пакет і розархівуємо. Послідовно команди:
cd /usr/src wget http://security.debian.org/debian-security/pool/updates/main/p/php5/php5_5.4.45.orig.tar.gz tar -zxvf php5_5.4.45.orig.tar.gz cd php-5.4.45
Прийшла пора найцікавішої частини — конфігурації пакета. Уважно вивчіть вимоги вашої системи (сайту) до розширень, адже перед конфігуруванням потрібно встановити необхідні бібліотеки. Наприклад:
apt-get install libxml2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev
Також, якщо досі немає, сам конфігуратор і все необхідне:
apt-get install checkinstall pkg-config
Власне конфігурування: (раджу вказати шлях для файлу php.ini щоб потім було простіше)
./configure --with-config-file-path=/usr/local/php --with-config-file-scan-dir=/usr/local/etc --enable-mbstring --with-curl --with-openssl --with-xmlrpc --enable-soap --with-png-dir --with-jpeg-dir --with-mysql --with-mysqli --with-pdo-mysql --enable-embedded-mysqli --enable-fpm
На допомогу може прийти:
./configure --help
Чому для інсталяції краще не використовувати make install? – (http://habrahabr.ru/post/130868/).
Послідовно:make checkinstall
Копіюємо потрібні файли в їх нормальні директорії
cp php.ini-development /usr/local/php/php.ini cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf cp sapi/fpm/php-fpm /usr/local/bin chmod 755 /etc/init.d/php-fpm
Для організації зручного та інформативного керування сервісом пропоную власний скрипт
cd /usr/src wget http://son-of-sky.com/images/dev_bl/php-fpm-start.zip unzip php-fpm-start.zip -d /etc/init.d/
Тепер можна користуватися командами типу:
/etc/init.d/php-fpm start /etc/init.d/php-fpm restart /etc/init.d/php-fpm status
Додатково встановимо модуль кешування Zend OPcache. Нам знадобиться:
apt-get install autoconf
Тоді можна переходити і до самого процесу встановлення
pecl install zendopcache-7.0.4
Процес інсталяції мені повідомив, що потрібно додати:
You should add "zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/opcache.so" to php.ini
Отже копіюємо те, що між лапками в php.ini, відкривши його в nano і скориставшись пошуком (Ctrl+W) вставимо, наприклад, після модулю [curl]
nano /usr/local/php/php.ini # і перезапустимо РНР /etc/init.d/php-fpm restart
Файл README даного розширення пропонує також додати наступні рядки в php.ini після щойно доданого для кращої продуктивності. Можна створити окремий файл конфігурації для модулю і помістити опції туди
opcache.memory_consumption=1024 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=2900 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1
Щоб подивитися скільки використовується пам'яті, які скрипти кешуються і т. д. та в майбутньому підкоригувтаи значення можна скористатися набором скриптів доступних за посиланням, завантаживши все і розпакувавши в окрему папку, напр test і перейшовши за адресою your-site.com/test/opcache.php
Якщо ваш проект базується на якомусь одному конкретному фреймворку або веб-додатку, завжди варто ознайомитися з документацією на предмет налаштувань конфігурації OpCache. Наприклад, існують спеціальні настройки для Moodle (https://docs.moodle.org/26/en/OPcache).
Налаштування
Відкриваємо конігурацію php-fpm:
nano /usr/local/etc/php-fpm.conf
Звернемо там увагу на наступні рядки. Більшість з них можна використовувати такими як є, деякі краще підлаштувати під свої потреби.
emergency_restart_threshold = 10 emergency_restart_interval = 20s process_control_timeout = 10s
Це означає, що якщо 10 дочірніх процесів PHP-FPM завершаться за допомогою SIGSEGV або SIGBUS, то PHP-FPM перезавантажиться через 20s. А також дочірнім процесам встановлений ліміт часу реакції в 10 секунд на сигнал від майстра.
Перевіримо чи вказаний правильний користувач:
user = www-data group = www-data listen.owner = www-data listen.group = www-data
Спосіб роботи менеджера процесів варто вибирати виходячи з характеру роботи вашого сайту. Я вибрав ondemand, бо у мене то жодного користувача, то навалом. Це одначає, що дочірні процеси не створюватимуться при запуску, а лише при потребі. На відміну від dynamic, де значення потрібної кількості процесів при старті вказується в налаштуваннях. Відповідно нас далі цікавлять наступні значення
pm.max_children = 350 pm.process_idle_timeout = 5s
Другий параметр - це час через який потрібно завершувати неактивні процеси. Щоб вирахувати перший, необхідно знати скільки пам'яті займає 1 процес РНР. Щоб точно визначити, вже коли сайт буде встановлено, запустимо команду:
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%sn", sum/NR/1024,"Mb") }'
Після чого загальну кількість виділеної для php-fpm оперативної пам'яті поділимо на отримане значення (28000/80=350 процесів).
Якщо вам більше підійде значення dynamic, то ставимо також параметтри
; 2*х ядер процесора pm.min_spare_servers = 16 ; 4*х ядер процесора pm.max_spare_servers = 32 ; середнє арифметичне між 2-ма попередніми pm.start_servers = 24
Також нам потрібно провести деякі базові налаштування в php.ini. Відкриваємо:
nano /usr/local/php/php.ini
Перша опція є обов'язковою, згідно документації, решта за потреби
cgi.fix_pathinfo=0 post_max_size = 108M file_uploads = On upload_max_filesize = 100M
Для перевірки успішності установки PHP i OpCache створимо файл:
nano /home/user/public_html/info.php
і вставимо:
<?php phpinfo(); ?>
І перейдемо за адресою наприклад http://localhost/info.php
Бонус: збирання з вихідних файлів інcтрументу для моніторингу сервера Zabbix.
4. phpMyAdmin
За роки роботи звик до цього інструменту для роботи з базами і не можу без нього. Насправді це звичайний набір PHP файлів, тому нам досить розархівувати його і додати налаштування додаткового адресу в сервер, де вказати розташування директорії phpMyAdmin на сервері. Почнемо з завантаження до поточної директорії. В нашому випадку зараз це /usr/src. Для новіших версій PHP можна використати новішу адмінку. Тоді розархівуємо і перенесемо до більш доцільного місця.
wget https://files.phpmyadmin.net/phpMyAdmin/4.4.15.2/phpMyAdmin-4.4.15.2-all-languages.tar.gz tar -zxvf phpMyAdmin-4.4.15.2-all-languages.tar.gz mv phpMyAdmin-4.4.15.2-all-languages /usr/local/phpmyadmin
Створимо файл
nano /etc/nginx/sites-available/phpmyadmin.cde.conf
наступного змісту:
server { server_name phpmyadmin.sitename.com; root /usr/local/phpmyadmin; auth_basic "Restricted"; auth_basic_user_file /home/user/public_html/htpasswd; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080; } location ~* .(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } }
Щоб зробити доступним з директорії сайту створимо символічне посилання
ln -s /usr/local/phpmyadmin /home/user/public_html/phpmyadmin
Створимо файл конфігурації phpmyadmin, скопіювавши його з прикладу:
cp /usr /local/phpmyadmin/config.sample.inc.php /usr /local/phpmyadmin/config.inc.php
Що рекомендується змінити:
- $cfg['blowfish_secret'] = 'lgkkfglreoeicbnk693k2nmdnue84FDFjfkdfn '; - тут між лапками можна відірватися і налупити по клавішам 20-30 випадкових символів. Це blowfish алгоритм шифрування паролю. Необхідний для безпеки, інакше phpmyadmin показуватиме помилку:
Конфігураційний файл потребує секретної фрази (blowfish_secret).
- $cfg['UploadDir'] = '/home/user/databases'; - Якщо зручніше завантажувати файли для імпорту через ftp можна додати опцію вибору з директорії, вказавши шлях до неї в цьому параметрі.
- $cfg['SaveDir'] = '/home/user/databases'; - Директорія для збереження файлів експорту бази
Якщо такої директорії нема, створимо її командою mkdir /home/user/databases.
Кому потрібно більше параметрів ви можете дізнатися їх значення в документації на сторінці Конфігурування (http://php-myadmin.ru/doc/config.html).
Тепер можна перейти до http://localhost/phpmyadmin/ , ввести пароль і починати роботу.
Приклад відображення:
5. Встановлення та конфігурація FTP (VSFTPD)
Зізнаюся, у випадку з цим сервісом я просто скористався цим мануалом (http://bezopasnik.org/linux/dok/Debian/9.htm). Дуже дякую автору. Це одна з найкращих і найзрозумілиших інструкцій, а головне робоча! Приведу основні найнеобхідніші команди, яких досить для простого надання локального доступу.
Встановлюємо сервіс:
aptitude install vsftpd
Під час інсталяції створиться користувач ftp, необхідний для роботи демона. Призначимо йому директорію, якою буде каталог всіх наявних сайтів
usermod -d /home ftp
Додамо групу для користувачів FTP. Назвемо її наприклад зграєю бобрів.
addgroup ftpbobry
Створимо користувача bober для основного сайту та призначимо йому пароль:
useradd -d /home/user -g ftpbobry bober passwd bober
Права на основну теку користувача:
chmod 555 /home/user
Зробимо групу власником теки (можна зробити користувача також власником всіх файлів, якщо вони є):
chown root:ftpbobry /home/user chown -R bober /home/user/*
Зробимо резервну копію наявного файлу конфігурації, очистимо його та відкриємо в редакторі:
cp /etc/vsftpd.conf /etc/vsftpd.conf_old cat /dev/null > /etc/vsftpd.conf nano /etc/vsftpd.conf
Вставимо наступний вміст до файлу, змінивши за потреби директорію для логів
# Запускати vsftpd в незалежному режимі listen=YES # Вимкнути анонімний доступ anonymous_enable=NO # Дозволити вхід локальним користувачам з правом запису в домашніх директоріях local_enable=YES write_enable=YES local_umask=022 # Локальні користувачі будуть входити тільки в свої домашні каталоги chroot_local_user=YES chroot_list_enable=NO # Повідомлення про помилки будуть записуватися в власний журнал xferlog_enable=YES xferlog_file=/home/user/logs/vsftpd.logs # Налаштування публічного ftp data_connection_timeout=120 dirmessage_enable=YES ftpd_banner=Welcome!
От і все. Тестуйте доступ до FTP. Для збільшення безпеки і організації авторизації через БД користуйтесь вищезгаданим мануалом. Деталі значень конфігурації за цим посиланням: https://wiki.debian.org/ru/vsftpd/vsftpd.conf.