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 18:39
下一篇 2015-05-13 18:42

相关推荐

  • linux磁盘管理及文件系统介绍

        硬盘是计算机必备组成部分,现在的硬盘分固态硬盘和传统机械硬盘,这里要介绍的是传统机械硬盘。     一.硬盘最基本结构         1.硬盘是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。…

    Linux干货 2016-06-22
  • 马哥教育网络班22期+第8周课程练习

    week8: 1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥也叫桥接器,是连接两个局域网的一种存储/转发设备,它能将一个大的LAN分割为多个网段, 或将两个以上的LAN互联为一个逻辑LAN,使LAN上的所有用户都可访问服务器。 它工作于OSI(开放系统互联参考模型)参考模型第二层,即“数据链路层”。 集线器的英文称为“H…

    Linux干货 2016-10-09
  • 第三周博客作业

    who useradd usermod groupadd

    Linux干货 2017-12-17
  • Windows 10 11 missing DLL files resampleDmo dll Spotify Not working Resolved.

    Step 5 – Once you have downloaded the setup, install it properly. If the SFC Scanner didn’t work for your problem, DISM will surely work for you. But even this DISM tool fail…

    Linux干货 2022-12-15
  • Linux如何快速查找需要执行的命令

    大家知道,对于熟悉命令行的用户来说,命令行操作比图形界面操作高效、简洁,那么Linux是如何快速找到命令的位置呢?今天刚学了这一部分,与大家分享。         Linux将命令分为内部命令和外部命令,这是由于一些命令是常用的,需要常驻内存以减少检索时间,所以集成在shell之…

    2017-07-15
  • rpm软件管理工具详解

    1 Linux软件安装概述 安装程序的方式: 软件包概述 RPM RPM的缺点 RPM包 RPM分包 RPM命令的使用 rpm 包管理 升级注意项 如何安装rpm软件包 如何卸载rpm软件包 如何升级rpm软件包 如何查询rpm软件包 如何查看与rpm包相关的文件和其他信息 如何校验rpm包 RPM的数据库 1 Linux软件安装概述 安装程序的方式: 通用…

    Linux干货 2016-09-06

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