Настройка php fpm

Настройка php fpmСвязка nginx, php-fpm, php-apc позволяет ускорить работу сайта при правильной настройке по сравнению с apache и снизить нагрузку на сервер. Особенно это актуально при настройке работы сайтов с большим количеством посещений. Это сочетание компонентов в последнее время становится все более популярным, но настройка при этом достаточно несложная и делается быстро. Давайте посмотрим пример настройки на Debian’e. Настроим nginx с кэшем + php-fpm + php-apc.

Для начала вспомним, что это за компоненты. Nginx — это быстрый и гибкий веб-сервер, который к тому же позволяет использовать кеширование. Php-fpm — это PHP FastCGI Process Manager, менеджер процессов FastCGI для PHP. FastCGI — это бинарный протокол клиент-серверного взаимодействия, позволяющий обрабатывать запросы многопоточно, в отличие от однопоточного CGI. А php-apc — это Alternative PHP Cache, свободный фреймворк для кеширования байт-кода PHP в памяти, что в разы может ускорить выполнение PHP, при неоднократном использовании кода, естественно.
ким образом, ускорение должно быть в нескольких местах. Первое — кэш nginx’а, второе — более быстрая отдача статики при помощи nginx’а по сравнению с apache, третье — кэширование байт-кода PHP, четвертое — более быстрое исполнение кода php при помощи php-fpm по сравнению со связкой apache + mod_php5.

Установка пакетов

Устанавливаем пакеты:

apt-get install nginx php5-fpm php-apc php5-mysql

Всё необходимое установится по зависимостям

Настройка nginx

После установки пакетов необходимо задать настройки для nginx. Создаем файл настроек nginx для нашего сайта, назовем его «site»

touch /etc/nginx/sites-available/site

В файл запишем следующее:

server {     # Слушаем 80 порт по IPv4   listen 0.0.0.0:80;   # Название сайта (доменное имя)   server_name site;   # Индексный файл   index index.php;   # Корневая директория сайта   root /var/www/site;     # Запрещаем доступ к файлам .htaccess и .htpasswd   location ~ /.ht {   deny all;   }     # Отдача статики   location ~ .(jpg|jpeg|ico|gif|css){   # Отключаем записи об отдаче статических файлов    # Это поможет снизить количество операций записи на диск   access_log off;   expires max;   root /var/www/site;   }     location ~ .php {   include /etc/nginx/fastcgi_params;   fastcgi_pass unix:/var/run/php-fpm-site;   fastcgi_index index.php;   # Включаем кэш nginx, подключаем зону my-cache   proxy_cache my-cache;   # Таймауты хранения страниц в кэше в зависимости   # от ответа сервера. 200 и 302 - 60 минут, 404 - 1 минута   proxy_cache_valid 200 302 60m;   proxy_cache_valid 404 1m;   # Директория для временного хранения   proxy_temp_path /var/cache/nginx/tmp;   }  }  

Теперь сделаем символическую ссылку, чтобы сайт заработал.


ln -s /etc/nginx/sites-available/site /etc/nginx/sites-enabled  

В файл /etc/nginx/nginx.conf надо добавить кэш, который мы уже записали для использования. В начало секции http вставляем следующую строчку:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my-cache:8m max_size=128m inactive=600m;  

Эта строчка означает следующее: директория для хранения кэша — /var/cache/nginx. levels — уровни кэширования 1:2, это уровни вложенности директорий в директории для хранения кэша. Параметр keys_zone определяет название и объем зоны кэша (зон может быть несколько). Зона размером 1 мегабайт может хранить 8000 ключей. Параметр max_size определяет максимальный объем кэша, когда кэш достигнет этого объема, то старые файлы из кэша будут удаляться, чтобы освободить место. Если данные не будут запрошены из кэша в течение времени, указанного в параметре inactive (в нашем случае 600 минут), то они будут удалены из кэша. Если параметр inactive не указан, по умолчанию время составляет 10 минут.

Настройка php-fpm


Настройки php-fpm находятся в директории /etc/php5/fpm. В этой директории есть поддиректория pool.d, в которой хранятся файлы для работы с сайтами. Нам нужно создать файл для нашего сайта. Назовем его site.conf

touch /etc/php5/fpm/pool.d/site.conf  

В этот файл записываем следующее:

[site]    # Сокет-файл для обмена данными с nginx  listen = /var/run/php-fpm-site.sock  # Максимально доступное в системе количество соединений  listen.backlog = -1  # Владелец сокета и группа владения  listen.owner = www-data  listen.group = www-data  # Права, устанавливаемые при создании сокета  listen.mode = 660    user = www-data  group = www-data    # Количество процессов будет контролироваться динамически  pm = dynamic  pm.max_children = 30  pm.start_servers = 2  pm.min_spare_servers = 2  pm.max_spare_servers = 5  pm.max_requests = 50    env[HOSTNAME] = site  env[PATH] = /usr/local/bin:/usr/bin:/bin  env[TMP] = /tmp  env[TEMP] = /tmp  env[TMPDIR] = /tmp  

Теперь можно запускать php-fpm командой

service php5-fpm start  

И после этого так же запустить nginx

service nginx start  

Давайте создадим директорию /var/www/site, если она еще не создана:

mkdir -p /var/www/site  

А в этой директории создадим файл /var/www/site/index.php со следующим содержимым:

  

Теперь в браузере откроем наш сервер по доменному имени. Например, «http://site». Должна открыться страница с информацией о сервере. Там же перечислены все модули, которые используются. В этом списке должен присутствовать модуль apc, и его статус должен быть «Enabled».

Настройка php-apc


Конфигурационный файл apc находится по следующему пути: /etc/php/fpm/conf.d/20-apc.ini

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

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

 

mnorin.com

1. Установка Nginx

Для начала добавим репозиторий проекта Nginx:

 sudo vim /etc/apt/sources.list 

Добавим туда, официальное зеркало Nginx, то в каком виде представлен данный пакет, отражает видение его разработчиков:

 #for nginx deb http://nginx.org/packages/ubuntu/ precise nginx deb-src http://nginx.org/packages/ubuntu/ precise nginx 

Теперь нам нужно скачать GPG ключ:

 wget http://nginx.org/keys/nginx_signing.key 

Установим GPG ключ:

 sudo apt-key add nginx_signing.key 

Обновим список пакетов:


 sudo apt-get update 

Установим Nginx:

 sudo apt-get install nginx 

После установки nginx должен сразу стартануть. Если стартанул без ошибок, сразу переходим к пункту 2 установка php-fpm.

Если уже стоит апач, который по умолчанию слушает порт 80, то после установки nginx вывалятся ошибки:

 Обрабатываются триггеры для ureadahead ... ureadahead will be reprofiled on next reboot Настраивается пакет nginx (1.2.7-1~precise) ... nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] still could not bind() invoke-rc.d: initscript nginx, action "start" failed. 

