一、 httpd文件的基本格式
主配置文件位置, /etc/httpd/conf/httpd.conf
1. 配置文件参数格式
配置参数 值
特点:
配置指令不区分字符大小写
值可能区分大小写
有些指令可以重复出现多次
例如: Listen [IP:] 80
2. 配置文件格式包含三部分
全局配置
主机配置:适用于主机只提供一个站点
虚拟主机:用于提供多个站点
3. 配置文件语法测试:
# service httpd configtest # httpd -t 大多数配置修改后可以直接通过service httpd reload来生效, 如果修改了监听地址或端口,必须重启服务才能生效;
二、 各项配置参数
1. Listen [IP:]port
次指令可以出现多次,用来指定多个不同套接字 Listen 80 只所有ip的80端口 Listen 172.16.100.7:8080
2. 配置使用keep alive
KeepAlive {On|Off} KeepAliveTimeout 2 # 保持连接时长 MaxKeepAliveRequests 50 # 最大请求数
3. MPM模块相关配置
<IfModule prefork.c> StartServers: 默认启动的工作进程数; MinSpareServers: 最少空闲进程数; MaxSpareServers: 最大空闲进程数; ServerLimit: 最大活动进程数;正在被请求的 MaxClients: 并发请求的最大数;一定大于ServerLimit MaxRequestsPerChild: 每个子进程在生命周期内所能够服务的最多请求个数; </IfModule> <IfModule worker.c> StartServers:启动的子进程的个数 MaxClients: 并发请求的最大数; MinSpareThreads:最小空闲线程数; MaxSpareThreads:最大空闲线程数; ThreadsPerChild:每个子进程可生成的线程数; MaxRequestsPerChild:每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定; </IfModule> 注:httpd-2.2.15 不支持event 模块
4. DSO模块加载方式
LoadModule foo_module modules/mod_foo.so ## 如果是使用相对路径,则为相对于ServerRoot所定义的位置而言,如果取消装载,直接在配置文件中把这一行取消 例子:LoadModule auth_digest_module modules/mod_auth_digest.so httpd -M 列出已经装载的所有DSO以及非DSO模块 Loaded Modules: core_module (static) mpm_prefork_module (static) http_module (static) so_module (static) auth_basic_module (shared) httpd -l 列出支持的非DSO模块(比如已经编译进入主程序的) Compiled in modules: core.c # 核心模块 prefork.c # 编译时,有且只有一个模型 http_core.c # http核心模块 mod_so.c # 实现模块装卸
实际上,在sbin下有三个httpd程序,分别为httpd, httpd.worker, http.event, 分别编译进入了prefork, worker, event 模块, 默认使用httpd也就是prefork。如果需要修改可以
把服务脚本配置文件/etc/sysconfig/httpd 中的
#HTTPD=/usr/sbin/httpd.worker
取消注释,或者改成其他位置
5. 配置站点根目录,配置文件中修改
DocumentRoot /path/to/somewhere ## 这里配置新网页文件目录 ,除此之外还需要修改新目录的属性,在以下容器中修改
6. 配置页面访问属性
<Direcotry "/path/to/somewhere"> Options: Indexes: 缺少指定的默认页面时,允许将目录中的所有文件以列表形式返回给用户;危险; FollowSymLinks: 允许跟随符号链接所指向的原始文件;危险 None: 所有都启用; All: 所有都启用; ExecCGI: 允许使用mod_cgi模块执行CGI脚本; Includes: 允许使用mod_include模块实现服务器端包含(SSI); MultiViews:允许使用mod_negotiation实现内容协商; SymLinksIfOwnerMatch:在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件; <Directory>
7. 基于主机的访问控制
<Direcotry "/path/to/somewhere"> Options AllowOverride None ## 下面基于IP的访问机制是否被禁用,None是不禁用 Order Deny,Allow # 后面为默人 Allow from <网段或地址> #允许 Deny from <网段或地址> # 不允许 <Directory> 最佳匹配机制: 二者都匹配时或者二者都不匹配时以后者默认为准,否则以匹配到的为准
8. 定义默认主页面, 从左向右寻找,知道找到位置,默认为index.html
DirectoryIndex index.php index.html home.html default.html
9、用户目录
如果期望让每个用户都可以创建个人站点:http://Server_IP/~Username/
userdir disablied: 禁止 userdir public_html
public_html是用户家目录下的目录名称,所有位于此目录中的文件均可通过前述的访问路径进行访问
用户的家目录得赋予运行httpd进程的用户拥有(进入)执行权限;
10、配置日志功能
/var/log/httpd/ access.log: 访问日志,其需要记录的内容需要自定义 error.log: 错误日志
访问日志: CustomLog "/path/to/access_log_file" Format_Name ## 配置指令,定义日志文件的指令 LogFormat Format_String Format_Name ## 配置指令, 定义日志格式 %h: 客户端地址 %l: 远程登录名,通常为- %u: 认证时的远程用户名,没有认证时为- %t: 收到请求时的时间; %r: 请求报文的起始行; %>s: 响应状态码; %b: 响应报文的长度,单位为字节 %{Header_Name}i: 记录指定请求报文首部的内容(value); 实例: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent
详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
错误日志:
ErrorLog
11. 路径别名
Alias /alias/ "/path/to/somewhere/" ##前面加“/”后面也要加,否则都不加 意味着访问http://Server_IP/alias/时,其页面文件来自于/path/to/somewhere这个位置
12. 设定默认字符集,默认为UTF-8,字符集和网页不匹配,访问时为乱码
AddDefaultCharset UTF-8
13. CGI脚本路径别名
路径别名: URL –> fileSystem URL文件系统某位置的映射
CGI脚本路径别名: URL –> 脚本存放路径
CGI(Common Gateway Interface): 允许网页访问在特定目录下执行一些脚本,shell脚本依赖系统命令,有时需要UID和GID, 这也造成了安全隐患。
PHP,python 等脚本语言也是用类似的协议,但是由于有自己库,可以避免依赖系统库。
控制CGI脚本路径别名的模块: mod_alias, mod_cgi
在/etc/httpd/conf/httpd.conf 配置
ScriptAlias /URL/ "/path/to/somewhere/" 实例 ## 配置文件中配置 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" ## 在/var/www/cgi-bin/ 下面创建测试脚本,如下,并给执行权限 #!/bin/bash # cat << EOF Content-Type: text/html <pre> The hostname is: `hostname`. The time is: `date`. </pire> EOF ## 为了测试方便,关闭虚拟机的iptables,用宿主机访问192.168.233.128/cgi-bin/test.sh, 的到如下结果,说明测试成功
14. 基于用户的访问控制
虚拟用户: 由于安全需要,服务器的访问用户,并不是系统真正的用户。
虚拟用户信息的存放方式:
文件: 例如,/etc/httpd/conf/.htpasswd
SQL数据库, dbm, ldap 等。
认证相关的模块:
认证类型: auth*
1.basic 基本认证, 用户名和密码为明文传输 LoadModule auth_basic_module modules/mod_auth_basic.so 2. 摘要认证,用户名和密码哈希编码后传输 LoadModule auth_digest_module modules/mod_auth_digest.so
认证提供者(authentication provider):账号和密码的存放位置, authn*
LoadModule authn_file_module modules/mod_authn_file.so ## 例如基于文件认证 LoadModule authn_alias_module modules/mod_authn_alias.so LoadModule authn_anon_module modules/mod_authn_anon.so LoadModule authn_dbm_module modules/mod_authn_dbm.so
认证授权机制(authentication): 根据什么进行授权
LoadModule authz_host_module modules/mod_authz_host.so ## 主机 LoadModule authz_user_module modules/mod_authz_user.so ## 用户名 LoadModule authz_owner_module modules/mod_authz_owner.so ## 文件属主 LoadModule authz_groupfile_module modules/mod_authz_groupfile.so ## 用户组
举例:
1) 基于文件,作基本认证,基于用户名密码
## 创建/var/www/html/fin 文件夹,并在里面创建index.html 加入简单内容, 这个文件夹将被保护 ## 在配置文件中添加 <Directory "/var/www/html/fin"> Options None AllowOverride AuthConfig ## 明确指出覆盖前面设置的用户访问控制,使用用户认证进行控制 AuthType Basic ## 认证类型为基本认证 AuthName "Private Area" ## 浏览器弹出的质询框上面的说明 AuthBasicProvider file ## 基于文件认证 AuthUserFile /etc/httpd/conf/.htpasswd ## 认证文件的存放位置 Require valid-user </Directory> ## 使用使用htpasswd命令生成认证库 -c: 创建文件,创建第一个用户时使用 ## 只有第一次创建文件时需要这个选项,以后追加不需要,否则会被覆盖 -m: 密码基于MD5编码存储 ## 使用MD5码进行编码 # htpasswd -c -m /etc/httpd/conf/.htpasswd tom New password: Re-type new password: Adding password for user tom # htpasswd -m /etc/httpd/conf/.htpasswd jerry New password: Re-type new password: Adding password for user jerry
2)基于用户组
<Directory "/var/www/html/fin"> Options None AllowOverride AuthConfig AuthType Basic AuthName "Private Area" AuthBasicProvider file AuthUserFile /etc/httpd/conf/.htpasswd AuthGroupFile /etc/httpd/conf/.htgroup Require group GroupName </Directory> 组文件:组文件格式 组名: 用户1 用户2 用户3
15. 虚拟主机
一个物理服务器提供多个站点; 使用虚拟主机得先取消中心主机 Web: Socket(IP, port) 1) 基于不同的IP实现不同的虚拟主机 变化IP 2) 基于不同的port实现不同的虚拟主机 变化port 3) 基于不同的FQDN实现不同的虚拟主机 : httpd 的请求首部中的host, 来确定访问的那个主机,如果用户用ip地址请求,则自上而下一次匹配 变化ServerName的值 httpd 2.2.2 需要启用 NameVirtualHost *:80, 而且下IP:port需要一致 使用前,要取消掉中心主机,然后开启virualhost 容器 <virtualhost IP:port> ServerName DocumentRoot "" <Directory ""> Options </Directory> ServerAlias ServerAdmin </virtualhost> 关闭中心主机极为,把全局的 DocumentRoot 注释掉
虚拟主机的单独配置:
1)用户认证
2)访问日志
3)错误日志
4)别名
5)脚本别名
实例:
## 注释掉中心主机 DcumentRoot指令 #DocumentRoot "/var/www/html" 1) 基于IP的虚拟主机 <VirtualHost 192.168.233.128:80> DocumentRoot /var/www/a.com ServerName www.a.com </VirtualHost> <VirtualHost 172.25.136.56:80> DocumentRoot /var/www/b.com ServerName www.b.com </VirtualHost> ## 创建/var/www/b.com 和 /var/www/a.com 两个目录,并且创建简单的测试首页,index.html # mkdir /var/www/b.com && echo "hello " > /var/www/index.html # mkdir /var/www/a.com && echo "hello > /var/www/index.html ## reload 配置文件 # service httpd reload ## 使用elinks 测试,注意,要给自己主机设置两个端口,与配置文件容器中的相匹配 # elinks --dump 192.168.233.128 hello! www.a.com # elinks --dump 172.25.136.56 hello www.b.com 2) 基于端口实现虚拟主机 ## 修改配置文件保证,httpd监听在需要的端口上,这里设置为80 和 8080 Listen 80 Listen 8080 ## 同样要注释掉原主机,然后添加虚拟主机容器 <VirtualHost 192.168.233.128:80> DocumentRoot /var/www/a.com ServerName www.a.com </VirtualHost> <VirtualHost 192.168.233.128:8080> DocumentRoot /var/www/b.com ServerName www.b.comon </VirtualHost> ## 由于改变了端口,所以需要重启服务 # service httpd restart ## 同样使用elink 测试 # elinks --dump 192.168.233.128:8080 hello www.b.com # elinks --dump 192.168.233.128:80 hello! www.a.com 3)基于不同主机名,添加虚拟主机 ## 在/etc/hosts 文件同一条IP添加两个解析结果 192.168.233.128 www.a.com 192.168.233.128 www.b.com ## 在2.2.2 版本中要启动 NameVirtualHost 项, 并保证内容和下面容器中的ip和端口写法一致 NameVirtualHost 192.168.233.128:80 ## 修改配置文件, 添加虚拟主机容器 <VirtualHost 192.168.233.128:80> DocumentRoot /var/www/a.com ServerName www.a.com </VirtualHost> <VirtualHost 192.168.233.128:80> DocumentRoot /var/www/b.com ServerName www.b.com </VirtualHost> ## 重新加载配置文件 # service httpd reload ## 测试 # elinks --dump www.a.com hello! www.a.com # elinks --dump www.b.com hello www.b.com
原创文章,作者:以马内利,如若转载,请注明出处:http://www.178linux.com/4052
评论列表(4条)
马内利出品,必属精品
@stanley:囧。。。。。。
prefork 配置那里
MaxClients: 并发请求的最大数;一定大于ServerLimit
不是大于 是 小于
ServerLimit一定要大于等于MaxClients
@YUANWOW:哦哦 对哦,我给写反了好像。当时没仔细看,多谢指出 !