httpd + php + mysql (LAMP) в Fedora для разработчика PHP

В 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.
Что-то вроде этой:
phpinfo

Если такой странички не появилось, значит что-то сделал(а) не так. Надо смотреть логи и лечить.
Все. Таким образом у нас уже есть «теплый 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

Я буду рад дополнить и/или изменить статью.
Комментарии, как всегда, приветствуются.

httpd + php + mysql (LAMP) в Fedora для разработчика PHP: 1 комментарий

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