В jabber-конференцию часто приходят люди и очень часто стоит вопрос — развернуть LAMP, но не просто так, а еще и с пользовательскими каталогами, чтобы можно было на PHP писать.
Все упираются в какие-то древние инструкции, где неизменно предлагают отключить SELinux.
Я против, давайте настроим все это не выключая SELinux, максимально просто и правильно в Fedora Linux.
Установка
1 | yum install httpd mariadb-server php php-mysqlnd |
Рассказываю:
- httpd — сам apache;
- mariadb — это сервер mysql;
- php — название само за себя говорит;
- php-mysqlnd — модуль php для mysql;
Настройка mysqld (mariadb)
Запускаем сервер (от root):
1 | systemctl start mysqld |
а затем запускаем от root команду, чтобы настроить сервер:
1 | mysql_secure_installation |
Enter current password for root (enter for none) — введите текущий пароль для пользователя root или нажмите Enter, если он пустой.
Конечно нажимаем Enter, у нас не установлен еще пароль.
Set root password? [Y/n]
Я отвечаю Y (т.е. да) и ставлю на текущий пароль системного пользователя root.
Remove anonymous users? [Y/n]
Удаляем анонима? Я удаляю, а зачем мне анонимный пользователь 🙂
Disallow root login remotely? [Y/n]
Отключаем возможность root’у заходить по сети.
Если сервер на домашней машинке разворачивается в парниковых условиях домашней сети, то не вижу смысла говорить «Да».
А вот если это какой-нить vps/vds, тогда да, отключить надо обязательно.
Remove test database and access to it? [Y/n]
Отключаем тестовые базы данных и доступ к ним. Конечно отключаем.
Reload privilege tables now? [Y/n]
Перезагрузить таблицу привелегий сейчас. Конечно да.
Так мы закончили вводную настройку mysql (mariadb).
httpd
Запускаем apache (от root):
1 | systemctl start httpd |
Проверяем
Проверим базовую настройку.
Создадим тестовый файл для проверки apache+php:
1 | echo "<?php phpinfo() ?> " > /var/www/html/test.php |
и проверим, зайдя через браузер.
Если это локальный компьютер, то адрес выглядит так: http://localhost/test.php.
Должна появится страничка с информацией о PHP.
Что-то вроде этой:
Если такой странички не появилось, значит что-то сделал(а) не так. Надо смотреть логи и лечить.
Все. Таким образом у нас уже есть «теплый LAMP’овый» сервер.
Пользовательские каталоги
В пакете httpd уже все придумано для того, чтобы создать пользовательские каталоги.
Просто включим эту возможность.
Вот оригинальное содержимое файла /etc/httpd/conf.d/userdir.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # UserDir: The name of the directory that is appended onto a user's home # directory if a ~user request is received. # # The path to the end user account 'public_html' directory must be # accessible to the webserver userid. This usually means that ~userid # must have permissions of 711, ~userid/public_html must have permissions # of 755, and documents contained therein must be world-readable. # Otherwise, the client will only receive a "403 Forbidden" message. # <IfModule mod_userdir.c> # # UserDir is disabled by default since it can confirm the presence # of a username on the system (depending on home directory # permissions). # UserDir disabled # # To enable requests to /~user/ to serve the user's public_html # directory, remove the "UserDir disabled" line above, and uncomment # the following line instead: # #UserDir public_html </IfModule> # # Control access to UserDir directories. The following is an example # for a site where these directories are restricted to read-only. # <Directory "/home/*/public_html"> AllowOverride FileInfo AuthConfig Limit Indexes Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec Require method GET POST OPTIONS </Directory> |
Если внимательно вчитаться в комментарии этого файла, то почти все становится понятно сразу.
Комментируем строку №16 — отключаем отключение самой возможности UserDir.
Убираем комментарий в строке №23 — указываем название каталога «хомяке».
И после предпоследней строки №33 мы добавим еще одну строчку:
1 | Require all granted |
Она разрешит httpd «отдавать» каталоги пользователям.
В общем и целом файл должен после нас выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # UserDir: The name of the directory that is appended onto a user's home # directory if a ~user request is received. # # The path to the end user account 'public_html' directory must be # accessible to the webserver userid. This usually means that ~userid # must have permissions of 711, ~userid/public_html must have permissions # of 755, and documents contained therein must be world-readable. # Otherwise, the client will only receive a "403 Forbidden" message. # <IfModule mod_userdir.c> # # UserDir is disabled by default since it can confirm the presence # of a username on the system (depending on home directory # permissions). # # UserDir disabled # # To enable requests to /~user/ to serve the user's public_html # directory, remove the "UserDir disabled" line above, and uncomment # the following line instead: # UserDir public_html </IfModule> # # Control access to UserDir directories. The following is an example # for a site where these directories are restricted to read-only. # <Directory "/home/*/public_html"> AllowOverride FileInfo AuthConfig Limit Indexes Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec Require method GET POST OPTIONS Require all granted </Directory> |
Сохраняем файл.
Перезапускаем httpd командой от root’а:
1 | systemctl restart httpd |
С этого момента договоримся, что нашего пользователя зовут IMUSER, просто меняйте это слово на название своего пользователя.
Создаем пользовательский каталог (конечно команду надо выполнить от пользователя):
1 | mkdir ~/public_html |
Теперь займемся разрешениями.
Сперва разрешим демону httpd смотреть в каталог пользователя (от root’а):
1 | chmod 711 /home/IMUSER |
Эта команда включит флаги «x» (для каталогов это флаг просмотра каталога) для группы и прочих.
Теперь включим разрешения SELinux (также от root’а):
1 | setsebool -P httpd_read_user_content=1 httpd_enable_homedirs=1 |
Эта команда разрешает демону httpd читать содержимое в пользовательских каталогах. И разрешает работу с ними вообще для httpd.
Ну и в заключении — проверим работу пользовательских каталогов все на том же простеньком файлике.
Выполняем от пользователя:
1 | echo "<?php phpinfo() ?> " > ~/public_html/test.php |
Проверяем.
Нам надо зайти по адресу: http://localhost/~IMUSER/test.php
Я специально не делаю этот адрес ссылкой. Помнишь еще о соглашении? 😉
Напоследок
Тут я записываю то, что не вошло в текст статьи, но может быть полезно или просто помочь.
Включаем автозапуск служб httpd и mariadb (mysql):
1 | systemctl enable httpd mariadb |
SELinux’у может не понравится попытка соединения httpd с подозрительной базой данных по сети (можно еще через сокет, это SELinux не блокирует).
«Лечится» это включением соответствующего флажка SELinux (от root’а):
1 | setsebool -P httpd_can_network_connect_db=1 |
Очень много полезного есть в man-страницах:
man httpd_selinux
man mysqld_selinux
Надо только установить пакет selinux-policy-devel
Я буду рад дополнить и/или изменить статью.
Комментарии, как всегда, приветствуются.
спасибо статья класс