Устанавливаем Apache на Linux

Устанавливаем и запускаем httpd

yum install httpd               #устанавливаем
systemctl enable httpd      #разрешаем запуск веб-сервера после перезагрузки операционной системы
systemctl start httpd         #запускаем веб-сервер Apache

В браузере вводим IP-адрес или домен нашего сервера и проверяем, что Apache работает. Если ничего не отображается, проверяем запущен ли веб-сервер командой ps ax | grep httpd. Проверяем открыт ли доступ к веб-серверу в файрволл. Разрешаем сервис httpd и должно работать.

Добавляем и конфигурируем наш сайт

Пусть доменное имя сайта будет puzzle.itsoft.ru. Сайты будем хранить в папке /site. Логи мы положим рядом с публичным контентом сайта, но так, что обращаясь к сайту логи прочитать нельзя. Аналогичным образом рекомендуется хранить защищённый контент сайта, к которому не должно быть прямого доступа у посетителей сайта.

mkdir /site #создаём папки, где будет расположен веб-сайт
mkdir /site/puzzle
mkdir /site/puzzle/public
mkdir /site/puzzle/logs
chown -R apache. /site/

/site/puzzle/public/index.html #создаём файлик и записываем туда просто одно слово Hi!

vi /etc/httpd/conf.d/puzzle.itsoft.ru.conf #и вставляем следующий контент
<VirtualHost *:80>
 ServerName puzzle.itsoft.ru
 ServerAlias www.puzzle.itsoft.ru
 DocumentRoot /site/puzzle/public
 <Directory /site/puzzle/public>
 Options FollowSymLinks
 AllowOverride All
 Require all granted
 </Directory>
 ErrorLog /site/puzzle/logs/error.log
 CustomLog /site/puzzle/logs/access.log common
</VirtualHost>

Теперь перезагружаем веб-сервер.

systemctl restart httpd # и Apache не запустился
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

systemctl status httpd.service #ничего толкового не показывает, т.к. всё обрезано
systemctl status httpd.service -l #запускаем с ключом -l, но и там ничего непонятно
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2020-04-07 19:10:11 MSK; 2min 24s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 10192 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
  Process: 10191 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 10191 (code=exited, status=1/FAILURE)

Apr 07 19:10:10 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Apr 07 19:10:11 localhost.localdomain systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
Apr 07 19:10:11 localhost.localdomain kill[10192]: kill: cannot find process ""
Apr 07 19:10:11 localhost.localdomain systemd[1]: httpd.service: control process exited, code=exited status=1
Apr 07 19:10:11 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
Apr 07 19:10:11 localhost.localdomain systemd[1]: Unit httpd.service entered failed state.
Apr 07 19:10:11 localhost.localdomain systemd[1]: httpd.service failed.


journalctl -xe #пробуем так и тоже пока прчина не ясна
Apr 07 19:14:20 localhost.localdomain sshd[10273]: Received disconnect from 118.
Apr 07 19:14:20 localhost.localdomain sshd[10273]: Disconnected from 118.126.90.
Apr 07 19:14:31 localhost.localdomain sshd[10276]: Invalid user deploy from 138.
Apr 07 19:14:31 localhost.localdomain sshd[10276]: input_userauth_request: inval
Apr 07 19:14:31 localhost.localdomain sshd[10276]: pam_unix(sshd:auth): check pa


tail /var/log/httpd/error_log #на самом деле нужно смотреть сюда и тут мы видим
(13)Permission denied: AH00091: httpd: could not open error log file /site/puzzle/logs/error.log.

Смотрим права ls -la и по-прежнему ничего не понимаем.

ls -la  /site/puzzle/logs/
total 8
drwxr-xr-x. 2 apache apache  41 Apr  4 19:43 .
drwxr-xr-x. 4 apache apache  32 Apr  4 19:11 ..
-rw-r--r--. 1 apache apache 585 Apr  4 19:44 access.log
-rw-r--r--. 1 apache apache 260 Apr  4 19:44 error.log

Проблема в дополнительных настройках прав доступа к файлам SELinux. Самый простой и неверный путь отключить этот модуль. Но это создаст потенциальную угрозу безопасности. Поэтому верный путь — разобраться с настройками.

getenforce #проверяем, что он действительно работает
Enforcing

yum install -y policycoreutils-python #устанавливаем утилиты для управления правами доступа к файлам и папкам
semanage fcontext -a -t httpd_sys_content_t '/site(/.*)?'        #разрешаем доступ на чтение веб-серверу ко всем папкам всех сайтов
semanage fcontext -a -t httpd_log_t '/site/puzzle/logs(/.*)?'   #разрешаем веб-серверу писать логи
restorecon -Rv /site  #активируем правила доступа
systemctl restart httpd #запускаем веб-сервер

Проверяем в браузере. Ура! Заработало!

Есть ещё две опции, которые могут вам понадобится httpd_sys_rw_content_t для папок куда веб-сервер имеет право писать данные. Это может быть папка для загрузки файлов. И httpd_cache_t для директории с кешами файлов, если вы используете mod_cache.

Настраиваем доступ к сайту для веб-мастера

Ранее мы создали папки для сайта под пользователем root. Но к сайту нужен отдельный доступ веб-мастеру. Для этого смотри статью как добавить пользователя в Unix.

Смотрите также

Как установить SSL-сертификат на веб-сервер Apache под Linux?
Телеграмм ITSOFT