Узнаём, что у нас на порту 80:

 sudo netstat -lnp|grep :80 
 eugene@eugene:~$ sudo netstat -lnp|grep :80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5557/apache2 

Видим, что действительно это apache2 уже слушает порт 80.

Тогда стопим apache, потом перезапускаем nginx.

 sudo service apache2 stop sudo service nginx restart 
 eugene@eugene:~$ sudo service nginx restart * Restarting nginx ngin [ OK ] 

2. Установка PHP-FPM


 sudo apt-get install php5-cli php5-common php5-mysql php5-fpm php-pear 

Нам необходимо устранить уязвимость PHP:

 sudo vim /etc/php5/fpm/php.ini 

Находим строку:

 ;cgi.fix_pathinfo = 1 

Приводим ее к виду:

 cgi.fix_pathinfo = 0 

Сохраняем изменения и перезапустим PHP-FPM:

 sudo /etc/init.d/php5-fpm restart 

3. Создадим виртуальный хост Nginx

Директория для всех сайтов у меня /var/www/. Вы можете выбрать любую, главное чтобы у nginx`а был доступ в эту директорию. Расположение сайтов, например сайт test:

  • /var/www/test/www — корневая директория
  • /var/log/nginx — access и error logs сайта test

 

Настаиваем первый виртуальный хост Nginx, назовем его test

 sudo vim /etc/nginx/conf.d/test.conf 

Содержимое файла /etc/nginx/conf.d/test.conf (Здесь я привожу только базовые настройки, чтобы работало, если нужно добавить что-то дополнительно, то вы сделаете это сами, исходя из ваших задач)

 server {  listen 80; # какой порт слушает  root /var/www/test/www; # корневая директория   access_log /var/log/nginx/test.access.log; #расположение логов данного хоста  error_log /var/log/nginx/test.error.log;   server_name test www.test;   location / {  index index.php index.html index.htm;  }   location ~ .php$ {  fastcgi_pass 127.0.0.1:9000;  fastcgi_index index.php;  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  include fastcgi_params;  } } 

Обращаю внимание! Все виртуальные хосты должны иметь в названии расширение .conf, иначе виртуальный хост не будет загружен.

Создадим тестовый файл, чтобы проверить работоспособность PHP5:

 vim /var/www/test/www/index.php 

С содержимым:

 <?php  phpinfo(); 

Перезапустим Nginx, чтобы изменения вступили в силу:

 sudo /etc/init.d/nginx restart 

Не зыбываем прописать в /etc/hosts

 127.0.0.1 test 

Переходим по тестовому адресу http://test/index.php или http://test/. Получаем вывод phpinfo(). Если у вас при этом ошибка 502, то читаем ниже как исправить. А здесь нас интересует строка Server API, в ней указывается, кто у нас обрабатывает скрипты PHP.

phpinfo()

Возможные ошибки конфигурации nginx с php-fpm

502 Bad Gateway — если код ошибки 502, заменяем строку (listen = ..) в файле /etc/php5/fpm/pool.d/www.conf


 listen = /var/run/php5-fpm.sock #эту строку заменяем на следующую: listen = 127.0.0.1:9000 

После этого не забываем сделать restart php5-fpm. Ошибки 502 больше быть не должно.

Параметры, поддерживаемые командной строкой nginx

Nginx поддерживает следующие параметры:

 -c файл — указывает использовать конфигурационный файл файл вместо файла по умолчанию. -g — задаёт глобальные директивы конфигурации, например, nginx -g "pid /var/run/nginx.pid; worker_processes `sysctl -n hw.ncpu`;" -t — тестировать конфигурацию. nginx проверяет синтаксическую правильность конфигурации, а затем пытается открыть файлы, описанные в конфигурации. -v — показать версию nginx. -V — показать версию nginx, версию компилятора и параметры конфигурации сборки.

 

jeka.by

Сохраним настройки по-умолчанию

# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old # cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.old

Глобальные настройки nginx

Файл /etc/nginx/nginx.conf:

user nginx;  worker_processes 1;    timer_resolution 100ms;  .    
g/nginx/error.log; # Caches information about open FDs, freqently accessed files. open_file_cache max=200000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; # Базовые настройки client_max_body_size 20m; client_body_buffer_size 128k; types_hash_max_size 2048; sendfile on; tcp_nopush on; tcp_nodelay on; # Timeout for keep-alive connections. Server will close connections after this time. keepalive_timeout 65; # Number of requests a client can make over the keep-alive connection. keepalive_requests 1000; # Allow the server to close the connection after a client stops responding. reset_timedout_connection on; # При ошибках не говорим версию nginx server_tokens off; gzip on; # Включаем сжатие gzip_disable "MSIE [1-6].(?!.*SV1)"; gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript; gzip_vary on; fastcgi_cache_use_stale error timeout invalid_header http_500; fastcgi_cache_bypass $cookie_session $http_x_update; fastcgi_no_cache $cookie_session $http_x_update; expires -1; # Внимание!!! Эта строка expires необходима! add_header Last-Modified $sent_http_Expires; fastcgi_read_timeout 180; include /etc/nginx/conf.d/*.conf; include /etc/nginx/vhosts.d/*.conf; }

  • Более подробно про сжатие: ngx_http_gzip_module
  • worker_processes: : один рабочий процесс на одно ядро процессора (cat /proc/cpuinfo | grep processor)
  • client_max_body_size и client_body_buffer_size: ограничение на размер передаваемых данных сервером nginx (ошибка 413: «Request Entity Too Large»)

Настройки виртуального хоста

Файл: /etc/nginx/vhosts.d/example.com.conf:

# Переадресация с www  server {   listen 80;   server_name www.example.com;   rewrite ^ http://example.com$request_uri? permanent;  }    server {   listen 80;   server_name example.com *.example.com;   root /var/www/example.com;      access_log /var/log/nginx/example.com-access.log;   error_log /var/log/nginx/example.com-error.log;     index index.php index.html index.htm;   charset UTF-8;      # Преобразуем в красивый адрес http://example.com/sitemap.xml   location ~* /sitemap.xml {   	rewrite ^ /index.php?option=com_xmap&view=xml&tmpl=component&id=1 last;   }      # Если нужно чтото запретить   location /component/jcomments/feed {    	return 404;   }      location / {   try_files $uri $uri/ /index.php?$args;   }      # Запретить запуск скриптов из директорий   location ~* /(images|cache|media|logs|tmp)/.*.(php|pl|py|jsp|asp|sh|cgi)$ {  	return 403;   error_page 403 /403_error.html;   }      # Передаём обработку PHP-скриптов PHP-FPM   location ~ .php$ {   	fastcgi_pass 127.0.0.1:9000;  	fastcgi_index index.php;  	fastcgi_intercept_errors on;   	include fastcgi_params;  	# Путь к скрипту, который будет передан в php-fpm   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;   fastcgi_ignore_client_abort off;   }      location ~* ^.+.(ico|jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {   access_log off;  	add_header Cache-Control public;  	expires 7776000;   }      # Закрываем доступ к скрытым файлами (например к .htaccess и .htpassword)   location ~ /. {    	access_log off;   	log_not_found off;   deny all;   }  }  

Настройка php-fpm

Общий пул для всех сайтов, файл /etc/php-fpm.d/www.conf:

[www]  listen = 127.0.0.1:9000  listen.allowed_clients = 127.0.0.1  user = apache  group = apache  pm = dynamic  pm.max_children = 7  ; The number of child processes created on startup.  ; Note: Used only when pm is set to 'dynamic'  ; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2  pm.start_servers = 3  pm.min_spare_servers = 2  pm.max_spare_servers = 4  pm.max_requests = 200  request_terminate_timeout = 60s  request_slowlog_timeout = 10s  slowlog = /var/log/php-fpm/www-slow.log  php_flag[display_errors] = off  php_admin_value[error_log] = /var/log/php-fpm/www-error.log  php_admin_flag[log_errors] = on  php_admin_value[memory_limit] = 128M  php_value[session.save_handler] = files  php_value[session.save_path] = /var/lib/php/session  

Опытным путем определим максимальное количество процессов PHP-FPM, которое можем себе позволить (параметр pm.max_children). Для этого создадим нагрузку на web-сервер и посмотрим сколько памяти будут занимать процессы PHP-FPM (утилитами top или htop).

Допустим, решено выделить серверу PHP-FPM — 200 Мб оперативной памяти, в среднем один процесс занимает 20 Мб, тогда максимальное количество будет:

 pm.max_children = 200 / 23 = 8  

Добавляем все в автозапуск

# chkconfig nginx on # chkconfig php-fpm on

itzx.ru

Прежде всего, следует открыть файл «/etc/php5/fpm/php.ini» для редактирования, например, командой

sudo nano /etc/php5/fpm/php.ini

после чего, найти строчку содержащую «cgi.fix_pathinfo», которая по-умолчанию выглядит так (закомментирована)

;cgi.fix_pathinfo = 1

и привести её к виду

cgi.fix_pathinfo = 0

Это призвано устранить опасность неправильно трактования (и возникающей уязвимости) запросов вида «/image.gif/foo.php» (см. Don’t trust the tutorials: check your configuration!, Nginx 0day exploit for nginx + fastcgi PHP).

Если планируется загрузка больших файлов (важно для ownCloud версий < 8, в новой версии 8 и выше имеется отдельный файл для этих настроек), то можно увеличить максимальный объем загружаемых данных, например, до 200 МБ

post_max_size = 200M

и ниже

upload_max_filesize = 200M

Затем сохранить изменения в файле.

Далее, необходимо отрыть для редактирования файл «/etc/php5/fpm/pool.d/www.conf», например, командой

sudo nano /etc/php5/fpm/pool.d/www.conf

найти строчку с параметров «security.limit_extensions» и привести её к виду

security.limit_extensions = .php .php3 .php4 .php5

Эта настройка ограничит выполнение файлов по расширению имени. В этом же файле найти строчку с параметром «listen» и привести её к виду

listen = /var/run/php5-fpm.sock

Это определит файл для связи «Nginx» с «PHP-FPM» (сокет). В целях безопасности запрещаем какой-попало программе писать в сокет (см. Обновление PHP 5.5.12 с устранением уязвимости в PHP-FPM ) путём указания прав доступа к сокету. Находим строчки с описанием параметров «listen.owner», «listen.group» и «listen.mode» (по-умолчанию они закомментированы) и приводим их к виду

listen.owner = www-data listen.group = www-data listen.mode = 0660

Следует сохранить изменения в файле и перезапустить «PHP-FPM», например, командой

sudo service php5-fpm restart

Можно убедится в том, что права доступа к сокету установлены верно:

ls -la /var/run/php5-fpm.sock

Права доступа должны быть «srw-rw—-», владелец «www-data» (группа «www-data»), например,

srw-rw---- 1 www-data www-data 0 May 2 16:36 /var/run/php5-fpm.sock

help.ubuntu.ru

Введение

Ранее я рассказывал о настройке nginx и php-fpm. В принципе, статья полностью актуальна, по ней получится настроить веб сервер, если вас устраивают версии предложенных в стандартном репозитории пакетов. Если же хочется версий посвежее, то читайте далее.

Работать будем на сервере под управлением CentOS 7. Если у вас его еще нет, то читайте мои статьи на тему установки и базовой настройки centos. Не забудьте уделить внимание теме настройки iptables. В данной статье я ее не буду касаться, хотя тема важная для web сервера.

В своей тестовой среде я буду использовать следующие сущности.

hl.zeroxzed.ru имя тестового виртуального хоста и сайта
/web/sites директория для размещения виртуальных хостов
 95.169.190.64  внешний ip адрес сервера
 p1m2a.zeroxzed.ru  имя виртуального хоста для phpmyadmin

Подопытным сервером будет выступать виртуальная машина от keyweb, расположенная на сервере в Германии. Характеристики следующие:

Процессор 2 ядра
Память 8 Gb
Диск 150 Gb SSD

Указанный сервер включает в себя администрирование. То есть вы можете его заказать и прислать в техподдержку ссылку на эту статью. Они за вас все настроят. Если все же хотите настраивать сами, то берите сервер из линейки PRO. Они дешевле, но настраивать все придется самому. Чем я и займусь 🙂

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

Для установки самой свежей стабильной версии nginx на centos подключим родной репозиторий.

# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Если по какой-то причине ссылка изменится или устареет, то можно создать файл с конфигурацией репозитория nginx вручную. Для этого рисуем такой конфиг /etc/yum.repos.d/nginx.repo.

[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1

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

# yum install nginx

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

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

# systemctl start nginx # systemctl enable nginx

Проверяем, запустился ли web сервер. Для этого идем по ссылке http://95.169.190.64/. Вы должны увидеть стандартную страницу заглушку.

Проверка nginx

Если страница не открывается, то скорее всего вы не настроили firewall. Свою статью по его настройке я приводил в самом начале.

Настройка nginx

Расскажу, как настроить nginx для работы разных виртуальных хостов. Создадим виртуальный хост и подготовим директории для размещения исходников сайта и панели управления phpmyadmin.

# mkdir -p /web/sites/hl.zeroxzed.ru/www && mkdir /web/sites/hl.zeroxzed.ru/log # mkdir -p /web/sites/p1m2a.zeroxzed.ru/www && mkdir /web/sites/p1m2a.zeroxzed.ru/log

Создадим конфиги nginx для этих виртуальных хостов. Я сразу буду делать их с учетом https, который мы настроим позже. Так что после создания не надо перезапускать веб сервер и проверять работу — будут ошибки. Виртуальный хост сайта показан на примере wordpress. Конфигурация собрана на основе рекомендаций из официальной документации конкретно для веб сервера nginx.

# mcedit /etc/nginx/conf.d/hl.zeroxzed.ru.conf
server {  listen 80;  server_name hl.zeroxzed.ru;  root /web/sites/hl.zeroxzed.ru/www/;  index index.php index.html index.htm;  access_log /web/sites/hl.zeroxzed.ru/log/access.log main;  error_log /web/sites/hl.zeroxzed.ru/log/error.log;   location / {  return 301 https://hl.zeroxzed.ru$request_uri;  }   location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {  return 301 https://hl.zeroxzed.ru$request_uri;  }   location ~ .php$ {  return 301 https://hl.zeroxzed.ru$request_uri;  }   location = /favicon.ico {  log_not_found off;  access_log off;  }   location = /robots.txt {  rewrite ^ /robots.txt break;  allow all;  log_not_found off;  access_log off;  }   location ~ /.ht {  deny all;  } }  server {  listen 80;  server_name www.hl.zeroxzed.ru;  rewrite ^ https://hl.zeroxzed.ru$request_uri? permanent; }  server {  listen 443 ssl http2;  server_name hl.zeroxzed.ru;  root /web/sites/hl.zeroxzed.ru/www/;  index index.php index.html index.htm;  access_log /web/sites/hl.zeroxzed.ru/log/ssl-access.log main;  error_log /web/sites/hl.zeroxzed.ru/log/ssl-error.log;   keepalive_timeout		60;  ssl_certificate		/etc/letsencrypt/live/hl.zeroxzed.ru/fullchain.pem;  ssl_certificate_key		/etc/letsencrypt/live/hl.zeroxzed.ru/privkey.pem;  ssl_protocols 		TLSv1 TLSv1.1 TLSv1.2;  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';  ssl_dhparam 		/etc/ssl/certs/dhparam.pem;  add_header			Strict-Transport-Security 'max-age=604800';   location / {  try_files $uri $uri/ /index.php?$args;  }   location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {  access_log off;  expires max;  }   location ~ .php$ {  try_files $uri =404;  fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;  #fastcgi_pass 127.0.0.1:9000;  fastcgi_index index.php;  fastcgi_param DOCUMENT_ROOT /web/sites/hl.zeroxzed.ru/www/;  fastcgi_param SCRIPT_FILENAME /web/sites/hl.zeroxzed.ru/www$fastcgi_script_name;  fastcgi_param PATH_TRANSLATED /web/sites/hl.zeroxzed.ru/www$fastcgi_script_name;  include fastcgi_params;  fastcgi_param QUERY_STRING $query_string;  fastcgi_param REQUEST_METHOD $request_method;  fastcgi_param CONTENT_TYPE $content_type;  fastcgi_param CONTENT_LENGTH $content_length;  fastcgi_param HTTPS on;  fastcgi_intercept_errors on;  fastcgi_ignore_client_abort off;  fastcgi_connect_timeout 60;  fastcgi_send_timeout 180;  fastcgi_read_timeout 180;  fastcgi_buffer_size 128k;  fastcgi_buffers 4 256k;  fastcgi_busy_buffers_size 256k;  fastcgi_temp_file_write_size 256k;  }   location = /favicon.ico {  log_not_found off;  access_log off;  }   location = /robots.txt {  allow all;  log_not_found off;  access_log off;  }   location ~ /.ht {  deny all;  } }  server {  listen 443 ssl http2;  server_name www.hl.zeroxzed.ru;  rewrite ^ https://hl.zeroxzed.ru$request_uri? permanent; } 

В данной конфигурации настроены все необходимые редиректы, при этом отключен редирект файла robots.txt. Он отдельно отдается по http и https. Это требуется для яндекса во время перехода с http на https и склейки зеркал.

Для phpmyadmin рисуем конфиг попроще.

# mcedit /etc/nginx/conf.d/p1m2a.zeroxzed.ru.conf
server {  listen 443 ssl http2;  server_name p1m2a.zeroxzed.ru;  root /web/sites/p1m2a.zeroxzed.ru/www/;  index index.php index.html index.htm;  access_log /web/sites/p1m2a.zeroxzed.ru/log/ssl-access.log main;  error_log /web/sites/p1m2a.zeroxzed.ru/log/ssl-error.log;   keepalive_timeout		60;  ssl_certificate		/etc/letsencrypt/live/p1m2a.zeroxzed.ru/fullchain.pem;  ssl_certificate_key		/etc/letsencrypt/live/p1m2a.zeroxzed.ru/privkey.pem;  ssl_protocols 		TLSv1 TLSv1.1 TLSv1.2;  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';  ssl_dhparam 		/etc/ssl/certs/dhparam.pem;  add_header			Strict-Transport-Security 'max-age=604800';   location ~ .php$ {  fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;  #fastcgi_pass 127.0.0.1:9000;  fastcgi_index index.php;  fastcgi_param DOCUMENT_ROOT /web/sites/p1m2a.zeroxzed.ru/www/;  fastcgi_param SCRIPT_FILENAME /web/sites/p1m2a.zeroxzed.ru/www$fastcgi_script_name;  fastcgi_param PATH_TRANSLATED /web/sites/p1m2a.zeroxzed.ru/www$fastcgi_script_name;  include fastcgi_params;  fastcgi_param QUERY_STRING $query_string;  fastcgi_param REQUEST_METHOD $request_method;  fastcgi_param CONTENT_TYPE $content_type;  fastcgi_param CONTENT_LENGTH $content_length;  fastcgi_intercept_errors on;  fastcgi_ignore_client_abort off;  fastcgi_connect_timeout 60;  fastcgi_send_timeout 180;  fastcgi_read_timeout 180;  fastcgi_buffer_size 128k;  fastcgi_buffers 4 256k;  fastcgi_busy_buffers_size 256k;  fastcgi_temp_file_write_size 256k;  } }  server {  listen 443 ssl http2;  server_name www.p1m2a.zeroxzed.ru;  rewrite ^ https://p1m2a.zeroxzed.ru$request_uri? permanent; }  server {  listen 80;  server_name p1m2a.zeroxzed.ru;  root /web/sites/p1m2a.zeroxzed.ru/www/;  index index.php index.html index.htm;  access_log /web/sites/p1m2a.zeroxzed.ru/log/access.log main;  error_log /web/sites/p1m2a.zeroxzed.ru/log/error.log;   location / {  return 301 https://p1m2a.zeroxzed.ru$request_uri;  try_files $uri $uri/ /index.php?$args;  } } 

Сохраняем конфиги виртуальных хостов nginx и продолжаем настройку производительного веб сервера.

Установка php-fpm 7.1

Установка и настройка 7-й версии php на centos не очень простая задача. Ранее я уже рассказывал как обновить php до 7-й версии, но в итоге откатился назад. Прошло прилично времени и откатываться уже не будем, так как большинство проблем исправлены.

Основные трудности возникают с тем, что в официальных репозиториях очень старые версии php, но при этом они часто есть в зависимостях к другим пакетам. В итоге, обновившись неаккуратно до 7.1 можно получить проблемы с установкой и обновлением, к примеру, phpmyadmin или zabbix. В комментариях к моим статьям я иногда вижу эти ошибки и по тексту ошибок сразу понимаю, что проблема с зависимостями.

Вторая проблема в том, что надо определить, какой репозиторий использовать для установки php7. Их существует очень много. К примеру, мой хороший знакомый в своей статье по настройке web сервера использует репозиторий Webtatic. В принципе, чтобы просто поставить php 7-й версии это нормальный вариант. Но если вы после этого захотите установить phpmyadmin через yum уже ничего не получится. Будет ошибка зависимостей, которые нужно будет как-то руками разбирать.

То же самое будет и с другими пакетами. К примеру, zabbix без плясок с бубнами скорее всего не встанет. В сторонних репозиториях есть еще одна проблема. Иногда они закрываются. И это станет для вас большой проблемой на боевом сервере. Так что к выбору репозитория нужно подходить очень аккуратно и внимательно. Я до сих пор иногда встречаю настроенные сервера centos 5 с очень популярным в прошлом репозиторием centos.alt.ru, который закрылся. Сейчас это уже не так актуально, так как таких серверов осталось мало, но некоторое время назад мне это доставляло серьезные неудобства.

Для установки свежей версии php я буду использовать репозиторий Remi. Это известный и популярный репозиторий, который ведет сотрудник RedHat. И хотя надежность репозитория, который ведет один человек не так высока, но ничего лучше и надежнее remi лично я не нашел для своих целей. Если вы можете что-то посоветовать на этот счет — комментарии в вашем распоряжении. Буду благодарен за дельный совет.

Подключаем remi репозиторий для centos 7.

# rpm -Uhv http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Я получил ошибку:

Retrieving http://rpms.remirepo.net/enterprise/remi-release-7.rpm warning: /var/tmp/rpm-tmp.nwcDV1: Header V4 DSA/SHA1 Signature, key ID 00f97f56: NOKEY error: Failed dependencies:   epel-release = 7 is needed by remi-release-7.3-2.el7.remi.noarch

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

# yum install epel-release

После этого повторяем установку remi, все должно пройти нормально. Проверим список подключенных репозиториев.

# yum repolist

Список репозиториев

У меня такая картинка получилась.

Активируем репу remi-php71, для этого выполняем команду:

# yum-config-manager --enable remi-php71

Если получаете ошибку:

bash: yum-config-manager: command not found

то установите пакет yum-utils.

# yum install yum-utils

Теперь устанавливаем php7.1.

# yum install php71

Установка php 7.1 на CentOS 7

Установим php-fpm и наиболее популярные модули, которые могут пригодится в процессе эксплуатации веб сервера.

# yum install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip

Установка php-fpm

Запускаем php-fpm и добавляем в автозагрузку.

# systemctl start php-fpm # systemctl enable php-fpm

Проверяем, запустился ли он.

# netstat -tulpn | grep php-fpm tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 9084/php-fpm: maste

Все в порядке, повис на порту 9000. Запустим его через unix сокет. Для этого открываем конфиг /etc/php-fpm.d/www.conf и комментируем строку:

;listen = 127.0.0.1:9000

Вместо нее добавляем несколько других:

listen = /var/run/php-fpm/php-fpm.sock listen.mode = 0660 listen.owner = nginx listen.group = nginx

Заодно измените пользователя, от которого будет работать php-fpm. Вместо apache укажите nginx.

user = nginx group = nginx

Перезапускаем php-fpm.

# systemctl restart php-fpm

Проверяем, стартовал ли указанный сокет.

# ll /var/run/php-fpm/php-fpm.sock  srw-rw----. 1 nginx nginx 0 Oct 26 18:08 /var/run/php-fpm/php-fpm.sock

На текущий момент с настройкой php-fpm закончили, двигаемся дальше.

Для того, чтобы проверить работу нашего веб сервера, нужно установить ssl сертификаты. Без них nginx с текущим конфигом не запустится. Исправляем это.

Настройка бесплатного ssl сертификата Lets Encrypt

Устанавливаем пакет certbot для получения бесплатного ssl сертификата от let’s encrypt.

# yum install certbot

Запускаем программу для генерации сертификата.

# certbot certonly

Вам в консоли будут заданы несколько вопросов. Вот мои ответы, необходимые для успешного получения сертификата. Первый раз мы получим сертификаты, используя временный веб сервер самого certbot, так как наш еще не работает. Далее обновлять сертификаты будем в автоматическом режиме с помощью временной директории в корне виртуального хоста.

# certbot certonly Saving debug log to /var/log/letsencrypt/letsencrypt.log  How would you like to authenticate with the ACME CA? ------------------------------------------------------------------------------- 1: Spin up a temporary webserver (standalone) 2: Place files in webroot directory (webroot) ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1 Plugins selected: Authenticator standalone, Installer None Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): zeroxzed@gmail.com Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org  ------------------------------------------------------------------------------- Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree in order to register with the ACME server at https://acme-v01.api.letsencrypt.org/directory ------------------------------------------------------------------------------- (A)gree/(C)ancel: A  ------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o: N Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): hl.zeroxzed.ru Obtaining a new certificate Performing the following challenges: tls-sni-01 challenge for hl.zeroxzed.ru Waiting for verification... Cleaning up challenges  IMPORTANT NOTES:  - Congratulations! Your certificate and chain have been saved at:  /etc/letsencrypt/live/hl.zeroxzed.ru/fullchain.pem  Your key file has been saved at:  /etc/letsencrypt/live/hl.zeroxzed.ru/privkey.pem  Your cert will expire on 2018-01-24. To obtain a new or tweaked  version of this certificate in the future, simply run certbot  again. To non-interactively renew *all* of your certificates, run  "certbot renew"  - Your account credentials have been saved in your Certbot  configuration directory at /etc/letsencrypt. You should make a  secure backup of this folder now. This configuration directory will  also contain certificates and private keys obtained by Certbot so  making regular backups of this folder is ideal.  - If you like Certbot, please consider supporting our work by:   Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate  Donating to EFF: https://eff.org/donate-le 

Для успешного создания бесплатных ssl сертификатов от lets encrypt у вас должны быть корректно настроены DNS записи для доменов, на которые выпускаются сертификаты.

Итак, сертификаты получили. Теперь можно проверить конфигурацию nginx и запустить его. Проверяем конфиг:

# nginx -t

Если получаете ошибку:

nginx: [emerg] BIO_new_file("/etc/ssl/certs/dhparam.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/ssl/certs/dhparam.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file) nginx: configuration file /etc/nginx/nginx.conf test failed

То генерируете необходимый ключ:

# openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Генерация будет длиться долго (у меня 20 минут длилось на двух ядрах). Снова проверяйте конфигурацию. Если ошибок нет, то перезапустим nginx.

# systemctl restart nginx

Настройка nginx на этом завершена. Он должен корректно запуститься и работать в рабочем режиме.

Теперь сделаем так, чтобы сертификаты автоматически обновлялись перед истечением срока действия. Для этого необходимо изменить конфигурации доменов. Они располагаются в директории /etc/letsencrypt/renewal. Так как мы генерировали сертификаты с помощью временного веб сервера, наш текущий конфиг hl.zeroxzed.ru.conf выглядит вот так:

# renew_before_expiry = 30 days version = 0.18.1 archive_dir = /etc/letsencrypt/archive/hl.zeroxzed.ru cert = /etc/letsencrypt/live/hl.zeroxzed.ru/cert.pem privkey = /etc/letsencrypt/live/hl.zeroxzed.ru/privkey.pem chain = /etc/letsencrypt/live/hl.zeroxzed.ru/chain.pem fullchain = /etc/letsencrypt/live/hl.zeroxzed.ru/fullchain.pem  # Options used in the renewal process [renewalparams] authenticator = standalone installer = None account = e9c86e6aa57b45f9614bc7c0015927a5

Приводим его к следующему виду:

# renew_before_expiry = 30 days version = 0.18.1 archive_dir = /etc/letsencrypt/archive/hl.zeroxzed.ru cert = /etc/letsencrypt/live/hl.zeroxzed.ru/cert.pem privkey = /etc/letsencrypt/live/hl.zeroxzed.ru/privkey.pem chain = /etc/letsencrypt/live/hl.zeroxzed.ru/chain.pem fullchain = /etc/letsencrypt/live/hl.zeroxzed.ru/fullchain.pem  # Options used in the renewal process [renewalparams] authenticator = webroot installer = None account = e9c86e6aa57b45f9614bc7c0015927a5 post_hook = nginx -s reload [[webroot_map]] www.hl.zeroxzed.ru = /web/sites/hl.zeroxzed.ru/www hl.zeroxzed.ru = /web/sites/hl.zeroxzed.ru/www

По аналогии делаете с остальными виртуальными хостами, для которых используете бесплатные сертификаты let’s encrypt. Осталось дело за малым — настроить автоматический выпуск новых ssl сертификатов, взамен просроченным. Для этого добавляем в /etc/crontab следующую строку:

# Cert Renewal 30 2 * * * root /usr/bin/certbot renew --post-hook "nginx -s reload" >> /var/log/le-renew.log

Все, с сертификатами закончили. Двигаемся дальше в настройке web сервера.

Установка mariadb 10 на CentOS 7

Дошла очередь до установки сервера баз данных для web сервера на CentOS 7 — MariaDB. По аналогии с другим софтом, в официальном репозитории очень старая версия mariadb — 5.5. Я же буду устанавливать последнюю стабильную версию на момент написания статьи — 10.2.

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

В моем случае конфиг получился следующий.

# cat /etc/yum.repos.d/mariadb.repo
[mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.2/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1

Устанавливаем последнюю версию mariadb на centos.

# yum install MariaDB-server MariaDB-client

Установка MariaDB 10 на web сервер

Убедитесь, что база данных ставится из нужного репозитория.

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

# systemctl start mariadb # systemctl enable mariadb

Запускаем скрипт начальной конфигурации mysql и задаем пароль для root. Все остальное можно оставить по-умолчанию.

# /usr/bin/mysql_secure_installation

Сервер баз данных mysql для нашего web сервера готов. Продолжаем настройку. Установим панель управления mysql — phpmyadmin.

Установка phpmyadmin

Кратко расскажу про установку phpmyadmin в контексте данной статьи. Подробно не буду останавливаться на этом, так как статья и так получается очень объемная, а я еще не все рассказал. Вопрос настройки phpmyadmin я очень подробно рассмотрел отдельно. За подробностями можно сходить туда.

Устанавливаем phpmyadmin через yum. Если ранее все сделали правильно, то конфликтов с зависимостями быть не должно.

# yum install phpmyadmin

Установка phpmyadmin на nginx и php-fpm

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

# rm -df /web/sites/p1m2a.zeroxzed.ru/www # ln -s /usr/share/phpMyAdmin /web/sites/p1m2a.zeroxzed.ru/www

Выставляем правильные права на директорию с php сессиями. Без этого работать phpmyadmin не будет.

# chown nginx:nginx /var/lib/php/session/

Можно заходить и проверять работу phpmyadmin. Ее установка закончена.

Доступ к сайту по sftp

Настройка сервера почти завершена. Если вы администратор и единственный пользователь, то больше можно ничего не делать. Вы и так сможете загрузить на сервер все что нужно тем или иным способом. Если же вы будете передавать управление сайтами другим людям, им нужен доступ к директории с исходниками сайта. Раньше для этих целей повсеместно использовали ftp. Если вы хотите так сделать, у меня есть статья по настройке ftp сервера vsftpd.

Я же предлагаю использовать sftp по нескольким причинам:

  1. Он безопаснее.
  2. Его быстрее настроить.
  3. Не надо отдельно настраивать firewall.

Статью по настройке sftp доступа я уже тоже писал, все подробности там. Здесь без комментариев выполним необходимые действия.

Создаем пользователя для подключения к сайту. Я обычно использую имя пользователя пересекающееся с названием сайта. Так удобнее управлять.

# useradd -s /sbin/nologin hl.zeroxzed.ru # passwd hl.zeroxzed.ru

Открываем конфиг ssh по пути /etc/ssh/sshd_config и комментируем там одну строку, добавляя далее несколько новых.

#Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp Match User hl.zeroxzed.ru ChrootDirectory /web/sites/hl.zeroxzed.ru ForceCommand internal-sftp

Перезапускаем службу sshd.

# systemctl restart sshd

Этого уже достаточно, чтобы вы могли подключиться к сайту, к примеру, с помощью программы winscp. Если что-то пойдет не так и будут какие-то ошибки, то смотреть подробности нужно в логе /var/log/secure. Но тут возникает много нюансов с правами к файлам и директориям. Дальше я расскажу, как их аккуратно и грамотно разрулить, чтобы у нас не было проблем с дальнейшей работой сайтов от разных пользователей.

Работа с сайтами разных пользователей на одном веб сервере

Самый простой способ решить проблему с правами доступа, это сделать владельцем папки с сайтом пользователя, который подключается по sftp. Тогда он сможет нормально работать с файлами, загружать и удалять их. Если доступ в качестве группы установить для nginx, то в целом все будет работать. Для каких-то сайтов такой вариант может оказаться подходящим. То есть сделать надо вот так:

# chown -R hl.zeroxzed.ru:nginx /web/sites/hl.zeroxzed.ru/ # chmod -R 0775 /web/sites/hl.zeroxzed.ru/

Но при такой схеме будут проблемы с движками сайтов, которые автоматом что-то к себе загружают. Какие-то галереи не будут работать. К примеру, wordpress не сможет автоматически загружать плагины, будет просить доступ к ftp. В общем, могут возникнуть некоторые неудобства. Сейчас мы их исправим.

Еще обращаю внимание на один нюанс. Chroot доступ для sftp не будет работать, если владельцем директории, куда чрутимся, будет не root. Только что мы сделали владельцем каталога с сайтом и всего, что внутри него пользователя hl.zeroxzed.ru. Теперь надо вернуть обратно владельцем исходного каталога рута, а все, что внутри него остается как мы и хотим — будет принадлежать hl.zeroxzed.ru.

# chown root:root /web/sites/hl.zeroxzed.ru/ # chmod 0755 /web/sites/hl.zeroxzed.ru/

А теперь сделаем все красиво. Назначаем владельцем содержимого нашего сайта только отдельного пользователя.

# chown -R hl.zeroxzed.ru:hl.zeroxzed.ru /web/sites/hl.zeroxzed.ru/

Возвращаем обратно рута владельцем корня chroot.

# chown root:root /web/sites/hl.zeroxzed.ru/ # chmod 0755 /web/sites/hl.zeroxzed.ru/

Обращаю внимание, что сначала мы рекурсивно назначаем права на все содержимое директорий, а потом возвращаем владельца root только на корень.

Добавляем пользователя nginx в группу hl.zeroxzed.ru.

# usermod -aG hl.zeroxzed.ru nginx

Создаем отдельный pool для php-fpm, который будет обслуживать сайт hl.zeroxzed.ru и будет запускаться от этого пользователя. Для этого копируем существующий конфиг /etc/php-fpm.d/www.conf и изменяем в нем несколько строк.

# cd /etc/php-fpm.d && cp www.conf hl.zeroxzed.ru.conf
[hl.zeroxzed.ru] user = hl.zeroxzed.ru group = hl.zeroxzed.ru listen = /var/run/php-fpm/hl.zeroxzed.ru.sock listen.owner = hl.zeroxzed.ru listen.group = hl.zeroxzed.ru

Мы поменяли название пула, запустили его от отдельного пользователя и назначили ему отдельный сокет. Теперь идем в настройки этого виртуального хоста в nginx — /etc/nginx/conf.d/hl.zeroxzed.ru.conf и везде меняем старое значение сокета

fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

на новое

fastcgi_pass unix:/var/run/php-fpm/hl.zeroxzed.ru.sock;

Перезапускаем nginx и php-fpm и проверяем работу сайта от отдельного пользователя.

# systemctl restart nginx # systemctl restart php-fpm

Я рекомендую подключиться по sftp, закинуть исходники wordpress, установить его и добавить новую тему, чтобы проверить, что все корректно работает.  По аналогии проделанные выше действия повторяются для всех остальных сайтов.

Ротация логов виртуальных хостов

Последний штрих в настройке web сервера — ротация логов виртуальных хостов. Если этого не сделать, то через какое-то, обычно продолжительное, время возникает проблема в связи с огромным размером лог файла.

У нас уже будет файл конфигурации logrotate для nginx, который был создан во время установки — /etc/logrotate.d/nginx. Приведем его к следующему виду:

/var/log/nginx/*log /web/sites/p1m2a.zeroxzed.ru/log/*log {   create 0644 nginx nginx  size=1M  rotate 10  missingok  notifempty  compress  sharedscripts  postrotate  /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true  endscript }  /web/sites/hl.zeroxzed.ru/log/*log {   create 0644 hl.zeroxzed.ru hl.zeroxzed.ru  size=1M  rotate 10  missingok  notifempty  compress  sharedscripts  postrotate  /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true  endscript } 

Я предлагаю ротировать файлы логов по достижению ими размера в 1Мб, сжимать после ротации и хранить 10 архивов с логом. Для виртуальных хостов, работающих от отдельного пользователя, новые логи создаются сразу с соответствующими правами, чтобы у пользователя был доступ к ним. Для всех остальных хостов можно использовать самое первое правило, просто добавляя туда новые пути для логов.

Это просто пример конфигурации. Все параметры вы можете поменять по своему усмотрению. Примеров конфигурации logrotate в интернете много.

На этом все. Я рассмотрел все основные моменты, которые необходимы для установки и настройки производительного web сервера на основе nginx и php-fpm последних версий. При этом рассказал о некоторых вещах, которые повышают удобство и гибкость эксплуатации сервера.

Заключение

Тема настройки веб сервера обширна. Рассмотреть все варианты в одной статье невозможно, так как функционал будет разниться, в зависимости от назначения сервера. Тем не менее приведу еще несколько ссылок на материалы, которые имеют отношение к настройке web сервера:

  • Полный бэкап сервера или отдельных сайтов.
  • Мониторинг веб сервера и веб сайта с помощью zabbix.
  • Защита админки wordpress с помощью fail2ban.
  • Если у вас будут проблемы с ботами, то пригодится статья по блокировке доступа к сайту по странам.

Если еще что-то полезное вспомню, добавлю ссылки. Пока вроде все. Жду комментариев и отзывов. Написал все по своему опыту, как я обычно настраиваю веб сервера. Возможно что-то можно сделать более удобно и правильно.

Эта статья будет первой из цикла статей по настройке современного веб сервера. Далее мы будем защищать web сервер и готовить его к максимальным нагрузкам.

serveradmin.ru

Классической связкой для работы сайтов написанных на php считается apache + mod_php. Так как mod_php по умолчанию требует prefork_mpm, то apache для обработки каждого отдельного соединения создает отдельный процесс, что сильно не экономно с точки зрения расходования оперативной памяти.

Потом появился nginx — легковесный проксирующий веб-сервер и его начали ставить перед apache чтобы он занимался выдачей статики и не беспокоил apache по мелочам. Следующим логичным шагом является выключение из цепочки nginx — apache — php посредника в лице apache, чем мы и займемся.

php-fpm позволяет демонизировать php дабы избежать затрат на запуск процессов (чем страдает CGI) что умеет и FastCGI. Но php-fpm дает также другие полезные возможности:

  • запуск пулов обработчиков от имени заданных пользователей,
  • динамическое управление количеством запущенных обработчиков,
  • возможность перезапуска обработчиков в случае, если с ними что-то не так,
  • ведение лога медленных запросов по аналогии с mysql,
  • страницы статуса и пинга,
  • прочее.

Установка php-fpm в Debian крайне проста:

aptitude install php5-fpm

После чего можно править два конфигурационных файла, которые достаточно хорошо документированы сами по себе, но большое количество слов может также мешать найти за ними суть. Первый (/etc/php5/fpm/php-fpm.conf) позволяет задать общие настройки:

include — из какой директории инклудить дополнительные конфиги,
pid — путь до файла с идентификатором процесса,
error_log — путь до лога ошибок,
syslog.facility — позволяет указать в какой лог писать,
syslog.ident — каким именем помечать записи в системном логе,
log_level — уровень лога от алерта до дебага,

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

emergency_restart_threshold — позволяет задать при каком количестве вылетов процессов с сигналами SIGSEGV или SIGBUS за указанный промежуток времени необходимо мягко перезапустить php-fpm,
emergency_restart_interval — заданный промежуток времени.
process_control_timeout — как долго потомкам ждать от мастера реакции на сигналы,
process.max — максимальное количество процессов для всех пулов,
process.priority — можно указать приоритет мастер-процесса,
daemonize — демонизировать или нет. Может пригодиться для дебага,
rlimit_files — количество доступных для мастер-процесса файловых дескрипторов,
rlimit_core — не осознал,
events.mechanism — в linux однозначно epoll,
systemd_interval — если ваша ос использует systemd, то можно задать периодичность отчетов о состоянии процессов. Будет актуально в Debian 8.

Второй конфиг является базовым для настройки пулов и находится по пути /etc/php5/fpm/pool.d/www.conf. В этом файле можно задать еще больше параметров и все они хорошо документированы в нем. Мы же удалим или переименуем этот файл и создадим свой конфигурационный файл.

Интересно, что в конфиге пула можно использовать имя пула в виде переменной $pool. За счет этого можно создать унифицированный конфигурационный файл и использовать его в качестве основы для новых пулов. Имя пула задается в квадратный скобках и предваряет собой блок параметров. Фактически все пулы можно описать в одном файле, но, кажется, так делать не стоит. Пример конфигурационного файла:

[webpanels]
prefix = /var/www/$pool

user = $pool
group = $pool

listen = /var/run/phpfpm-$pool.sock
listen.owner = $pool
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 16
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4

pm.status_path = /fpmstat

request_slowlog_timeout = 3s
slowlog = /var/www/logs/$pool.slow.log

При необходимости:

access.log = /var/www/logs/$pool.access.log

Разберем параметры:

prefix — позволяет задать путь по умолчанию, который может использоваться в параметрах slowlog, listen, chroot, chdir, php_values, php_admin_values.
user и group — задает владельца и группу запускаемых процессов.
listen — указывает на каком сокете слушать. Поддерживаются как UNIX, так и TCP-сокеты. В случае, если веб-сервер и php-обработчики находятся на одном сервере, то лучше использовать UNIX-сокеты, так как это потенциально быстрее, так как нет оверхеда связанного с генерацией пакетов.
listen.owner, listen.group, listen.mode — позволяют задать параметры доступа к сокету. В качестве владельца указано имя совпадающее с именем пула. Необходимо создать соответствующего пользователя и убедиться, что для него нет ssh-доступа, конечно, если у вас не виртуальный хостинг. Группа указана www-data вследствие того, что под ней работает nginx и необходимо предоставить ему доступ к файлу сокета. Закрыть доступ остальным позволяют права 660.
pm — указывает как менеджер процессов будет управлять количеством дочерних процессов. Может быть статическим (постоянное количество процессов), динамическим (количество процессов может варьироваться в заданных пределах) и по требованию (когда нужно процесс запускается и убивается по истечении таймаута).
pm.max_children — максимальное количество дочерних процессов.
pm.start_servers — сколько процессов запускается при запуске php-fpm.
pm.min_spare_servers — минимальное количество ожидающих процессов. Если процессов меньше, чем значение параметра, то новые процессы будут созданы.
pm.max_spare_servers — максимальное количество ожидающих процессов. Если ожидающих процессов больше, чем значение параметра, то лишние процессы будут убиты.
pm.status_path — путь к странице статуса.
request_slowlog_timeout — время по прошествии которого запрос считается медленным.
slowlog — путь до файла лога медленных запросов.
access.log — путь до файла с логом доступа.

Другие интересные параметры:

pm.max_requests — количество обработанных запросов после которых процесс нужно перезапустить. Позволяет бороться с утечками памяти.
process.priority — задает приоритет процессов данного пула.
chroot — позволяет зачрутить процессы в указанную директорию. Однако все пути используемые php будут действовать относительно указанной директории, что требует дополнительной настройки.
security.limit_extensions — позволяет указать список расширений файлов для обработки php-fpm.

Также можно переопределять переменные окружения, к примеру:

env[TMP] = /tmp

и переопределять параметры из php.ini почти как это делается в .htaccess:

php_flag[display_errors] = off

То есть мы можем настраивать множество параметров php индивидуально для каждого пула.

Кстати говоря, для изменения параметров php можно использовать файл .user.ini в директории сайта.

debian-help.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector