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

Зміст:

  1. Сервер NGINX
  2. База даних MySQL
  3. Гіпертекстовий препроцесор PHP
  4. Компіляція PHP з вихідних файлів
  5. Розширення OpCache
  6. Інструмент для керування БД phpMyAdmin
  7. Сервіс передачі файлів по 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, якщо це локальний) і якщо вас вітає схожий напис, можна переходити до наступних пунктів.

Успішна інсталяція nginx

Налаштування серверу

Основні налаштування знаходяться в файлі

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

Що рекомендується змінити:

  1. $cfg['blowfish_secret'] = 'lgkkfglreoeicbnk693k2nmdnue84FDFjfkdfn '; - тут між лапками можна відірватися і налупити по клавішам 20-30 випадкових символів. Це blowfish алгоритм шифрування паролю. Необхідний для безпеки, інакше phpmyadmin показуватиме помилку:

    Конфігураційний файл потребує секретної фрази (blowfish_secret).

  2. $cfg['UploadDir'] = '/home/user/databases'; - Якщо зручніше завантажувати файли для імпорту через ftp можна додати опцію вибору з директорії, вказавши шлях до неї в цьому параметрі.
  3. $cfg['SaveDir'] = '/home/user/databases'; - Директорія для збереження файлів експорту бази

Якщо такої директорії нема, створимо її командою mkdir /home/user/databases.

Кому потрібно більше параметрів ви можете дізнатися їх значення в документації на сторінці Конфігурування (http://php-myadmin.ru/doc/config.html).

Тепер можна перейти до http://localhost/phpmyadmin/ , ввести пароль і починати роботу.
Приклад відображення:

PhpMyAdmin on localhost

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.

Мітки: ftp, mysql, lemp, phpmyadmin, config, debian, php

Залітай у Твітер

Це ще що таке?

Я назвав цей сайт студією онлайн-творчості, тому що не вважаю свою діяльність роботою. Займаючись розробкою, я пізнаю нове, подорожую просторами мережі, знайомлюся з дивовижними людьми. Це життя.

Олександр Мойсеюк

Чому мене варто послухати?

Наразі за моїми плечима близько 6 тисяч годин задушевного спілкування з програмним кодом, документаціями, статтями і варіантами розмітки.

Олександр Мойсеюк

Також зараз під моїм наглядом або керівництвом активно розвиваються близько 7 проектів, серед яких студія розробки розширень і навчальних матеріалів для CMS Joomla. І просто досить знати, що я дуже люблю свою роботу:)

Читати у

Змінити мову на

Son of Sky - основний псевдонім Олександра Мойсеюка, неочевидне значення якого - "українець".

Згідно праць Олексія Братко-Кутинського, як зазначено в Олександра Середюка, монголо-татари після вторгнення на Київську Русь, почали називати місцевих "хохлами". Першопочатковий переклад цього слова:
"Неба син" (Кок (Небо), ол (син)), що у слов'янському звучанні - "хохол". Простий переклад на англійську: Son of the Sky

Синь неба - це схожа за звучанням назва для сайту.