Apache HTTP Server (Русский)
Apache HTTP Server, или сокращенно Apache — популярный веб-сервер, разработанный Apache Software Foundation.
Apache часто используется вместе с языком сценариев PHP и СУБД MySQL. Такую комбинацию обычно называют LAMP (Linux, Apache, MySQL, PHP). Эта статья объясняет, как настроить Apache и как интегрировать с ним PHP и MySQL.
Если вам нужно быстро создать окружение для разработки и тестирования, то можете просто установить Xampp.
Установка
Установите пакет apache, доступный в официальных репозиториях.
Настройка
Файлы настроек Apache находятся в /etc/httpd/conf
. Основным файлом является /etc/httpd/conf/httpd.conf
, который может по ссылкам включать в себя дополнительные файлы с настройками. В большинстве случаев будет достаточно стандартных настроек из этого файла. По умолчанию корневым каталогом веб-сервера является /srv/http
.
Для старта Apache запустите службу httpd.service
.
После этих действий Apache должен запуститься. Проверьте работает ли он, набрав в адресной строке браузера http://localhost/
. Веб-сервер должен отправить вам простую тестовую страничку.
При необходимости дальнейшей настройки сервера смотрите следующие разделы.
Дополнительные опции
Следующие опции (директивы) в /etc/httpd/conf/httpd.conf
могут быть вам интересны:
User http
- По соображениям безопасности при запуске сервера Apache от имени суперпользователя (напрямую или через скрипт инициализации) происходит смена идентификатора пользователя (UID), от имени которого выполняется процесс сервера. По умолчанию используется пользователь
http
, который не имеет привилегированных полномочий в системе.
Listen 80
- Это порт, через который Apache принимает входящие соединения. Если сервер имеет выход в интернет через маршрутизатор, необходимо будет настроить перенаправление этого порта.
- Если вы используете Apache для разработки и тестирования, вы можете разрешить только локальный доступ к нему. Для этого укажите
Listen 127.0.0.1:80
.
ServerAdmin you@example.com
- Адрес электронной почты администратора, который будет выводиться, например, на странице ошибки Apache.
DocumentRoot "/srv/http"
- Это корневая директория Apache, в которой можно разместить ваши веб-страницы.
- Измените ее, если нужно, но не забудьте также поменять путь в директиве
<Directory "/srv/http">
на новое расположениеDocumentRoot
, иначе вы, скорее всего, получите сообщение об ошибке 403 Error (недостаточно полномочий) при попытке получить доступ к новому корневому каталогу Apache. Также не забудьте изменить строкуRequire all denied
наRequire all granted
, иначе снова получите ошибку 403 Error. Помните, что директория DocumentRoot и ее родительские папки должны иметь разрешения на запуск для всех (можно установить командойchmod o+x /path/to/DocumentRoot>
), в противном случае вы получите ошибку 403 Error.
AllowOverride None
- Запрещает переопределение настроек. Если в секции
<Directory>
указана эта директива, Apache будет полностью игнорировать настройки в файле.htaccess
. Обратите внимание, что теперь такая настройка для Apache 2.4 является настройкой по умолчанию, поэтому если вы планируете использовать.htaccess
, вам необходимо дать соответствующие разрешения. Если вы собираетесь включить модульmod_rewrite
или использовать настройки в.htaccess
, вы можете определить какие из директив, объявленных в этих файлах, могут перезаписывать конфигурацию сервера. Для получения дополнительной информации обратитесь к документации Apache.
apachectl configtest
.Дополнительные настройки можно найти в /etc/httpd/conf/extra/httpd-default.conf
.
Чтобы полностью отключить вывод версии Apache в генерируемых сервером страницах, добавьте:
ServerSignature Off
Чтобы подавить вывод такой информации, как версии Apache и PHP, добавьте:
ServerTokens Prod
Пользовательские каталоги
По умолчанию доступ к каталогам пользователей возможен по адресу http://localhost/~''user''/
, который показывает содержимое каталога ~/public_html
(его имя и расположение задается в файле /etc/httpd/conf/extra/httpd-userdir.conf
).
Если вы не хотите, чтобы пользовательские каталоги были доступны через web, закомментируйте следующую строку в /etc/httpd/conf/httpd.conf
:
Include conf/extra/httpd-userdir.conf
Убедитесь, что права доступа к вашему домашнему каталогу и ~/public_html
позволяют получать доступ к файлам в них всем пользователям:
$ chmod o+x ~ $ chmod o+x ~/public_html $ chmod -R o+r ~/public_html
Однако с точки зрения безопасности вышеприведенное решение слишком фривольно. Правильнее поступить по-другому. Сначала добавьте пользователя http в группу, которой принадлежит ваша домашняя папка. Например, если ваша домашняя папка и все ее подкаталоги принадлежат группе piter, можно проделать следующее:
# usermod -aG piter http
или
# gpasswd -a http piter
После этого назначьте права на чтение и исполнение для каталогов ~/
, ~/public_html
и, рекурсивно, на остальные подкаталоги для ~/public_html
для членов группы (в нашем примере для членов группы piter). Опираясь на нижеприведенный шаблон, осуществите эти мероприятия:
$ chmod g+xr-w /home/yourusername $ chmod -R g+xr-w /home/yourusername/public_html
Перезапустите службу httpd.service
, чтобы изменения вступили в силу. Смотрите также Umask#Set the mask value.
TLS/SSL
Для использования TLS/SSL необходимо установить openssl.
Создайте закрытый ключ и запрос на получение сертификата (CSR). Также вы можете самозаверить CSR (который создаст сертификат):
rsa_keygen_bits:2048
). Также вы можете убрать опцию -sha256
для использования SHA-1 вместо SHA-2 или изменить время его действия в днях (-days 365
).# cd /etc/httpd/conf # openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out server.key # chmod 600 server.key # openssl req -new -sha256 -key server.key -out server.csr # openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Теперь раскомментируйте следующие строки в /etc/httpd/conf/httpd.conf
:
LoadModule ssl_module modules/mod_ssl.so LoadModule socache_shmcb_module modules/mod_socache_shmcb.so Include conf/extra/httpd-ssl.conf
Перезапустите службу httpd.service
, чтобы изменения вступили в силу.
Виртуальные хосты
<VirtualHost dommainame:443>
для поддержки SSL на виртуальном хосте. Пример файла можно посмотреть ниже: #Управление большим количеством виртуальных хостов.Если вы хотите, чтобы Apache обслуживал не один, а несколько хостов, раскомментируйте следующую строку в файле /etc/httpd/conf/httpd.conf
:
Include conf/extra/httpd-vhosts.conf
Укажите свои виртуальные хосты в /etc/httpd/conf/extra/httpd-vhosts.conf
. Файл уже содержит пример полностью рабочих настроек, что поможет вам быстро выполнить настройки под ваши нужды.
Для проверки виртуальных хостов на локальной машине добавьте их виртуальные имена в ваш файл /etc/hosts
:
127.0.0.1 domainname1.dom 127.0.0.1 domainname2.dom
Перезапустите httpd.service
, чтобы изменения вступили в силу.
Управление большим количеством виртуальных хостов
Если Apache используется для обслуживания очень большого количества виртуальных хостов, вам может быть полезна возможность их легко включать и отключать. Для этого рекомендуется создавать собственный файл настроек на каждый хост и хранить все эти файлы в одном каталоге, например /etc/httpd/conf/vhosts
.
Сначала создайте каталог:
# mkdir /etc/httpd/conf/vhosts
Теперь создайте в нем отдельные конфигурационные файлы:
# nano /etc/httpd/conf/vhosts/domainname1.dom # nano /etc/httpd/conf/vhosts/domainname2.dom ...
И включите эти файлы в основной файл настроек /etc/httpd/conf/httpd.conf
:
#Enabled Vhosts: Include conf/vhosts/domainname1.dom Include conf/vhosts/domainname2.dom ...
Теперь можно быстро включать/отключать требуемые виртуальные хосты, просто закомментировав или раскомментировав соответствующие директивы Include
в основном файле настроек.
Очень простой файл виртуального хоста будет выглядеть следующим образом:
/etc/httpd/conf/vhosts/domainname1.dom
<VirtualHost domainname1.dom:80> ServerAdmin webmaster@domainname1.dom DocumentRoot "/home/user/http/domainname1.dom" ServerName domainname1.dom ServerAlias domainname1.dom ErrorLog "/var/log/httpd/domainname1.dom-error_log" CustomLog "/var/log/httpd/domainname1.dom-access_log" common <Directory "/home/user/http/domainname1.dom"> Require all granted </Directory> </VirtualHost> <VirtualHost domainname1.dom:443> ServerAdmin webmaster@domainname1.dom DocumentRoot "/home/user/http/domainname1.dom" ServerName domainname1.dom:443 ServerAlias domainname1.dom:443 ErrorLog "/var/log/httpd/domainname1.dom-error_log" CustomLog "/var/log/httpd/domainname1.dom-access_log" common <Directory "/home/user/http/domainname1.dom"> Require all granted </Directory> SSLEngine on SSLCertificateFile "/etc/httpd/conf/server.crt" SSLCertificateKeyFile "/etc/httpd/conf/server.key" </VirtualHost>
Расширения
PHP
Установите PHP с пакетами php и php-apache, доступными в официальных репозиториях.
libphp7.so
входящий в php-apache, не работает с mod_mpm_event
(FS#39218). Вместо него следует использовать mod_mpm_prefork
. В противном случае, вы получите следующее сообщение об ошибке:
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP. AH00013: Pre-configuration failed httpd.service: control process exited, code=exited status=1
Для использования mod_mpm_prefork
, откройте /etc/httpd/conf/httpd.conf
и поменяйте строку
LoadModule mpm_event_module modules/mod_mpm_event.so
на
LoadModule mpm_prefork_module modules/mod_mpm_prefork.soТакже вы можете просто использовать
mod_proxy_fcgi
(смотрите #Использование php7 c php-fpm и mod_proxy_fcgi[ссылка недействительна: раздел не найден]).Чтобы включить модуль PHP, добавьте следующие строки в /etc/httpd/conf/httpd.conf
:
- Поместите эту строку в любом месте после строки
LoadModule dir_module modules/mod_dir.so
:
LoadModule php7_module modules/libphp7.so
- Разместите эту строку в конце списка
Include
:
Include conf/extra/php7_module.conf
libphp7.so
в каталоге (/etc/httpd/modules
), то вероятнее всего, что вы не установили php-apache.Если ваш корневой каталог DocumentRoot
не /srv/http
, добавьте его в список open_basedir
в /etc/php/php.ini
(необязательно):
open_basedir=/srv/http/:/home/:/tmp/:/usr/share/pear/:/путь/до/корневого/каталога
Перезапустите службу httpd.service
, чтобы изменения вступили в силу.
Чтобы убедиться в том, что PHP настроен корректно, создайте файл test.php
в каталоге DocumentRoot
(то есть в /srv/http/
или ~/public_html
) и поместите в него следующий код:
<?php phpinfo(); ?>
По адресу http://localhost/test.php или http://localhost/''~пользователь''/test.php вы должны увидеть информационную страницу PHP.
Если PHP-код не исполняется, а на странице браузера вы увидите содержимое test.php
, проверьте добавили ли вы Includes
в строку Options
для вашего корневого каталога в /etc/httpd/conf/httpd.conf
. Кроме того, убедитесь, что TypesConfig conf/mime.types
раскомментирован в секции <IfModule mime_module>. Также можно попробовать добавить нижеследующую строку в секцию <IfModule mime_module>
файла httpd.conf
:
AddHandler application/x-httpd-php .php
Дополнительную информацию вы можете получить на странице PHP.
Дополнительные параметры
Рекомендуется правильно настроить вашу временную зону (список временных зон) в /etc/php/php.ini
по примеру:
date.timezone = Europe/Moscow
По желанию включите режим показа ошибок при отладке PHP-кода, для этого измените значение опции display_errors
на On
в файле /etc/php/php.ini
:
display_errors=On
Ежели вы хотите использовать модуль libGD
, установите php-gd и раскомментируйте extension=gd.so
в /etc/php/php.ini
:
extension=gd.so
Для использования модуля mcrypt
установите php-mcryptAUR и раскомментируйте extension=mcrypt.so
в /etc/php/php.ini
:
extension=mcrypt.so
Не забудьте добавить индексные файлы /etc/httpd/conf/extra/php7_module.conf
, если это необходимо:
DirectoryIndex index.php index.phtml index.html
Для дополнительной настройки, пожалуйста прочтите PHP.
Использование php5 c php-fpm и mod_proxy_fcgi
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/srv/http/$1
- Задайте
listen
в/etc/php/php-fpm.conf
следующим образом:
;listen = 127.0.0.1:9000 listen = /run/php-fpm/php-fpm.sock listen.owner = http listen.group = http
- Добавьте следующие строки в
/etc/httpd/conf/httpd.conf
:
<FilesMatch \.php$> SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/" </FilesMatch> <IfModule dir_module> DirectoryIndex index.php index.html </IfModule>
- Если у вас добавлен модуль php, уберите его, так как он больше не нужен:
#LoadModule php5_module modules/libphp5.so
- Перезапустите демон apache php-fpm:
# systemctl restart httpd.service php-fpm.service
Использование php5 c apache2-mpm-worker и mod_fcgid
- Раскомментируйте следующую строку в
/etc/conf.d/apache
:
HTTPD=/usr/sbin/httpd.worker
- Раскомментируйте следующую строку в
/etc/httpd/conf/httpd.conf
:
Include conf/extra/httpd-mpm.conf
- Установите пакеты mod_fcgid и php-cgi, доступные в официальных репозиториях.
- Создайте файл
/etc/httpd/conf/extra/php5_fcgid.conf
со следующим содержимым:
/etc/httpd/conf/extra/php5_fcgid.conf
# Required modules: fcgid_module <IfModule fcgid_module> AddHandler php-fcgid .php AddType application/x-httpd-php .php Action php-fcgid /fcgid-bin/php-fcgid-wrapper ScriptAlias /fcgid-bin/ /srv/http/fcgid-bin/ SocketPath /var/run/httpd/fcgidsock SharememPath /var/run/httpd/fcgid_shm # If you don't allow bigger requests many applications may fail (such as WordPress login) FcgidMaxRequestLen 536870912 PHP_Fix_Pathinfo_Enable 1 # Path to php.ini – defaults to /etc/phpX/cgi DefaultInitEnv PHPRC=/etc/php/ # Number of PHP childs that will be launched. Leave undefined to let PHP decide. #DefaultInitEnv PHP_FCGI_CHILDREN 3 # Maximum requests before a process is stopped and a new one is launched #DefaultInitEnv PHP_FCGI_MAX_REQUESTS 5000 <Location /fcgid-bin/> SetHandler fcgid-script Options +ExecCGI </Location> </IfModule>
- Создайте каталог и символическую ссылку в нем на php-cgi:
# mkdir /srv/http/fcgid-bin # ln -s /usr/bin/php-cgi /srv/http/fcgid-bin/php-fcgid-wrapper
- Отредактируйте
/etc/httpd/conf/httpd.conf
:
#LoadModule php5_module modules/libphp5.so LoadModule fcgid_module modules/mod_fcgid.so Include conf/extra/php5_fcgid.conf
и перезапустите службу httpd.service
.
MySQL/MariaDB
Следуйте инструкциям на странице PHP#MySQL/MariaDB.
После выполнения настройки, перезапустите службу mysqld
, чтобы изменения вступили в силу.
Решение проблем
Просмотр журнала и текущего состояния Apache
Текущее состояние службы httpd
вы можете вывести командой systemctl status httpd
.
Лог-файлы Apache вы найдете в каталоге /var/log/httpd
.
PID file /run/httpd/httpd.pid not readable (yet?) after start
Если вы получаете такую ошибку, закомментируйте строку:
LoadModule unique_id_module modules/mod_unique_id.so
в файле настроек Apache.
Обновление с Apache 2.2 до 2.4
Если вы используете php-apache
, посмотрите инструкции к Apache с PHP выше.
Управление доступом было изменено. Приведите все директивы Order
, Allow
, Deny
и Satisfy
к новому синтаксису с Require
. mod_access_compat позволит использовать устаревший формат на время этапа перехода.
Подробную информацию вы найдете на странице Upgrading to 2.4 from 2.2.
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe
Если не удалось запустить php5_module
при старте httpd.service
и вы получаете следующее сообщение об ошибке:
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP.
Это значит, что Apache работает c поточным MPM, но используется не потокобезопасная версия PHP. В этом случае, следует заменить mpm_event_module
на mpm_prefork_module
:
/etc/httpd/conf/httpd.conf
# LoadModule mpm_event_module modules/mod_mpm_event.so LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
и перезапустить httpd.service
.