本文使用的httpd安装包为:httpd-2.2.15-29.el6.centos.x86_64
httpd的配置文件说明:
主配置文件
Apache的配置文件是包含若干指令的纯文本文件,主配置文件名称通常为httpd.conf,可以用Include指令和通配符附加许多其他配置文件。任何配置文件都可以使用任何指令。只有在启动或重新启动Apache后,主配置文件的更改才会生效。服务器还会读取一个包含MIME文件类型的文件,其文件名由TypesConfig指令确定,默认值是/etc/mime.types(mod_mime)
配置文件的语法
Apache配置文件的每一行包含一个指令,在行尾使用反斜杠"\"可以表示续行,但是反斜杠与下一行之间不能有任何其他字符(包括空白字符)。
配置文件中的指令是不区分大小写的,但是指令的参数(argument)通常是大小写敏感的。以"#"开头的行被视为注解并被忽略。空白行和指令前的空白字符将被忽略,因此可以采用缩进以保持配置层次的清晰。
可以用 apachectl configtest 或者命令行httpd -t 、apachectl -t 检查配置文件中的错误,而无须启动Apache服务器。
模块
Apache是模块化的服务器,这意味着核心中只包含实现最基本功能的模块。扩展功能可以作为模块动态加载。默认情况下,只有base组的模块被编译进了服务器。如果服务器在编译时包含了DSO模块,那么各模块可以独立编译,并可随时用LoadModule指令加载;否则,要增加或删除模块必须重新编译整个Apache。用于特定模块的指令可以用<IfModule>指令包含起来,使之有条件地生效。
指令的作用域
主配置文件中的指令对整个服务器都有效。如果你只想改变某一部分的配置,你可以把指令嵌入到<Directory>、<DirectoryMatch>、<Files>、<FilesMatch>、<Location>、<LocationMatch>配置段中,这样就可以限制指令的作用域为文件系统中的某些位置或特定的URL。这些配置段还可以进行嵌套,以进行更精细的配置。
# grep "Section" httpd.conf
### Section 1: Global Environment # 全局环境参数
### Section 2: ‘Main‘ server configuration # “主”服务器配置
### Section 3: Virtual Hosts # 虚拟主机
主服务器和虚拟主机一般不同时使用;默认仅启用了主服务器;
指令参数:指令不区分字符大小写,但指令的参数(argument)通常是大小写敏感的。
1、持久连接
KeepAlive {On|Off} # 启用|关闭HTTP持久链接
MaxKeepAliveRequests 100 # 一个持久链接中允许的最大请求数量
KeepAliveTimeout 15 # 持久链接中服务器在两次请求之间等待的秒数
2、MPM参数:
<IfModule prefork.c>
StartServers 8 # 服务器启动时建立的子进程数量
MinSpareServers 5 # 空闲子进程的最小数量
MaxSpareServers 20 # 空闲子进程的最大数量
ServerLimit 256 # 服务器允许配置的进程数上限
MaxClients 256 # 请求的最大子进程数量
MaxRequestsPerChild 4000 # 一个服务进程允许的最大请求数
</IfModule>
<IfModule worker.c>
StartServers 4 # 服务器启动时的服务进程数目
MaxClients 300 # 允许同时连接的最大用户数目
MinSpareThreads 25 # 保有的最小工作线程数目
MaxSpareThreads 75 # 保有的最大工作线程数目
ThreadsPerChild 25 # 每个服务进程中的工作线程数
MaxRequestsPerChild 0 # 服务进程中允许的最大请求数目
</IfModule>
3、监听指定的地址和端口
Listen [IP:]PORT
Listen指令告诉服务器接只受来自特定端口(或地址+端口的组合)的请求。
如果Listen指令仅指定了端口,则服务器会监听所有的IP地址;
如果指定了地址+端口的组合,则服务器只监听来自此特定地址上特定端口的请求。
可以使用多个Listen指令,可以指定在多个地址和端口上进行监听。
要实现虚拟主机VirtualHost,首先必须告诉服务器需要监听哪些地址和端口;
如果将<VirtualHost>段设置为服务器没有监听的地址和端口,则相应的虚拟机不生效。
4、DSO机制装载的模块
显示:# httpd -D DUMP_MODULES
等价于:httpd -M
LoadModule Module_Name /path/to/Module_File
5、指定站点根目录
DocumentRoot directory-path
指定DocumentRoot时不应包括最后的"/"。目录通常为绝对路径。
如果服务器有多个虚拟主机,使用每个虚拟主机自己的DocumentRoot来组成文件系统路径
6、站点路径访问控制
基于本地文件系统路径:
<Directory "/path/to/somewhere">
</Directory>
基于URL访问路径做访问控制
<Location "/path/to/URL">
</Location>
7、于Directory中可用的访问控制
(1) Options
Options指令控制了在特定目录中将使用哪些服务器特性。
All # 除MultiViews之外的所有特性。这是默认设置。
Indexes # 如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回由mod_autoindex生成的一个格式化后的目录列表(将所有资源以列表形式呈现给用户);危险,慎用;
FollowSymLinks # 服务器允许在此目录中使用符号连接。(跟踪符号链接)
ExecCGI # 允许使用mod_cgi执行CGI脚本。
注意:即使服务器会使用符号连接,但它不会改变用于匹配<Directory>段的路径名。如果此配置位于<Location>配置段中,则此设置会被忽略。
Includes # 允许使用mod_include提供的服务器端包含。
SymLinksIfOwnerMatch 服务器仅在符号连接与其目的目录或文件的拥有者具有相同的uid时才使用它。
(2) AllowOverride
支持在每个页面目录下创建.htaccess用于实现对此目录中资源访问时的访问控制功能。但不可以出现在Location控制域中
8、基于IP做访问控制
Order allow,deny
Deny from 172.16.100.17
Allow from 172.16.0.0/16
from后面能接受的地址格式:
IP, Network Address
网络地址格式较为灵活:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
9、定义默认的主页面 DirectoryIndex
当客户端请求一个目录时寻找的资源列表,可以指定多个URL,服务器将返回最先找到的那一个。若一个也没有找到,并且那个目录设置了Indexes选项,服务器将会自动产生一个那个目录中的资源列表。指定的文档不一定必须位于被请求的目录下,也可以指定一个绝对URL来指向其他位置
例: DirectoryIndex index.html index.php /cgi-bin/index.sh
10、配置日志功能
ErrorLog "/path/to/error_log"
LogLevel {debug|info|notice|warn|error|crit|alert|emerg}
LogFormat
CustomLog "/path/to/access_log" LogFormat_Name
%h: 客户端地址
%l: 远程登录名,通常为-
%u: 认证时输入用户名,没有认证时为-
%t: 服务器收到 用户请求时的时间
%r:请求报名的起始行
%>s: 响应状态码
%b: 响应报文的长度,单位是字节
%{HEADER_NAME}i: 记录指定首部对应的值
11、路径别名(访问DocumentRoot以外的文件)
可以在文件系统的DocumentRoot目录下放置符号连接以访问其外部文件,
考虑到安全问题,这种方法仅在相应目录的Options指令中设置了FollowSymLinks或SymLinksIfOwnerMatch时才有效。
使用Alias指令可以将文件系统的任何部分映射到网络空间中
AliasMatch ,使用正则表达式映射URL到文件系统,这个指令与Alias等效
AliasMatch ^/icons(.*) /usr/local/apache/icons$1
实现URL路径的映射,从而所访问的资源不再依赖于站点根目录;
Alias /URL/ "/path/to/somewhere/"
12、设定默认字符集
AddDefaultCharset UTF-8
字符集:GB2312, GB18030, GBK UTF
13、CGI脚本
CGI脚本路径别名
/var/www/cgi-bin/
http://server/cgi-bin/
bash写CGI脚本:
所有文本都使用命令输出:echo, printf, cat
执行程序:命令引用
Content-Type: text/html
<pre>
FastCGI: 协议
14、基于用户访问控制
用户认证:
基本认证: Basic
摘要认证:digest
虚拟用户:仅用于访问某服务或获取某资源的凭证;
文本文件:.htpasswd
SQL数据库
dbm: 数据库引擎,提供API
ldap:
authentication provider: 账号和密码的存储机制;
authn
authorization provider: 授权
案例:基于文件做访问控制
(1) 基于用户进行认证
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "Admin Area."
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
Require valid-user: 文件中所有用户均可访问
Require user USERNAME, ...
(2) 提供认证文件
htpasswd
-c: 如果此文件事先不存在,则创建;注意,只能在创建第一个用户时使用;
-m:以md5的格式编码存储用户的密码信息
-D:删除指定用户
(3) 组认证
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "Admin Area."
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GROUP_NAME
</Directory>
组文件:
组名:user1 user2 user3
15、虚拟主机
虚拟主机:使用单个Apache实例提供多个网站。使用不同访问路径.
是指在一个机器上运行多个网站(比如:www.a.com和www.b.com)。
如果每个网站拥有不同的IP地址,则虚拟主机可以是"基于IP"的;
如果只有一个IP地址,也可以是"基于主机名"的,其实现对最终用户是透明的。
(1) 使用虚拟的前提:取消主服务器
注释主服务器的站点根路径指定:DocumentRoot
NameVirtualHost addr[:port];
为一个基于域名的虚拟主机指定一个IP地址(和端口)。
注意:<VirtualHost>
指令的参数必须与NameVirtualHost
指令的参数完全匹配。
(2) 定义虚拟主机
NameVirtualHost IP:PORT
<VirtualHost IP:PORT>
ServerName # 指令来指定伺服哪个主机
DocumentRoot # 来说明这个主机的内容位于文件系统的什么地方
ServerAlias
ErrorLog
CustomLog
</VirtualHost>
配置文件语法检查:
httpd -t
service httpd configtest
文本浏览器测试:elinks
-dump: 获取到页面数据后直接退出进程;
16、https协议
ssl(安全的套接字层), tls(传输层安全)
http协议:文本编码
验正:使用telnet发请求
验正:使用telnet发请求
1 验正:使用telnet发请求 2 3 # telnet 172.16.100.7 80 4 Trying 172.16.100.7... 5 Connected to 172.16.100.7. 6 Escape character is ‘^]‘. 7 GET /index.html HTTP/1.0 8 Host: www.b.org 9 10 HTTP/1.1 200 OK 11 Date: Fri, 08 Aug 2014 03:03:51 GMT 12 Server: Apache/2.2.15 (CentOS) 13 Last-Modified: Fri, 08 Aug 2014 02:14:52 GMT 14 ETag: "e0009-12-50014c53e753f" 15 Accept-Ranges: bytes 16 Content-Length: 18 17 Connection: close 18 Content-Type: text/html; charset=UTF-8 19 20 <h1> Host B </h1> 21 Connection closed by foreign host.
httpd: ssl
ssl模块
单独成包
ssl会话基于IP地址创建,所以,每一个IP仅创建一个SSL会话;
ssl握手要完成的工作:
交换协议版本号
选择双方都支持的加密方式
客户端对服务器端实现身份验正
密钥交换
https协议: 基于SSL二进制编码, 443/tcp
openssl s_client
客户端验正服务器端证书:
有效性检测:证书是否仍然在有效期内
CA的可信度检测:
证书的完整性检测:
持有者的身份检测
配置httpd工作于https:
(1) 安装mod_ssl模块
# yum install mod_ssl
(2) 为服务端生成私钥,并为其提供证书;
详细参考之前的OpenSSL搭建私有OA流程。
# mkdir /etc/httpd/ssl && cd /etc/httpd/ssl
# (umask 077; openssl genrsa -out httpd.key 1024)
# openssl req -new -key httpd.key -out httpd.csr
签署后的证书为:/etc/httpd/ssl/httpd.crt
(3) 配置使用https的虚拟主机;
SSLCertificateFile
SSLCertificateKeyFile
<VirtualHost IP:443>
DocumentRoot
ServerName
</VirtualHost>
(4) 重新装载配置
(5) 测试
# openssl s_client -connect IP:PORT -CAfile /path/to/ca_certificate
17、status页面
httpd内嵌有handler,其中有一个handler用于输出当前httpd服务相关状态信息
handler: server-status
启用handler要使用SetHandler指令
handler: 当文件被调用时,apache内部表示形式;一般每种文件类型都有其隐式处理器
18、访问属性配置总结
配置文件系统访问路径:
<Directory [~] "">
</Directory>
<File [~] "">
</File>
配置URL访问路径:
<Location [~] ""> #模式匹配
</Location>
<LocationMatch ""> #正则表达式匹配
</LocationMatch>
19、curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
curl的常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义头信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
20、使用mod_deflate模块压缩页面优化传输速度
SetOutputFilter DEFLATE
1 # mod_deflate configuration 2 3 4 # Restrict compression to these MIME types 5 AddOutputFilterByType DEFLATE text/plain 6 AddOutputFilterByType DEFLATE text/html 7 AddOutputFilterByType DEFLATE application/xhtml+xml 8 AddOutputFilterByType DEFLATE text/xml 9 AddOutputFilterByType DEFLATE application/xml 10 AddOutputFilterByType DEFLATE application/x-javascript 11 AddOutputFilterByType DEFLATE text/javascript 12 AddOutputFilterByType DEFLATE text/css 13 14 # Level of compression (Highest 9 - Lowest 1) 15 DeflateCompressionLevel 9 16 17 # Netscape 4.x has some problems. 18 BrowserMatch ^Mozilla/4 gzip-only-text/html 19 20 # Netscape 4.06-4.08 have some more problems 21 BrowserMatch ^Mozilla/4\.0[678] no-gzip 22 23 # MSIE masquerades as Netscape, but it is fine 24 BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
示例:
实现对server-status的用户访问控制
1 <Location /server-status> 2 SetHandler server-status 3 Order deny,allow 4 Allow from 172.16.19.0/16 5 </Location> 6 7 <Location /server-status> 8 # Options none 9 # AllowOverRide AuthConfig #此选项不可以出现在Location里面 10 AuthType Basic 11 AuthName "Admin Area." 12 # AuthBasicProvider file # 此选项可有可无 13 AuthUserFile /etc/httpd/conf/.htpasswd 14 Require user www1 15 </Location>
分别实现基于IP、域名、端口的虚拟主机
1 # DocumentRoot "/var/www/html" 2 Listen *:80 3 Listen 172.16.19.2:8080 4 5 NameVirtualHost 172.16.19.2 6 7 <VirtualHost 172.16.19.2:80> 8 ServerName www1.stu19.com 9 DocumentRoot /web/vhosts/www1 10 ErrorLog /var/log/httpd/www1.err 11 CustomLog /var/log/httpd/www1.access combined 12 </VirtualHost> 13 14 <VirtualHost 172.16.19.2:8080> 15 ServerName www2.stu19.com 16 DocumentRoot /web/vhosts/www2 17 ErrorLog /var/log/httpd/www2.err 18 CustomLog /var/log/httpd/www2.access combined 19 </VirtualHost> 20 21 <VirtualHost 172.16.19.3:80> 22 ServerName www.c.com 23 DocumentRoot /web/vhosts/www3 24 ErrorLog /var/log/httpd/www3.err 25 CustomLog /var/log/httpd/www3.access combined 26 </VirtualHost>
httpd.conf配置文件总结