This is Gentoo's testing wiki. It is a non-operational environment and its textual content is outdated.
Please visit our production wiki at https://wiki.gentoo.org
Apache
HTTP-сервер Apache — это эффективный и расширяемый веб-сервер. Он является одним из самых популярных веб-серверов в Интернете.
Установка
Если требуется обновление, обратитесь к руководству по обновлению.
USE-флаги
USE flags for www-servers/apache The Apache Web Server
+suexec-caps
|
Install suexec with capabilities instead of SUID |
debug
|
Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces |
doc
|
Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally |
gdbm
|
Add support for sys-libs/gdbm (GNU database libraries) |
ldap
|
Add LDAP support (Lightweight Directory Access Protocol) |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
ssl
|
Add support for SSL/TLS connections (Secure Socket Layer / Transport Layer Security) |
static
|
Link in apache2 modules statically rather then plugins |
suexec
|
Install suexec with apache |
suexec-syslog
|
Log suexec to syslog instead of to a separate file |
systemd
|
Enable use of systemd-specific libraries and features like socket activation or session tracking |
threads
|
Add threads support for various packages. Usually pthreads |
Emerge
Если вы хотите использовать event MPM (Multi-Processing Module) для Apache, то добавьте следующую строку в make.conf:
/etc/portage/make.conf
Apache event MPMAPACHE2_MPMS="event"
Если вы хотите использовать worker MPM для Apache, то добавьте следующее в make.conf:
/etc/portage/make.conf
Apache worker MPMAPACHE2_MPMS="worker"
И включите USE-флаг threads для Apache:
/etc/portage/package.use
Поддержка потоков в Apachewww-servers/apache threads
Далее, установите Apache с помощью emerge:
root #
emerge --ask www-servers/apache
Поддержка в других пакетах
Включение глобального USE-флага apache2
добавит поддержку Apache в других пакетах. Это приведёт к тому, что при установке зависимого от него пакета www-servers/apache будет установлен автоматически.
/etc/portage/make.conf
Добавление Apache к системным USE-флагамUSE="apache2"
После настройки переменной USE потребуется обновить систему, чтобы изменения вступили в силу:
root #
emerge --ask --changed-use --deep @world
Конфигурация
Файлы
Существуют два основных файла, которые настраивают поведение Apache2 в системе:
- Конфигурационный файл init-скрипта Apache2 в Gentoo: /etc/conf.d/apache2
- Стандартный файл конфигурации сервера Apache2: /etc/apache2/httpd.conf
/etc/conf.d/apache2
Файл apache2, находящийся в /etc/conf.d, является конфигурационным файлом для Gentoo init-скрипта. Единственная незакомментированная строка содержит переменную APACHE2_OPTS:
/etc/conf.d/apache2
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D SSL -D SSL_DEFAULT_VHOST -D LANGUAGE"
Эта строка определяет параметры, которые будут переданы различным конфигурационным файлам, использующим выражение <IfDefine option-name>
для включения или отключения некоторой части настроек. Вернемся к этому чуть позже в этой статье.
/etc/apache2/httpd.conf
Файл httpd.conf является стандартным конфигурационным файлом сервера Apache. На самом деле это файл является лишь точкой входа, так как вся конфигурация разбита на множество файлов в каталоге /etc/apache2/, которые собираются вместе посредством директивы Include
. Например, директива Include /etc/apache2/modules.d/*.conf
в httpd.conf предназначена для включения всех файлов из /etc/apache2/modules.d/, имя которых оканчивается на .conf.
Принимая во внимание то, о чём говорилось в предыдущем разделе, и то, что конфигурационные файлы модулей (файлы в /etc/apache2/modules.d) почти всегда начинаются с <IfDefine module-name>
, получаем, что содержимое одного файла в /etc/apache2/modules.d будет объединено с остальной конфигурацией ТОЛЬКО в том случае, если соответствующий параметр установлен с помощью флага -D module-name
для переменной APACHE2_OPTS в файле /etc/conf.d/apache2. Конфигурационный файл 00_default_settings.conf является исключением из этого правила, так как не начинается с выражения IfDefine
и, следовательно, всегда включается в конечную конфигурацию.
Настройки по умолчанию
Ниже приведена конфигурация свежей установки сервера Apache, получающаяся объединением различных конфигурационных файлов. Начнём с точки входа /etc/apache2/httpd.conf.
Листинг приведён только для быстрого ознакомления и общего представления. Крайне рекомендуем обратить внимание на комментарии, включённые в различные файлы, это поможет пониманию деталей настройки. Для более глубокого понимания следует обратиться руководству Apache.
/etc/apache2/httpd.conf
ServerRoot "/usr/lib64/apache2" # Модуль загружается в любом случае в предположении, что USE-флаг # не отключён в /etc/portage/make.conf или /etc/portage/package.use LoadModule actions_modulemodules/mod_actions.so ... #other modules loaded that way : alias_module, auth_basic_module, authn_alias_module, # authn_anon_module, authn_dbm_module, authn_default_module, authn_file_module, # authz_dbm_module, authz_default_module, authz_groupfile_module, authz_host_module, # authz_owner_module, authz_user_module, autoindex_module, cgi_module, cgid_module, # deflate_module, dir_module, env_module, expires_module, ext_filter_module, filter_module, # headers_module, include_module, log_config_module, logio_module, mime_module, # mime_magic_module, negotiation_module, rewrite_module, setenvif_module, # speling_module,ssl_module, status_module, unique_id_module, usertrack_module, host_alias_module # Модуль загружается по условию в предположении, что соответствующий USE-флаг # не отключён в /etc/portage/make.conf или /etc/portage/package.use # (т. е. USE-флаг установлен) <IfDefine AUTHNZ_LDAP> LoadModule authnz_ldap_module modules/mod_authnz_ldap.so </IfDefine> # другие модули, загружающиеся таким образом: cache_module, dav_module, dav_fs_module, # dav_lock_module,disk_cache_module, file_cache_module, info_module, ldap_module, # mem_cache_module, userdir_module User apache Group apache # Дополнительные настройки #**************************************************************************************vvv # эта часть включается через Include /etc/apache2/modules.d/*.conf # из файла /etc/apache2/modules.d/00_default_settings.conf-------------v # включается всегда, так как нет соответствующего отключающего параметра. Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 UseCanonicalName Off AccessFileName .htaccess ServerTokens Prod TraceEnable off ServerSignature On HostnameLookups Off EnableMMAP On EnableSendfile On FileEtag INode MTime Size ContentDigest Off ErrorLog /var/log/apache2/error_log LogLevel warn <Directory /> Options FollowSymLinks AllowOverride None Require all denied </Directory> <IfModule dir_module> DirectoryIndex index.html index.html.var </IfModule> <FilesMatch "^\.ht"> Require all denied </FilesMatch> #--------------------------------------------------------------------------^ #included from 00_mod_info.conf--------------------------------------------v <IfDefine INFO> <Location /server-info> SetHandler server-info Require host 127.0.0.1 </Location> </IfDefine> #--------------------------------------------------------------------------^ #--------------------------------------------------------------------------v # включено из 00_languages.conf # Настройки для поддержки страниц на разных языках. <IfDefine LANGUAGE> AddLanguage ca .ca ... AddLanguage zh-TW .zh-tw LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW ForceLanguagePriority Prefer Fallback AddCharset us-ascii.ascii .us-ascii AddCharset ISO-8859-1 .iso8859-1 .latin1 ... AddCharset shift_jis .shift_jis .sjis </IfDefine> #---------------------------------------------------------------------------^ #**************************************************************************************^^^ #***************************************************************************************vvv # эта часть включается через Include /etc/apache2/vhosts.d/*.conf # из 00_default_ssl_vhost.conf-----------------------------------------------------vv <IfDefine SSL> <IfDefine SSL_DEFAULT_VHOST> <IfModule ssl_module> Listen 443 <VirtualHost _default_:443> ServerName localhost #------------------------------------------v # эта часть включается через Include /etc/apache2/vhosts.d/default_vhost.include ServerAdmin root@localhost DocumentRoot "/var/www/localhost/htdocs" <Directory "/var/www/localhost/htdocs"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> <IfModule alias_module> ScriptAlias /cgi-bin/ "/var/www/localhost/cgi-bin/" </IfModule> <Directory "/var/www/localhost/cgi-bin"> AllowOverride None Options None Require all granted </Directory> # конец блока Include ---------------------------^ ErrorLog /var/log/apache2/ssl_error_log <IfModule log_config_module> TransferLog /var/log/apache2/ssl_access_log </IfModule> SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile /etc/ssl/apache2/server.crt SSLCertificateKeyFile /etc/ssl/apache2/server.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory "/var/www/localhost/cgi-bin"> SSLOptions +StdEnvVars </Directory> <IfModule setenvif_module> BrowserMatch ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </IfModule> <IfModule log_config_module> CustomLog /var/log/apache2/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </IfModule> </VirtualHost> </IfModule> </IfDefine> </IfDefine> #---------------------------------------------------------------------------------^^ #из 00_default_vhost.conf-------------------------------------------------------vv <IfDefine DEFAULT_VHOST> Listen 80 NameVirtualHost *:80 <VirtualHost *:80> ServerName localhost #---------------------------------------------------------------v # эта часть включается через Include /etc/apache2/vhosts.d/default_vhost.include ServerAdmin root@localhost DocumentRoot "/var/www/localhost/htdocs" <Directory "/var/www/localhost/htdocs"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> <IfModule alias_module> ScriptAlias /cgi-bin/ "/var/www/localhost/cgi-bin/" </IfModule> <Directory "/var/www/localhost/cgi-bin"> AllowOverride None Options None Require all granted </Directory> # конец блока Include -----------------------------------------------^ <IfModule mpm_peruser_module> ServerEnvironment apache apache </IfModule> </VirtualHost> </IfDefine> #-----------------------------------------------------------------------------------^^ # конец блока include *************************************************************************************^^^
Первые признаки жизни
Как видно из приведенной выше первоначальной конфигурации, предварительно установленным каталогом для виртуального хоста DocumentRoot
является /var/www/localhost/htdocs, именем соответствующего сервера — localhost. К тому же в каталог для DocumentRoot
устанавливается файл index.html, так что, чтобы проверить все ли правильно установлено, можно зайти браузером на http://localhost/.
На странице должно появиться сообщение «It works!».
По умолчанию у Firefox включена возможность, предназначенная для помощи пользователям, которые ошиблись при наборе URL в адресной строке. Если URL не удаётся разрешить, то Firefox перепробует несколько альтернатив, пытаясь угадать, что пользователь 'мог' иметь в виду: добавляет
.com
в конец или www.
в начало имени хоста и проверяет, разрешаются ли полученные URL.
Эта возможность была введена в ранних версиях Firefox и стала раздражающим фактором для разработчиков. Если запущенный на локальной машине сервер не отвечает, Firefox будет пробовать localhost.com
или www.localhost.com
, часто заканчивается страницей «Не найдено».
Чтобы отключить эту возможность:
- Введите
about:config
в адресной строке. - Нажмите «Я обещаю, что буду осторожен» и войдите на специальную страницу конфигурации.
- Введите
browser.fixup.alternate.enabled
в появившейся строке поиска. - Щёлкните правой кнопкой мыши на появившийся ниже пункт
browser.fixup.alternate.enabled
и переключите его значение в положение false.
Включение mod_security
Установите www-apache/mod_security:
root #
emerge --ask www-apache/mod_security
Включите модуль SECURITY
в переменной APACHE2_OPTS файла apache2:
/etc/conf.d/apache2
Включение модуля безопасностиAPACHE2_OPTS="... -D SECURITY"
Control this module by editing /etc/apache2/modules.d/79_modsecurity.conf and /etc/apache2/modules.d/80_modsecurity-crs.conf files. The file /usr/share/doc/mod_security-2.9.1-r1/modsecurity.conf-recommended.bz2 contains the recommended configuration https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#A_Recommended_Base_Configuration. Copy the basic configuration to the /etc/apache2/modules.d/79_modsecurity.conf and tweak the settings according to your needs. Unpack the file /usr/share/doc/modsecurity-crs-3.0.2/crs-setup.conf.example.bz2 to a suitable location, e.g. /etc/conf.d/crs-setup.conf, tweak it, and include the unpacked file in /etc/apache2/modules.d/80_modsecurity-crs.conf. Finally, restart Apache. Look for the errors in the Apache log files of your sites and act accordingly.
Включение поддержки PHP
Установите PHP с USE-флагом apache2
и включите соответствующий модуль:
With >=app-eselect/eselect-php-0.8.1, the APACHE2_OPTS variable changed to
-D PHP
instead of -D PHP5
. This allows for future major versions to flow smoothly. As of eselect-php-0.9.4-r5, the compatibility shim was dropped after allowing 2 years to convert./etc/conf.d/apache2
Включение модуля PHPAPACHE2_OPTS="... -D PHP"
Перед тем как проверить, работает ли модуль PHP, убедитесь, что файл /etc/apache2/modules.d/70_mod_php.conf существует и содержит следующее определение:
/etc/apache2/modules.d/70_mod_php.conf
Проверка загрузки модуля PHP<IfDefine PHP> # Симлинк mod_php.so контролируется eselect-php. # Тем не менее, имя модуля изменяется с php5_module на php7_module, # поэтому мы не можем слепо загрузить все, как есть. # Вместо этого мы позволяем eselect-php управлять небольшим # конфигурационным файлом, который загрузит необходимые модули. # # Это относительно ServerRoot (смотрите httpd.conf). Include ../../../var/lib/eselect-php/mod_php.conf # Сообщите apache, что mod_php должен обрабатывать файлы PHP. # # ЗАМЕТКА: Избегайте AddHandler/AddType в целях безопасности (bug # #538822). Пожалуйста, прочитайте соответствующую новость! <FilesMatch "\.(php|php[57]|phtml)$"> SetHandler application/x-httpd-php </FilesMatch> # PHP исходный код, который подразумевает отображение его как # исходный код с подсветкой синтаксиса. <FilesMatch "\.phps$"> SetHandler application/x-httpd-php-source </FilesMatch> DirectoryIndex index.php index.phtml </IfDefine>
Если он не существует, то создайте его.
Чтобы проверить, работает ли модуль PHP, создайте тестовую страницу:
/var/www/localhost/htdocs/index.php
Тестовая страница PHP<html> <body> <?php phpinfo(); ?> </body> </html>
Теперь удалите или переименуйте /var/www/localhost/htdocs/index.html и откройте тестовую страницу: http://localhost/
.
Должна отобразиться таблица с настройками PHP.
Выбор версии PHP
Чтобы изменить версию PHP обработчика для Apache, нужно сперва вывести список доступных Server Application Programming Interface (SAPI) для apache2
:
root #
eselect php list apache2
[1] php5.3 [2] php5.4 * [3] php5.5
Измените на необходимую версию:
root #
eselect php set apache2 N
В приведенном выше примере замените N
на необходимый номер из вывода eselect php list apache2, который был показан ранее.
Виртуальные хосты
Для каждого виртуального хоста необходимо иметь каталог DocumentRoot
, который демон Apache сможет открыть и прочитать. Добавьте файл конфигурации виртуального хоста (VirtualHost.conf) в каталоге /etc/apache2/vhosts.d, который будет использовать данный DocumentRoot
и данное имя сервера виртуального хоста. Не забудьте добавить запись для данного доменного имени в /etc/hosts.
Чтобы назначить файлам виртуального хоста пользователя/группу apache, используйте chown, как показано в следующем примере:
root #
chown apache:apache /var/www/sitename
Ниже приведены два примера определения виртуальных хостов, один для domainname1.com, а второй для domainname2.com. Обратите внимание, что директивы DocumentRoot
и ServerName
различаются, хотя сам хост (*:80
) один и тот же:
<VirtualHost *:80> ServerAdmin email@site.com DocumentRoot /var/www/website1 ServerName domainname1.com </VirtualHost> <VirtualHost *:80> ServerAdmin email@site.com DocumentRoot /var/www/website2 ServerName domainname2.com </VirtualHost>
Также рекомендуется дать определение виртуального хоста на основании IP-адреса. Это позволит администратору оставить сообщение пользователям, которые пытаются зайти на сайт по IP-адресу:
<VirtualHost *:80> ServerAdmin email@site.com DocumentRoot /var/www/html ServerName xxx.xxx.xxx.xxx </VirtualHost>
После добавления новых хостов сервер нужно (мягко) перезапустить, чтобы новые сайты стали активны.
Включение PHP через fcgid
Установите www-apache/mod_fcgid и dev-lang/php. Пакет PHP требует включения USE-флага cgi
:
root #
emerge --ask www-apache/mod_fcgid dev-lang/php
Отредактируйте файл mod_fcgid.conf:
/etc/apache2/modules.d/20_mod_fcgid.conf
<IfDefine FCGID> LoadModule fcgid_module modules/mod_fcgid.so SocketPath /var/run/fcgidsock SharememPath /var/run/fcgid_shm AddHandler php-fcgid .php AddType application/x-httpd-php .php Action php-fcgid /fcgid-bin/php-fcgid-wrapper # max request 128mb FcgidMaxRequestLen 134217728 <Location /fcgid-bin/> SetHandler fcgid-script Options +ExecCGI </Location> </IfDefine>
Создайте необходимый каталог:
root #
mkdir /var/www/localhost/htdocs/fcgid-bin
Сделайте символическую ссылку для PHP-wrapper:
root #
ln -s /usr/bin/php-cgi /var/www/localhost/htdocs/fcgid-bin/php-fcgid-wrapper
Включите модуль FCGID
:
/etc/conf.d/apache2
Включение модуля fcgidAPACHE2_OPTS="... -D FCGID"
В конце перезапустите Apache и проверьте сайт phpinfo()
, который мы создали раньше. Значение Server API
должно быть CGI/FastCGI
Включение PHP-FPM через mod_proxy_fcgi в Apache 2.4
Следующие условия должны быть выполнены, чтобы включить PHP-FPM через mod_proxy_fcgi:
- >= PHP 5.3
- >= Apache 2.4
Кроме того, есть несколько ограничений доступной функциональности в Apache 2.4:
- >= Apache 2.4.9, если вы хотите взаимодействовать с PHP-FPM через UNIX сокет
- >= Apache 2.4.10, если вы хотите использовать SetHandler вместо ProxyPassMatch.
Следующая конфигурация будет работать только с Apache 2.4.10 и выше. Это основано на директиве FilesMatch
и располагается непосредственно в главном конфигурационного файле или в конкретных VirtualHost
. Расположение UNIX-сокета определяется в файле php-fpm.conf директивой listen
с возможностью указать различные UNIX-сокеты для различных сайтов или функций.
В следующем примере FilesMatch
размещена в конфигурационном файле модуля PHP:
/etc/conf.d/modules.d/70_mod_php.conf
Использование PHP-FPM
(рекомендуется для Apache 2.4.10 и выше)<IfDefine PHP> <FilesMatch "\.php$"> SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost/" </FilesMatch> # Set it to handle the files <IfModule mod_mime.c> AddHandler application/x-httpd-php .php .php5 .phtml AddHandler application/x-httpd-php-source .phps </IfModule> DirectoryIndex index.php index.phtml </IfDefine>
Или вы можете использовать ProxyPassMatch — единственный вариант, если версия Apache между 2.4.0 и 2.4.8 включительно.
/etc/apache2/modules.d/70_mod_php.conf
Использование PHP-FPM (рекомендуется для Apache 2.4.8 и старее)<IfDefine PHP> # Send all requested PHP files to PHP-FPM via fcgi://PHP_FPM_LISTEN_ADDRESS:PHP_FPM_LISTEN_PORT/DOCUMENT_ROOT/$1 ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/localhost/htdocs/$1 # Set it to handle the files <IfModule mod_mime.c> AddHandler application/x-httpd-php .php .php5 .phtml AddHandler application/x-httpd-php-source .phps </IfModule> DirectoryIndex index.php index.phtml </IfDefine>
По умолчанию директива listen
не настроена для использования сокета. Сперва создайте каталог для файла сокета:
root #
mkdir /var/run/php-fpm
Затем обновите php-fpm.conf файл следующим образом:
php-fpm.conf
Изменение директивы listen; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many ; BSD-derived systems allow connections regardless of permissions. ; Default Values: user and group are set as the running user ; mode is set to 0666 listen.owner = nobody listen.group = nobody ;listen.mode = 0666 ; The address on which to accept FastCGI requests. ; Valid syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on ; a specific port; ; 'port' - to listen on a TCP socket to all addresses on a ; specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. ;listen = 127.0.0.1:9000 listen = /var/run/php-fpm/www.sock
Затем подключите модули PHP
и PROXY
:
/etc/conf.d/apache2
Включение модулей PHP и proxyAPACHE2_OPTS="... -D PHP -D PROXY"
Использование
Сервисы
OpenRC
Запуск сервера Apache:
root #
/etc/init.d/apache2 start
Добавление Apache в уровень запуска по умолчанию:
root #
rc-update add apache2 default
Перезапуск службы Apache:
root #
/etc/init.d/apache2 restart
Перезагрузка конфигурационных файлов Apache:
root #
/etc/init.d/apache2 reload
systemd
Запуск сервера Apache:
root #
systemctl start apache2
Добавление Apache в уровень запуска по умолчанию:
root #
systemctl enable apache2
Перезапуск службы Apache:
root #
systemctl restart apache2
Устранение проблем
Ссылки
Сервер Apache бывает трудно настроить правильно. Ниже приведены некоторые ссылки, которые могут быть полезны при возникновении проблем:
Тестирование
Проверка IP-интерфейсов и портов, на которых Apache2 работает и слушает их:
root #
netstat -tulpen | grep apache
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 10932720 4544/apache2 tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 0 10932716 4544/apache2
Проверка соединения с запущенным на localhost сервером Apache:
user $
telnet localhost 80
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
Тестовое соединение можно разорвать нажатием Ctlr+c и Enter.
apr_sockaddr_info_get() failed for <System_Hostname>
Ошибка:
apache2: apr_sockaddr_info_get() failed for System_Hostname
Решение:
Когда такое происходит, добавьте имя хоста в файл /etc/hosts:
/etc/hosts
Добавление имени хоста для Apache127.0.0.1 localhost System_Hostname
Смотрите также
- Lighttpd — a fast and lightweight web server.
- Nginx —
Внешние ресурсы
- Статья Slicehost: Установка Apache в Gentoo
- Статья Slicehost: Конфигурационые файлы Apache в Gentoo
- Статья Slicehost: Настройка Apache MPM в Gentoo
- Статья Slicehost: Настройка Apache в Gentoo
- Статья Slicehost: Виртуальные хосты Apache в Gentoo
- Статья Slicehost: Включение и использование модуля Apache mod_status в Gentoo
- Документация apache.org
- Apache2 mod_pagespeed