httpd2.2/2.4全攻略
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpd2.2/2.4全攻略相关的知识,希望对你有一定的参考价值。
httpd-2.2/2.4配置用法全攻略
本文介绍以下四部分内容,且看下文。
一、简介
The Apache HTTP Server is a powerful, efficient, and extensible web server.
from http://httpd.apache.org/
httpd is the Apache HyperText Transfer Protocol (HTTP) server program. It is designed to be run as a standalone daemon process. When used like this it will create a pool of child processes or threads to handle requests. form https://httpd.apache.org/docs/2.4/programs/httpd.html
以上简介来自apache官方网页,我自己简单理解是这样的。首先httpd服务是基于http超文本传输协议的服务程序。它是非常强大,有效率以及高扩展性的web服务。它以独立的守护进程的方式运行,支持多进程多线程处理多个请求。不仅仅这样httpd还具有很多的特性,比如模块化是它最强大的一个特性,下面介绍httpd的特性。
二、httpd的特性
我个人理解,httpd有两大特性(应该不全):一是高度模块化;二是DSO,即可动态地加载模块。
2.1 高度模块化
也许你会问高度模块化有什么用?高度模块化用处可大着呢!想象这样一个情况,假如我们的手机可以实现模块化,那我们就可以根据自己的喜欢定制自己钟爱的手机,我们随时可以根据自己的心情,任何时间,任何地点,修改自己的手机,想想是不是很刺激。那httpd也一样,我们也可以根据模块化,定制一款自己钟爱的httpd服务。长话短说,高度模块化就是功能模块化,可根据自己需要的功能添加对应的模块。
模块化中有一个MPM模块十分的重要,不得不说。
MPM翻译过来就是多路处理模块,你也可以理解为多进程处理模块,因为此模块跟进程相关。三个模块的介绍以及区别,如下图所示。
你可以看到,MPM模块主要是跟进程,线程以及响应请求相关,也就是和我们的web并发访问相关的。因此,你可以评估web访问的相关情况来选择合适的模块。
CentOS7系统中想要查看或者修改MPM在此配置文件:/etc/httpd/conf.modules.d/00-mpm.conf
CentOS6系统中想要查看或者修改MPM在此配置文件:/etc/sysconfig/httpd
另外需要注意的是:CentOS6中event(事件驱动机制)还不成熟,因此很少用;而CentOS7中event(事件驱动机制)已经成熟,可以投入到生产环境中使用。
此外httpd还支持很多的模块,比如mpm_winnt,它是支持windowNT的多线程MPM模块;比如mod_ssl,它是支持安全加密的模块,我们想要做一个基于https安全的web访问就需要用到这个模块。
模块有很多,详见官方文档:https://httpd.apache.org/docs/2.4/mod/
2.2 DSO(动态共享对象)
DSO(dynamic shared object),动态共享对象,即可动态加载模块。光有很多模块不行,还得要实现模块加载的方式,DSO就是这么一个实现,可以动态加载模块。
详见官方链接:http://httpd.apache.org/docs/current/dso.html
三、httpd的功能特性
httpd的功能特性如图所示,因为在后面的常见配置中会被详细说明,所以此处尽量长话短说。
1.CGI
通用网关接口
实现动态页面
性能差
参考链接:http://docs.huihoo.com/apache/httpd/2.0-cn/howto/cgi.html
2.支持虚拟主机的功能
简单理解,虚拟主机就是在单一机器上运行多个网站。它的实现方式有以下三种:
即基于IP地址实现虚拟主机,基于port端口实现虚拟主机,即基于FQDN实现虚拟主机,FQDN由主机名以及域名组成。它们的特点已在图中所示,还请看图。实现虚拟主机必将需要指令,指令将会在常见配置中详细说明。常见指令如下:
<VirtualHost> ServerName ServerAlias DocumentRoot CustomLog ErrorLog </VirutalHost>
参考链接:
https://httpd.apache.org/docs/2.4/vhosts/
http://httpd.apache.org/docs/2.2/vhosts/
3.支持反向代理
简单理解,就是服务器的代理。后端服务器(如Web服务器)响应用户请求,然后再将响应报文返回代理服务器,再经由代理服务器将响应报文发送给客户端。
4.支持负载均衡
简单理解,就是将负载合理分配,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
5.支持路径别名
路径别名关联一个目录或者文件的路径,它与url和文件系统路径的映射相关,会在常见配置中详细说明。
参考链接:http://www.178linux.com/12685
6.支持用户认证机制
简单理解,即认证用户的合法性,比如认证账号,密码,身份等等。用户认证机制支持多种认证方式,常见的有basic(基本认知方式)和digest(摘要认证),基于算法的认证方式。
7.支持第三方模块
如果你能力足够强大,完全可以自己制作一个模块嵌入httpd服务当中,这个功能相当人性化以及具备开源精神。
四、httpd的程序版本
httpd到目前为止有四个版本。1.3官方已经停止维护,不再介绍。
2.0也用到极少,也不再介绍,详见链接:http://httpd.apache.org/docs/2.0/ 主要详细介绍2.2以及2.4。
4.1 httpd2.2
httpd2.2介绍两个部分:程序环境以及常用配置。
4.1.1 httpd2.2程序环境
httpd2.2的程序环境如下,在这里我主要介绍CentOS6.8的程序环境。具体信息还请看思维导图,文字只做部分补充。
配置文件补充:
配置文件:/etc/httpd/conf/httpd.conf主要分为三大部分内容,分别为全局环境配置,主服务配置,虚拟主机配置。我们定义的站点信息可以在/etc/httpd/conf/httpd.conf中配置,也可以在/etc/httpd/conf.d/中自定义一个以.conf结尾的配置文件,在其中配置站点信息。
Section 1: Global Environment
Section 2: ‘Main‘ server configuration
Section 3: Virtual Hosts
主程序文件补充:
/usr/sbin/httpd.worker
/usr/sbin/httpd.event(2.2测试阶段)
两种MPM模块在上面已有介绍,如果不记得可以返回看看。默认开启worker模式
日志文件补充:
日志文件分为访问日志和错误日志,我们也可以自定义日志的存放路径,这个将在常见配置中介绍。
4.1.2 httpd2.2常见配置
总结了19个常见配置,其中有些是工具与配置无关,但在httpd的工作或者测试中会用到,因此也放在了常见配置中。
这些常见配置主要在以下两个路径配置,但个别不再此路径中,我会在相应的文段中特别说明。
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf #推荐此方法,模块化思想
所有的配置都支持如下的格式
directive value
directive:指令,不区分字符大小写;
value:值为路径时,是否区分字符大小写,取决于文件系统;
1、修改监听的IP和PORT
Format
Listen [IP-address:]portnumber [protocol]
Note
(1) 省略IP表示为0.0.0.0
(2) Listen指令可重复出现多次
(3)修改监听socket,重启服务进程方可生效
(4)限制其必须通过ssl通信时,protocol需要定义为https
2、长连接(PersistentConnection)
定义
也称为持久连接,tcp连续建立后,每个资源获取完成后不完全断开连接,而是继续等待其它资源请求的进行。
如何断开
数量限制
时间限制
副作用
对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应
解决方案
使用较短的持久连接时长,以及较少的请求数量
例子
设置
KeepAlive On|Off #是否开启长连接
KeepAliveTimeout 15 #长连接最大时长
MaxKeepAliveRequests 100 #长连接最大请求数量
测试
telnet WEB_SERVER_IP PORT #使用telnet命令输入web服务的IP 端口
GET /URL HTTP/1.1 #请求方式 站点名称 http协议版本
Host: WEB_SERVER_IP #主机IP
3、MPM配置
3.1查看httpd的MPM工作模式
ps aux | grep httpd
3.2查看httpd的模块列表
查看静态编译的模块:httpd -l
查看静态编译及动态编译的模块:httpd -M
3.3更换使用的MPM机制
配置文件:/etc/sysconfig/http注意:
重启服务进程方可生效
3.4MPM配置
3.4.1 prefork的配置
<IfModule prefork.c>
StartServers 8 #起始空闲进程数
MinSpareServers 5 #最小空闲进程
MaxSpareServers 20 #最大空闲进程数
ServerLimit 256 #最大活动进程数
MaxClients 256 #并发请求的最大数; #请求连接进来不一定会活动,要小于等于serverlimit
MaxRequestsPerChild 4000 #每个子进程在生命周期内所能够服务的最多请求个数
</IfModule>
3.4.2 worker的配置
<IfModule worker.c>
StartServers: #启动的子进程的个数
MaxClients: #并发请求的最大数;
MinSpareThreads: #最小空闲线程数;
MaxSpareThreads: #最大空闲线程数;
ThreadsPerChild: #每个子进程可生成的线程数;
MaxRequestsPerChild: #每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定;
</IfModule>
4、DSO(动态共享对象)
DSO,即动态地加载指定模块。
格式:LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径,相对于ServerRoot(默认/etc/httpd)
5、定义‘Main‘ server的文档页面路径
ServerName
Description: Hostname and port that the server uses to identify itself(即主机名).
语法格式: ServerName [scheme://]fully-qualified-domain-name[:port]
比如这样:ServerName www.google.com
DocumentRoot ""
Description: Directory that forms the main document tree visible from theweb(web页面根目录,DoucmentRoot指向的路径为URL路径的起始位置,其相当于站点URL的根路径).
Syntax: DocumentRoot directory-path
比如这样:DocumentRoot /web/www/html
注意:URL PATH与FileSystem PATH不是等同的,而是存在一种映射关系;
比如存在下面的对应关系
URL / --> FileSystem /var/www/html/
/images/logo.jpg --> /var/www/html/images/logo.jpg
6、站点访问控制常见机制
可基于两种机制对资源进行访问控制,一是操作系统中的文件系统路径,二是通过站点的URL路径来实现控制。
6.1 通过文件系统路径实现访问控制
<Directory>和</Directory>用于封装一组指令,使之仅对某个目录及其子目录生效。任何可以在"directory"作用域中使用的指令都可以使用。Directory-path可以是一个目录的完整路径,或是包含了Unixshell匹配语法的通配符字符串。在通配符字符串中,"?"匹配任何单个的字符,"*"匹配任何字符序列。您也可以使用"[]"来确定字符范围。但需要注意的是,以上通配符都不能匹配"/"字符。
<Files>指令提供了基于文件名的访问控制的方式。
以下是从官方文档摘录下来的,很值得参考:
<Directory""> #对目录封装
...
</Directory>
<Directory />
Order Deny,Allow
Deny from All #表示拒绝所有所有人访问操作系统的/目录
</Directory>
<Directory ~ "public_html/.*"> #表示对目录public_html下的任何路径资源封装
# ... directives here ...
</Directory>
<DirectoryMatch "^/www/(.+/)?[0-9]{3}"> #将匹配/www/下所有由3个数字组成的目录。
<File ""> #基于文件名的访问控制
...
</File>
<Files "?at.*"> #对cat.html, bat.html, hat.php等等文件进行匹配封装。
# This would apply to cat.html, bat.html, hat.php and so on.
</Files>
<FileMatch"PATTERN"> #通过正则表达式,基于文件的访问控制
...
</FileMatch>
<FilesMatch "\.(gif|jpe?g|png)$"> #对.gif,,jpeg,.png等等文件进行匹配封装
6.1.1<Directory>中“基于源地址”实现访问控制
6.1.1.1 httpd-2.2中实现,通过order指令实现基于源地址的访问控制
order指令
说明:控制默认的访问状态与Allow和Deny指令生效的顺序
语法:Order ordering
默认值Order Deny,Allow
Allow from, Deny from
在下面的例子中,apache.org域中所有主机都允许访问,而其他任何主机的访问都将被拒绝。
Order Deny,Allow Deny from all Allow from apache.org
下面这张表说明了allow,deny的规则
6.1.1.2 httpd-2.4中实现
基于IP控制:
Require ip IP地址或网络地址
Require not ip IP地址或网络地址
基于主机名控制:
Require host 主机名或域名
Require not host 主机名或域名
下面是httpd-2.2以及httpd-2.4实现访问控制的几个例子
控制页面资源允许所有来源的主机可访问 httpd-2.2 <Directory ""> Order allow,deny Allow from all </Directory> httpd-2.4 <Directory ""> Require all granted </Directory> 控制页面资源拒绝所有来源的主机可访问 httpd-2.2 <Directory ""> Order allow,deny Deny from all </Directory> httpd-2.4 <Directory ""> Require all denied </Directory>
6.2 通过URL路径实现访问控制
说明:将封装的指令作用于匹配的URL
语法:<Location URL-path|URL> ... </Location>
<Location>提供了基于URL的访问控制。
自foo.com的用户起效,你可以这样使用: <Location /status> SetHandler server-status Order Deny,Allow Deny from all Allow from .foo.com </Location> <LocationMatch "/(extra|special)/data"> #说明:将封装的指令作用于正则表达式匹配的URL </LocationMatch> 将匹配包含子串"/extra/data"或"/special/data"的URL。
6.3 Options指令说明
说明:配置在特定目录的选项,这些选项可以指定使用哪些特性
语法:Options [+|-]option [[+|-]option] ...
默认值:Options All
option可以为None ,在这种情况下,将不启用任何额外特性。
All
除MultiViews之外的所有特性都生效。这是默认设置。
ExecCGI
允许使用mod_cgi执行CGI脚本。
FollowSymLinks
服务器允许在此目录中使用符号连接特性。
Indexes
如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回由mod_autoindex生成的一个格式化后的目录列表。
<Directory /web/docs> Options Indexes FollowSymLinks </Directory>
7、定义站点主页面
DirectoryIndex index.html index.txt /cgi-bin/index.pl
8、定义路径别名
说明:映射URL到文件系统的特定区域
语法:Alias URL-path file-path|directory-path
作用域:server config, virtual host
Alias指令使文档可以被存储在DocumentRoot以外的本地文件系统中。
示例:
Alias /image /ftp/pub/image
对"http://myserver/image/foo.gif"的请求,服务器将返回"/ftp/pub/image/foo.gif"文件。
9、设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
10、日志设定
10.1 访问日志
CustomLog 指令
说明:设定日志的文件名和格式
语法:CustomLog file|pipe format|nickname [env=[!]environment-variable]
作用域:server config, virtual host
CustomLog指令用来对服务器的请求进行日志记录。第一个参数指定了日志记录的位置,第二个参数指定了写入日志文件的内容.
# 明确使用格式格式字符串
CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b"
#简单设置方式
CustomLog logs/access_log combined #相对于ServerRoot的日志文件名。
LogFormat format strings:
详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h:客户端IP地址;
%l:Remote User, 通常为一个减号(“-”);
%u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;
%t:服务器收到请求时的时间;
%r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
%>s:响应状态码;
%b:响应报文的大小,单位是字节;不包括响应报文的http首部;
%{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
%{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
10.2 错误日志
ErrorLog 指令
说明:存放错误日志的位置
语法:ErrorLog file-path|syslog[:facility]
默认值:ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows 和 OS/2)
作用域:server config, virtual host
ErrorLog指令指定了记录错误日志的文件。如果file-path不是一个以斜杠(/)开头的绝对路径,那么将被认为是一个相对于ServerRoot的相对路径。
示例
ErrorLog /var/log/httpd/error_log
记录错误日志的等级一般是:LogLevel warn,以下是关于错误日志的说明
11、基于用户的访问控制
说明:认证(Authorization)就是用户填入账号和密码后再次向服务端发送请求报文;认证通过时,则服务器发送响应的资源。
11.1 基于basic方式认证(明文)
11.1.1 基于用户进行认证
思路:
(1) 定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile "/PATH_FILE"
Require user username1 username2 ...
</Directory>
(2) 提供账号和密码存储(文本文件)
使用专用命令完成文件的创建及用户管理
htpasswd [options]/PATH_PASSWD_FILE username
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户
-b:批模式添加用户
htpasswd -b [options] PATH_PASSWD_FILE username password #批量指定用户名以及密码
11.1.2 基于组账号进行认证
思路:
(1) 定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile "PATH_PASSWD_FILE"
AuthGroupFile "PATH_GROUP_FILE"
Require group grpname1 grpname2 ...
</Directory>
(2) 创建用户账号和组账号文件
组文件:每一行定义一个组 GRP_NAME: username1 username2 ...
12、虚拟主机
说明:虚拟主机功能十分重要。简单来说,虚拟主机可以实现的功能就是在一台服务器上虚拟出多台主机的效果,可以实现多个站点的配置。虚拟主机的实现方案如下
虚拟主机可以通过三种方式实现,即基于ip,基于port,基于FQDN(由主机名和域名组成,通常就是指一个站点名)。需要注意的是,在httpd2.2中,如果需要使用虚拟主机的功能,要先禁用mian host中的#DocumentRoot,而httpd2.4则不需要。三种实现方式的特点如下:
虚拟主机的配置方法:
<VirtualHost IP:PORT> ServerName FQDN DocumentRoot "" </VirtualHost>
以下是三种配置方式的例子。
基于IP的虚拟主机示例: <VirtualHost 172.16.100.6:80> ServerName www.a.com DocumentRoot "/www/a.com/htdocs" </VirtualHost> <VirtualHost 172.16.100.7:80> ServerName www.b.net DocumentRoot "/www/b.net/htdocs" </VirtualHost> <VirtualHost 172.16.100.8:80> ServerName www.c.org DocumentRoot "/www/c.org/htdocs" </VirtualHost> 基于端口的虚拟主机 <VirtualHost 172.16.100.6:80> ServerName www.a.com DocumentRoot "/www/a.com/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:808> ServerName www.b.net DocumentRoot "/www/b.net/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:8080> ServerName www.c.org DocumentRoot "/www/c.org/htdocs" </VirtualHost> 基于FQDN的虚拟主机 <VirtualHost 172.16.100.6:80> ServerName www.a.com DocumentRoot "/www/a.com/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:80> ServerName www.b.net DocumentRoot "/www/b.net/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:80> ServerName www.c.org DocumentRoot "/www/c.org/htdocs" </VirtualHost> 注意:如果是httpd-2.2,在使用基于FQDN的虚拟主机时,需要事先使用如下指令: NameVirtualHost IP:PORT
13、status页面
显式页面的状态信息
LoadModule status_module modules/mod_status.so #加载网页状态模块
示例
<Location /server-status> SetHandler server-status Order allow,deny Allow from 172.16 </Location> httpd-2.4 <Location /server-status> SetHandler server-status <RequireAll> Require ip 172.16 </RequireAll> </Location>
14、curl命令
有关curl命令的用法,请看下图。
15、user/group
指定以哪个用户的身份运行httpd服务进程;
User apache
Group apache
16、mod_deflate模块
当带宽压力大时会启用压缩,启用压缩不但能优化传输速度也能节约带宽。此模块的特点如下
下面是一个示例
[email protected] html]# vim /etc/httpd/conf/httpd.conf SetOutputFilter DEFLATE #启用deflate [[email protected] conf.d]# vim deflate.conf # Restrict compression to these MIME types 定义要压缩的文件类型 AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/css # Level of compression (Highest 9 - Lowest 1) DeflateCompressionLevel 9 #压缩比,默认为6 # Netscape 4.x has some problems. BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
17、https,http over ssl
https即指http基于ssl协议,这种协议使得用户访问站点时更加的安全。
在httpd中配置https的思路是这样的:
(1) 为服务器申请数字证书
具体步骤可以参考我另一篇博客http://powermichael.blog.51cto.com/12450987/1933580
(2)配置httpd支持使用ssl及使用的证书
1.安装ssl模块 yum -y install mod_ssl
2.修改配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot #URL映射的文件系统路径
ServerName #主机名
SSLCertificateFile #签署证书文件路径
SSLCertificateKeyFile #私钥文件存放路径
(3) 测试基于https访问相应的主机
openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
18、httpd自带的工具程序
19、httpd的压力测试工具
4.2 httpd2.4
httpd2.4的介绍分为以下四部分内容。由于httpd2.4常用配置和httpd2.2大抵相似,所以在这便不做过多的介绍。不同之处,也已经在httpd2.2的配置中说明,所以此处只做httpd2.4程序环境,新特性以及新模块的介绍。
4.2.1 httpd2.4程序环境
补充:修改MPM模块的文件路径:/etc/httpd/conf.modules.d/00-mpm.conf
4.2.2 httpd2.4常用配置(省略,请参考httpd2.2常用配置)
4.2.3 httpd2.4新特性
httpd2.4的新特性如图所示。
4.2.4 httpd2.4新模块
mod_proxy_fcgi 支持PHP等动态语言
mod_proxy_scgi SCGI Protocol,支持Python
mod_remoteip 获取远端真实访问IP
想了解更多的新模块功能,请看官网:http://httpd.apache.org/docs/2.4/new_features_2_4.html
本文出自 “有趣灵魂” 博客,请务必保留此出处http://powermichael.blog.51cto.com/12450987/1939292
以上是关于httpd2.2/2.4全攻略的主要内容,如果未能解决你的问题,请参考以下文章