Установка и настройка nginx + php-fpm + MariaDB + phpmyadmin на CentOS 7

Итак, предположим что у вас уже установлена чистая CentOS 7 (минимальная конфигурация). У меня 64-битная, все дальнейшие инструкции будут вестись с учетом того, что и у вас такая же.

Добавление жизненно-необходимых системе репозиториев

Для начала выполним следующие команды:

# обновляемся
yum -y update
# устанавливаем редактор nano (терпеть не могу vim)
yum -y install nano
# смотрим наш список репозиториев
yum repolist
# устанавливаем репозиторий RPMForge
yum -Uhv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
# устанавливаем репозиторий remi
yum -Uhv http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# устанавливаем репозиторий nginx
yum -Uhv http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Репозиторий REMI устанавливается отключенным. Для его подключения в файле /etc/yum.repos.d/remi.repo необходимо поменять значение переменной enabled в секции [remi] c 0 на 1.

На этом подключение дополнительных репозиториев в CentOS 7 можно считать завершенным.

Однако, дополнительно рекомендуется установить и настроить плагин yum: yum-priorities. Применение данного плагина обусловлено тем, что в подключенных дополнительных репозиториях могут содержаться пакеты обновляющие такие из официальных репозиториев, что часто может вызвать проблемы, к примеру несовместимость версии php и вашей CMS. Плагин yum-priorities применяется для упорядочивания приоритетов репозиториев. Пакеты из репозиторя с более низким приоритетом не будут обновлять пакеты, установленные из репозиториев, имеющих более высокий приоритет. Также приоритеты используются и при установке новых пакетов – в том случае, если пакет находится в двух или более репозиториях, он будет установлен из того репозитория, который имеет наивысший приоритет.

yum install -y yum-priorities

После установки плагина добавляем строку priority=10 в первую секцию каждого репо-файла:

/etc/yum.repos.d/rpmforge.repo
/etc/yum.repos.d/remi.repo
/etc/yum.repos.d/nginx.repo

Запускаем еще раз обновление

yum -y update

Немного защитим свой сервер

Меняем стандартный порт SSH на нестандартный.

Для этого откроем файл /etc/ssh/sshd_config и поменяем значение параметра Port 22 на какой вам угодно. В моей конфигурации системы эта строка была закоментирована, если хотим менять значение этого параметра – соответственно мы должны раскоментировать ее.

Устанавливаем фаерволл

yum -y update
yum -y install firewalld

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

systemctl start firewalld
systemctl enable firewalld

Будьте осторожны, фаерволл сразу же будет работать после перезагрузки системы, поэтому не перезагружайте сервер если не уверены что все необходимые порты открыты для управления вашим сервером, например порт SSH, как мы помним, мы его меняли, поэтому не удивляйтесь в случае чего :).

Открываем необходимые порты для доступа из вне

# порт 80 - http сервер
firewall-cmd --permanent --add-port=80/tcp
# порт 1234 - наш порт SSH (в вашем случае это может быть какой угодно порт)
firewall-cmd --permanent --add-port=1234/tcp
# можем добавить также порт 443, в этом случае запросы по https будут проходить на ваш сервер
firewall-cmd --permanent --add-port=443/tcp

Установка и настройка NGINX

Выполним несколько команд:

# установка самого nginx, так как мы уже добавили нужный репозиторий, то нам тут не надо много действий
yum -y install nginx
# запускаем сервис nginx
systemctl start nginx
# добавляем в автозагрузку
systemctl enable nginx
# для того чтобы проверить текущую конфигурацию nginx на синтаксические ошибки - выполним (и на будущее тоже)
nginx -t

Если все ОК – идем дальше, если нет – читайте мануал, настраивайте.

Итак, конфигурация сервера и хостов по умолчанию находится по адресу /etc/nginx/nginx.conf, именно этот файл загружается в память первым, а далее – все то, что в нем прописано. Откроем этот файл и посмотрим откуда виртуальные хосты грузятся: отсюда – /etc/nginx/conf.d/*.conf, то есть, все файлы в этой директории с расширением conf загрузятся. Мы к этому еще вернемся, а пока…

Создадим первый хост

mkdir /www
# в этой директории мы будем хранить все файлы наших хостов,
# будьто это один хост, или несколько...сотен...
cd /www
# параметр -p - создаст все папки и подпапки укзанные в пути,
# следующей командой мы создаем 3 папки: test.com, а в ней logs и public
mkdir -p test.com/logs test.com/public
# с установкой nginx у нас должен был создаться новый пользователь с именем nginx,
# ему и назначаем все права в этой директории и на все подпапки,
# заметьте точку в конце команды, она означает текущую папку
chown -R nginx:nginx .

Всё необходимое для хранения файлов у нас готово, теперь приступим к конфигурации nginx

# заходим в папку с виртуальными хостами nginx
cd /etc/nginx/conf.d/
# создаем новый файл для нашего хоста test.com
nano test.com.conf

В этом файле прописываем следующую конфигурцию:

server {
	listen    80;
	# точка в начале означает, что данная конфигурация хоста будет
	# также актуальна и для всех алиасов/субдоменов test.com
	server_name .test.com;
	root      /www/test.com/public;
	# Include phpmyadmin
	include /etc/nginx/phpmyadmin.conf;
	# Logs
	access_log  /www/test.com/logs/access.log main;
	error_log   /www/test.com/logs/error.log;
	# Default location settings, должен сказать что данный конфиг
	# был разработан для сайтов на wordpress
	location / {
		index   index.html index.htm index.php;
		try_files $uri $uri/ /index.php?$args;
		rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
		rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
	}
	# Redirect server error pages to the static page /50x.html
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root /usr/share/nginx/html;
	}
	#error_page  404     /404.html;
	# Pass the PHP scripts to FastCGI server (locally with unix: param to avoid network overhead)
	location ~ \.php$ {
		# Prevent Zero-day exploit
		try_files $uri =404;
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		#NOTE: You should have  cgi.fix_pathinfo = 0;  in php.ini
		fastcgi_pass    unix:/www/php-fpm.sock;
		fastcgi_index   index.php;
		fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include         /etc/nginx/fastcgi_params;
	}
	# Deny access to .htaccess files, if Apache's document root
	location ~ /\.ht {
		deny  all;
	}
	# Exclude favicon from the logs to avoid bloating when it's not available
	location /favicon.ico {
		log_not_found   off;
		access_log      off;
	}
}

Как вы заметили, есть строки в этом конфиге, которые надо пока закоментировать, пока мы не настроили PHP-FPM. Коментировать можно с помощью символа # в начале каждой строки, которую хотите закоментировать.

Кстати, в директории /etc/nginx/conf.d также есть файл под названием default.conf, а также example_ssl.conf, проверьте нет ли в этих файлов ничего такого, что может помешать нам в будущем. У меня в example_ssl.conf все строки закоментированы, а default.conf выглядит так:

server {
	listen       80;
	server_name  localhost;
	#charset     koi8-r;
	#access_log  /var/log/nginx/log/host.access.log  main;
	location / {
		root   /usr/share/nginx/html;
		index  index.html index.htm;
	}
	#error_page  404       /404.html;
	# redirect server error pages to the static page /50x.html
	#
	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   /usr/share/nginx/html;
	}
}

То есть, минимум настроек и ничего лишнего. Всё остальное вы с легкостью сможете добавить сюда позже, обязательно проверив каждое изменение командой nginx -t, и применив настройки командой nginx -s reload без перезагрузки сервера nginx.

На данном этапе, если в директории /www/test.com/public будет лежать файл index.html с каким либо содержимым – он должен быть отображен в вашем браузере.

Установка Mariadb

Пожалуй самый легкий пункт в данной статье:

yum -y update
# установка mariadb
yum -y install mariadb-server mariadb
# запускаем сервис и добавляем в автозагрузку
systemctl start mariadb
systemctl enable mariadb
# запускаем скрипт настройки для Mariadb
mysql_secure_installation

Следуем инструкциям (обычно выбирая предложенный вариант), помним, что у нас пока еще нет никакого пароля для root пользователя, поэтому на запрос ввода пароля для root – просто жмемь ENTER.

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

Оговорю сразу, что настравивать php-fpm мы будем через unix сокеты (unix://socket). Есть мнение что именно через сокеты php-fpm будет работать быстрее, чем через tcp/ip протокол (по умолчанию на 9000 порту). Сам я тесты не проводил, поэтому поверим на слово “бывалых”.

yum -y update
# установка php-fpm
yum -y install php-fpm

Настройка PHP-FPM

Первым делом надо открыть файл /etc/php-fpm.d/www.conf и поправить в нем несколько строк:

nano /etc/php-fpm.d/www.conf

Ищем строку listen… заменяем ее на:

listen = /www/php-fpm.sock

Раскоментируем строки listen. и укажем имя пользователя, с помощью и правами которого будет создан файл сокета, при первом обращении к нему:

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Аналогично устанавливаем пользователя в строках:

user = nginx
group = nginx

А также укажем путь к директории, где PHP-FPM будет хранить файлы сессии (на самом деле, данными командами мы просто перекрываем конфигурации из файла /etc/php.ini):

php_value[session.save_handler] = files
php_value[session.save_path] = /www/php-fpm-session

Для того, чтобы вышеописанные настройки работали правильно, создадим файл соккета (по идее, он должен создасться сам при первом дергании php-fpm, но мы все же создадим его на всякий случай):

touch /www/php-fpm.sock
# назначим правильные права
chown nginx:nginx /www/php-fpm.sock
chmod 600 /www/php-fpm.sock

Далее создадим директорию для PHP сессий и назначим ей правильные права:

mkdir /www/php-fpm-session
chown -R nginx:nginx /www/php-fpm-session
chmod -R 777 /www/php-fpm-session

Правим /etc/php.ini как вам угодно, но обязательно меняем значение 1 на 0 в строке:

cgi.fix_pathinfo = 0;

В своем php.ini я также установил временную зону:

date.timezone = Europe/Kiev

Пробуем запустить PHP-FPM и добавим в автозагрузку:

systemctl start php-fpm
systemctl enable php-fpm

P.S. для того чтобы перезапустить севрис PHP-FPM выполните команду:

systemctl restart php-fpm

Если все прошло успешно – радуемся, если нет – ищем ответы в гугле, или пишем комментарии сюда :), чем смогу тем помогу.

Для того, чтобы проверить, что у нас PHP работает как надо, раскоментируем (или добавим, если их там нет) строки в файле /etc/nginx/conf.d/test.com:

# cекция "location / {"
# Default location settings
location / {
	index index.html index.htm index.php;
	try_files $uri $uri/ /index.php?$args;
	rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
	rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
}
# секция location ~ \.php$ {
location ~ \.php$ {
	# Prevent Zero-day exploit
	try_files $uri =404;
	fastcgi_split_path_info ^(.+\.php)(/.+)$;
	#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
	fastcgi_pass    unix:/www/php-fpm.sock;
	fastcgi_index   index.php;
	fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
	include         /etc/nginx/fastcgi_params;
}

и скормим последние изменения в nginx без перезапуска самого nginx:

nginx -s reload

А также создадим файл /www/test.com/public/index.php с таким вот содержимым:

<?php phpinfo(); ?>

Заходим из браузера по адресу test.com. Понятно, что доменное имя может быть каким угодно, каким вы его настроили, а если же у вас нет никакого доменного имени, то вы можете просто прописать DNS алиасы в своем hosts файле. Как настроить hosts в своей системе – ищите в гугле, или комментарий ниже.

Установка и настройка PhpMyAdmin

Выполним несколько воманд:

yum -y update
yum -y install phpmyadmin

Далее создаем include файл для nginx (на самом деле хост файл) с конфигурациями phpmyadmin – /etc/nginx/phpmyadmin.conf

location /phpmyadmin/ {
	alias /usr/share/phpMyAdmin/;
	index index.php;
}
location ~ ^/phpmyadmin/(.+\.php)$ {
	alias /usr/share/phpMyAdmin/$1;
	fastcgi_pass   unix:/www/php-fpm.sock;
	fastcgi_index  index.php;
	fastcgi_param  SCRIPT_FILENAME  $request_filename;
	# From 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  SCRIPT_NAME        $fastcgi_script_name;
	fastcgi_param  REQUEST_URI        $request_uri;
	fastcgi_param  DOCUMENT_URI       $document_uri;
	fastcgi_param  DOCUMENT_ROOT      /usr/share/phpMyAdmin;
	fastcgi_param  SERVER_PROTOCOL    $server_protocol;
	fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
	fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
	fastcgi_param  REMOTE_ADDR        $remote_addr;
	fastcgi_param  REMOTE_PORT        $remote_port;
	fastcgi_param  SERVER_ADDR        $server_addr;
	fastcgi_param  SERVER_PORT        $server_port;
	fastcgi_param  SERVER_NAME        $server_name;
	fastcgi_param  REDIRECT_STATUS    200;
}

Я бы также рекомендовал переименовать location /phpmyadmin/ например в location /pma/ или что угодно другое.

Далее мы должны раскоментировать строки в основном хост файле nginx (/etc/nginx/conf.d/test.com.conf):

# Include phpmyadmin
include /etc/nginx/phpmyadmin.conf;

Сохраняем и релоадим nginx…

nginx -s reload

Если все прошло успешно – пробуем зайти в phpmyadmin по настроенному пути – http://test.com/phpmyadmin/

И последний шаг (в нашей статье, но далеко не в реальных условиях конфигурации production сервера) – добавление пользователя admin в систему для того, чтобы можно было править файлы сайта (хостов) по SFTP (не путать с FTPS, это разные протоколы, более подробно – в гугле)

Пользователи…

Введение

При создании сервера на Linux, добавление и удаление пользователей – одна из первых задач, с которой вам придется столкнуться. При первом запуске вы получаете только пользователя под именем root. Конечно он открывает вам полный доступ к системе, но использование такого пользователя всегда – не самая разумная идея, так как этот пользователь намного больше подвержен к атакам по безопасности, чем любой другой пользователь. Причиной тому является тот факт, что в таком случае все команды исполняются с правами администратора.

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

Добавление пользователей

Если вы находитесь в системе под пользователем root, то создать нового пользователя можно следующей командой:

adduser username

Если же вы авторизованны как другой пользователь, имеющий sudo права, то тогда используйте следующую команду:

sudo adduser username

Теперь следует назначить пользователю пароль:

passwd username

Вы должны будете дважды ввести пароль. Новый пользователь создан и готов к использованию. Вы можете теперь войти под новым пользователем при помощи только что созданного пароля.

Добавление sudo прав пользователю

Если вашему пользователю необходимо выполнять команды с администраторскими правами, то ему необходимо открыть доступ к команде sudo.

Можно добавить пользователя в группу wheel (каждый её член автоматически получает доступ к sudo) при помощи команды
gpasswd. Такой подход является самым безопасным и простым для управления доступа к sudo.

Наберите следующую команду если находитесь под пользователем root:

gpasswd -a username wheel

Если вы под другим пользователем, то выполните следующее:

sudo gpasswd -a username wheel

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

sudo some_command

Вам потребуется ввести пароль к вашему обычному аккаунту. Команда будет выполнена с правами администратора как только пароль будет введен.

Управление пользователями с правами sudo

Команда gpasswd позволяет вам добавлять и удалять пользователей из групп (например wheel), но она не покажет вам членов определенной группы. Чтобы получить список пользователей, принадлежащих к группе wheel (то есть увидеть пользователей с правами sudo), вам понадобится команда lid. По-умолчанию, эта команда выводит список групп, к которым принадлежит пользователь, но при помощи ключа -g вы можете увидеть список членов какой-либо группы.

sudo lid -g wheel

Вы получите имена пользователей и соответствующие UID пользователей группы wheel. Таким образом вы легко сможете проверить были ли предыдущие команды выполнены успешно и получил лм ваш новый пользователь необходимые права.

Удаление пользователей

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

Если вы хотите удалить пользователя, оставив нетронутыми его файлы, выполните следующую команду под пользователем root:

userdel username

Если вам необходимо удалить и пользователя, и созданные им файлы в его домашней директории, то воспользуйтесь следующей командой:

userdel -r username

Обе команды автоматически удаляют пользователя из всех групп, к которым он принадлежал, включая группу wheel. Если в дальнейшем вы создадите одноименного пользователя, то его снова придется добавить вгруппу wheel, чтобы тот получил sudo права.

Заключение

Таким образом, мы установили всё необходимое для нашего веб-сервера, удачи!

1 comment for “Установка и настройка nginx + php-fpm + MariaDB + phpmyadmin на CentOS 7

Leave a Reply