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

(2)
以马内利以马内利
上一篇 2015-05-13
下一篇 2015-05-13

相关推荐

  • 马哥教育网络班26期+第一周学习宣言

    30岁前,目标年薪50w!gogogo

    Linux干货 2016-12-27
  • Elasticsearch 5.0 集群

    IT运维 www.chinasa.net 下载地址:https://www.elastic.co/downloads/elasticsearch 1、JDK 安装略过 node1 部署 2、Elasticsearch安装 #tar zxvf elasticsearch-5.0.0.tar.gz -C /opt/ #cd /opt #mv elast…

    系统运维 2016-12-27
  • 马哥教育网络班22期+第12周课程练习

    1、请描述一次完整的http请求处理过程; 1. 建立或处理连接:接收请求或拒绝请求; 2. 接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程; 3. 处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息; 4. 访问资源:获取请求报文中请求的资源; 5. 构建响应报文…

    Linux干货 2016-11-28
  • 马哥教育网络班21期+第11周课程练习

    1、请描述一次完整的加密通讯过程,结合图示最佳。 Bob先利用单向加密算法提取当前数据的指纹(特征码),再用自己的私钥加密数据指纹并附加于数据尾部,然后利用对称加密将整个文件加密,之后用对方的公钥加密对称加密密钥附加于尾部。 Alice收到数据后,先用自己的私钥解密,得到对称加密密钥,之后用对称加密密钥解密,然后用Bob的公钥解密得到数据指纹,并且验证了Bo…

    Linux干货 2016-09-26
  • 第一周博客作业

    1、描述计算机的组成及其功能。
    2、按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。
    3、描述Linux的哲学思想,并按照自己的理解对其进行解释性描述。
    4、说明Linux系统上命令的使用格式;详细介绍ifconfig、echo、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相应的示例来阐述。
    5、如何在Linux系统上获取命令的帮助信息,请详细列出,并描述man文档的章节是如何划分的。
    6、请罗列Linux发行版的基础目录名称命名法则及功用规定

    Linux干货 2018-03-13
  • RHCE系列之磁盘加密—-LUKS加密

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1436460        LUKS (Linux Unified Key Setup)为 Linux 硬盘…

    Linux干货 2016-08-15

评论列表(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哦哦 对哦,我给写反了好像。当时没仔细看,多谢指出 !