Apache

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Apache and the translation is 99% complete.

Outdated translations are marked like this.
Other languages:
Deutsch • ‎English • ‎Nederlands • ‎español • ‎français • ‎italiano • ‎polski • ‎português do Brasil • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

The Apache HTTP Server is an efficient, extensible web server. It is one of the most popular web servers used the Internet.

安装

Note
如果是升级 Apache 新版本,请查看 Upgrade guide.

USE 标记

USE flags for www-servers/apache The Apache Web Server

apache2_modules_access_compat Group authorizations based on host (name or IP address). Available as a compatibility module with previous versions.
apache2_modules_authn_core Provides core authentication capabilities common to all authentication providers (functionality provided by authn_alias in previous versions).
apache2_modules_authz_core Provides core authorization capabilities to various authorization/authorization modules, such as authn_file and authz_user.
apache2_modules_authz_dbd Provides authorization capabilities via SQL database so that authenticated users can be allowed or denied access to portions of the web site by group membership.
apache2_modules_brotli Enable brotli compression support
apache2_modules_cache_disk Disk based storage module for the HTTP caching filter (similar to mem_cache in previous versions).
apache2_modules_cache_socache Shared object cache (socache) based storage module for the HTTP caching filter.
apache2_modules_http2 Enable http2/alpn module
apache2_modules_lbmethod_bybusyness Pending request counting load balancer scheduler algorithm for proxy_balancer.
apache2_modules_lbmethod_byrequests Request counting load balancer scheduler algorithm for proxy_balancer.
apache2_modules_lbmethod_bytraffic Weighted traffic counting load balancer scheduler algorithm for proxy_balancer.
apache2_modules_lbmethod_heartbeat Heartbeat traffic counting load balancer scheduler algorithm for proxy_balancer.
apache2_modules_macro Macros for the Apache config file.
apache2_modules_md Managing domains across virtual hosts, certificate provisioning via the ACME protocol.
apache2_modules_proxy_fcgi FCGI support module for mod_proxy.
apache2_modules_proxy_html Module to rewrite links in html pages behind a reverse proxy
apache2_modules_proxy_http2 HTTP2 support module for mod_proxy.
apache2_modules_proxy_wstunnel Provides support for the tunnelling of web socket connections to a backend websockets server.
apache2_modules_ratelimit Ratelimit module for transfer rate management
apache2_modules_remoteip Remotip module for logging
apache2_modules_slotmem_shm Slot-based shared memory provider.
apache2_modules_socache_shmcb A shared object cache provider using a high-performance cyclic buffer inside a shared memory segment.
apache2_modules_unixd Basic (required) security for Unix-family platforms.
apache2_modules_watchdog Provides infrastructure for other modules to periodically run tasks
apache2_modules_xml2enc Enable xml2 encoding module
ldap Add LDAP support (Lightweight Directory Access Protocol)
static Link in apache2 modules statically rather then plugins
suexec Install suexec with apache
suexec-caps Install suexec with capabilities instead of SUID
suexec-syslog Log suexec to syslog instead of to a separate file

安装

如果你要使用 Apache event MPM 模式, 把下面的内容添加到 make.conf 里面:

FILE /etc/portage/make.confApache event MPM
APACHE2_MPMS="event"

如果你要使用 Apach worker MPM 模式, 把下面的内容添加到 make.conf 里面:

FILE /etc/portage/make.confApache worker MPM
APACHE2_MPMS="worker"

查看Apache的USE标志

FILE /etc/portage/package.useApache threads support
www-servers/apache threads

然后我们安装Apache:

root #emerge --ask www-servers/apache

Global USE 支持

开启apache2 global USE 标志可以给Apache多提供一些其他的软件包。 可能在安装www-servers/apache时,如果Apache依赖其他软件时,他们就会被安装。

FILE /etc/portage/make.conf添加 Apache 到 system USE 标志
USE="apache2"

配置USE变量以后,更新系统来使得某些配置生效。

root #emerge --ask --changed-use --deep @world

配置

文件

在系统里,Apache2有两个主要的配置文件:

  • Gentoo 的 Apache2 初始化配置文件 /etc/conf.d/apache2
  • Apache2 服务器的常规配置文件

/etc/apache2/httpd.conf

/etc/conf.d/apache2

apache2 位于 /etc/conf.d ,他是 Gentoo 初始化脚步配置的文件。唯一生效的一行是APACHE2_OPTS :

FILE /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指令组合在一起。 例如,httpd.conf中的语句Include /etc/apache2/modules.d/*.conf旨在将所有包含在/apache2/modules.d/文件夹中的文件组合起来,其文件名以 .conf结尾。

考虑到上面小节中的描述,如果选项使用位于 /etc/conf.d/apache2 文件中的 APACHE2_OPTS </ var> 变量的 -D module-name 标记。那么作为模块配置文件 ( /etc/apache2/modules.d) 几乎总是以<IfDefine module-name>,在/ect/apache2/modules.d中的一个文件的内容,与其余部分的配置组合。00_default_settings.conf 配置文件是此规则的例外,因为它不以IfDefine语句开头,因此始终包含在生成的配置中。

默认值

在全新安装Apache服务器之后,由不同配置文件的集合生成的配置如下。 从入口点/etc/apache2/httpd.conf开始。

警告
这是“只有”给出快速参考和给出一个总体看法。 强烈请求您查看各种文件中包含的注释,以了解配置中的内容。 还请参阅Apache手册以深入了解Apache配置。
FILE /etc/apache2/httpd.conf
ServerRoot "/usr/lib64/apache2"
  
#Module loaded unconditionally, assuming the USE flag is no unset in
# /etc/portage/make.conf or in /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
  
  
#Modules loaded conditionally, assuming matching USE flag is not unset in
# /etc/portage/make.conf or in /etc/portage/package.use (flag to be set in )
<IfDefine AUTHNZ_LDAP>
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
</IfDefine>
#other modules loaded that way : 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
  
# Supplemental configuration
#**************************************************************************************vvv
#this part is included via Include /etc/apache2/modules.d/*.conf 
  
#included from /etc/apache2/modules.d/00_default_settings.conf-------------v
#this is always included as there is not option to deactivate it.
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
#included from 00_languages.conf
# Settings for hosting different languages.
<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
#this part is included via Include /etc/apache2/vhosts.d/*.conf 
#from 00_default_ssl_vhost.conf-----------------------------------------------------vv
<IfDefine SSL>
	<IfDefine SSL_DEFAULT_VHOST>
		<IfModule ssl_module>
			Listen 443
  
			<VirtualHost _default_:443>
				ServerName localhost
                                #------------------------------------------v
				# this part is included via 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>
        			#end of 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>
#---------------------------------------------------------------------------------^^
#from 00_default_vhost.conf-------------------------------------------------------vv
<IfDefine DEFAULT_VHOST>
	Listen 80
	NameVirtualHost *:80
  
	<VirtualHost *:80>
		ServerName localhost
  
		#---------------------------------------------------------------v
		# this part is included via 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>
        	#end of Include -----------------------------------------------^
  
		<IfModule mpm_peruser_module>
			ServerEnvironment apache apache
		</IfModule>
	</VirtualHost>
</IfDefine>
#-----------------------------------------------------------------------------------^^
# end of include ****************************************************************************************^^^

新的开始

在上面的初始配置中可以看到,安装的虚拟主机的DocumentRoot目录是/var/www/localhost/htdocs,其服务器名称是“localhost”。 此外,在DocumentRoot目录中提供了一个index.html文件,以检查一切是否正确安装,打开浏览器访问http://localhost/

"It works!"的字样应该被打印到您的屏幕上。
警告
Firefox开箱即用的功能旨在帮助那些在浏览器栏中输入错误的网址的用户。 如果网址无法解析,Firefox会尝试对网址进行一些更改,以尝试找到用户可能想要的内容,附加一个 .com 或加上 www. 到URL的主机名部分,以查看它们是否解析。

这个功能,在早期版本的Firefox中引入,对开发人员有点讨厌。 该功能意味着当在localhost上运行的服务器无法响应时,Firefox决定尝试localhost.comwww.localhost.com. 这通常解析为未找到的页面。

要禁用该功能

  1. 输入 about:config 到地址栏
  2. 输入browser.fixup.alternate.enabled在搜索栏
  3. 右键单击 browser.fixup.alternate.enabled 出现在以下过滤的列表中,并选择toggle以将值设置为false。

开启 mod_security

安装 www-apache/mod_security:

root #emerge --ask www-apache/mod_security

要开启apache2SECURITY模块,更改APACHE2_OPTS的值:

FILE /etc/conf.d/apache2开启安全模块
APACHE2_OPTS="... -D SECURITY"

要控制这些模块,请更改 /etc/apache2/modules.d/79_modsecurity.conf/etc/apache2/modules.d/80_modsecurity-crs.conf两个文件,然后重启Apache。

开启 PHP 支持

安装 PHP 附带 apache2 USE 标志,然后开启PHP模块:

重要
With >=app-eselect/eselect-php-0.8.1,APACHE2_OPTS 这个值由于-D PHP 取代了 -D PHP5而变化。 这允许未来的主要版本顺利发展。
FILE /etc/conf.d/apache2开启PHP模块
APACHE2_OPTS="... -D PHP"

在测试PHP模块是否工作前,检查文件 /etc/apache2/modules.d/70_mod_php.conf 是否存在,是否包含以下默认值。

FILE /etc/apache2/modules.d/70_mod_php.conf验证PHP模块是否被加载
<IfDefine PHP>
	# The mod_php.so symlink is controlled by
	# eselect-php. However, the module name changed from
	# php5_module to php7_module so we can't blindly load whatever
	# is there. Instead we let eselect-php manage a small
	# configuration file that loads the appropriate module.
	#
	# This is relative to ServerRoot (see httpd.conf).
	Include ../../../var/lib/eselect-php/mod_php.conf
 
	# Tell apache that mod_php should handle PHP files.
	#
	# NOTE: Avoiding AddHandler/AddType for security (bug
	# #538822). Please read the related news item!
	<FilesMatch "\.(php|php[57]|phtml)$">
		SetHandler application/x-httpd-php
	</FilesMatch>
 
	# PHP source files which are meant to be displayed as
	# syntax-highlighted source code.
	<FilesMatch "\.phps$">
		SetHandler application/x-httpd-php-source
	</FilesMatch>
 
	DirectoryIndex index.php index.phtml
</IfDefine>

如果不存在请手动创建一个。

要验证PHP模块是否启动,创建个测试页面:

FILE /var/www/localhost/htdocs/index.phpPHP 测试页
<html>
 <body>
  <?php phpinfo(); ?>
 </body>
</html>

现在,把他重命名为 /var/www/localhost/htdocs/index.html,然后打开测试页面:http://localhost/

应该可以看到一个描述PHP配置的表格。

修改 PHP 版本

要更改Apache处理的PHP版本,首先列出 apache2 服务器应用程序编程接口(SAPI)的可用版本:

root #选择 PHP 用于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)目录中添加使用此DocumentRoot 和虚拟主机服务器的虚拟主机配置文件 /etc/apache2/vhosts.d。 不要忘了在/etc/hosts添加一个该域名的条目 。

要在虚拟主机文件上分配apache user/group 所有权,请使用chown ,如以下示例所示:

root #chown apache:apache /var/www/sitename

下面是两个示例虚拟主机的例子,一个用于domainname1.com,一个用于domainname2.com。 注意使用不同的DocumentRootServerName指令,即时主机本身(*:80)保持不变:

CODE 几个虚拟主机的例子
<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地址访问网站的用户发送消息:

CODE IP-based虚拟主机
<VirtualHost *:80>
    ServerAdmin email@site.com
    DocumentRoot /var/www/html
    ServerName xxx.xxx.xxx.xxx
</VirtualHost>

加入虚拟主机后,服务器需要(正常)重新启动以使新站点变为活动状态。

通过fcgid 开启 PHP

安装 www-apache/mod_fcgiddev-lang/php。 PHP 这个包需要有 cgi 这个USE标志:

root #emerge --ask www-apache/mod_fcgid dev-lang/php

编辑mod_fcgid.conf :

FILE /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模块:

FILE /etc/conf.d/apache2开启fcgid 模块
APACHE2_OPTS="... -D FCGID"

最后重启并检查phpinfo()Server API 应该被设置为 CGI/FastCGI

在Apache 2.4上通过 mod_proxy_fcgi开启PHP-FPM

必须满足以下条件才能通过mod_proxy_fcgi启用PHP-FPM:

  • >= PHP 5.3
  • >= Apache 2.4

此外,Apache 2.4中的功能的可用性有一些限制:

以下配置将仅适用于Apache 2.4.10及更高版本。 它依赖于FilesMatch指令,并放在主服务器配置或VirtualHosts中。 UNIX socket的位置由 php-fpm.conf配置文件中的listen指令确定,允许为每个站点或函数指定单独的池。

在下面的例子中 FilesMatch 被放在Apache的PHP模块配置文件中:

FILE /etc/apache2/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之间。

FILE /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指令未设置为socket。 首先创建socket文件的目录:

root #mkdir /var/run/php-fpm

接下来,像下面这样更新php-fpm.conf:

FILE php-fpm.conf更新 listen directive
; 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

同时开启PHPPROXY 模块:

FILE /etc/conf.d/apache2开启 PHP 和 proxy 模块
APACHE2_OPTS="... -D PHP -D PROXY"

用法

服务

OpenRC

开启Apache服务

root #/etc/init.d/apache2 start

将Apache添加至default runlevel:

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添加至default runlevel:

root #systemctl enable apache2

重启Apache服务

root #systemctl restart apache2

故障排除

资源

Apache很难配置的很好。下面是一些可能有用的资源,如果你遇到错误可以看看。

测试

验证Apache上一个IP端口是否开启并监听:

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        

测试Apache服务器在localhost上是否正常工作:

user $telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

可以使用Ctrl+c 或者 Enter来中断测试。

apr_sockaddr_info_get() failed for <System_Hostname>

错误:

apache2: apr_sockaddr_info_get() failed for System_Hostname

解析:

发生这种情况时,请将主机名添加到 /etc/hosts文件中:

FILE /etc/hosts添加一个 Hostname 到 Apache
127.0.0.1 localhost System_Hostname

另请参阅

外部资源