httpd服务归纳:httpd基本配置(配置文件格式以及常用选项)

一、 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, 的到如下结果,说明测试成功

QQ图片20150508220910.png

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
    stanley 2015-05-13 18:41

    马内利出品,必属精品

    • 以马内利
      以马内利 2015-05-14 09:03

      @stanley囧。。。。。。

  • YUANWOW
    YUANWOW 2015-08-30 14:21

    prefork 配置那里
    MaxClients: 并发请求的最大数;一定大于ServerLimit
    不是大于 是 小于
    ServerLimit一定要大于等于MaxClients

    • 以马内利
      以马内利 2015-09-01 10:02

      @YUANWOW哦哦 对哦,我给写反了好像。当时没仔细看,多谢指出 !