文档章节

Apache-httpd

HarryWu
 HarryWu
发布于 2015/10/30 11:09
字数 3113
阅读 55
收藏 0

一、HTTPD特性

httpd:特性

    1.事先创建进程:在请求来之前,创建进程监听,加快响应速度

    2.按需维持适当的进程

    3.模块设计,核心比较小,各个功能都可以按照模块添加

    4.支持多种方式的虚拟主机配置:

        Socket IP:Port

        1.基于IP的虚拟主机(如果一个server有多个ip,而在互联网上,每个IP每年都需要一定的费用)

        2.基于端口的虚拟主机(如果不是标准的80端口,那么别人无法知道到底使用的是啥端口)

        3.基于域名的虚拟主机(比较好的选择)

    protocol://host:port/path/to/source

=================

    Method URL version

    header

    body

=================

    GET /download/linux.tar.bz2 HTTP/1.0

    Host: www.harry.com

    4.支持https协议(mod_ssl)

    5.支持用户认证

    6.支持基于IP或主机名的ACL

    7.支持每目录的访问控制

    8.支持URL重写

二、HTTPD安装

1.rpm包

    httpd:

        /usr/sbin/httpd(MPM: prefork)

            httpd: root,root                (master process)

            httpd: apache,apache        (worker process)

        /etc/rc.d/init.d/httpd (启动脚本)

            port:    (http: 80/tcp)    (https: 443/tcp)

        /ec/httpd:工作根目录,相当于程序安装目录

        /etc/httpd/conf:配置文件目录

            httpd.conf    主配置文件(以段文件分散到conf.d目录下,以include引入)

            conf.d/*.conf    

        /etc/httpd/modules:模块路径(都是连接)

        /etc/httpd/logs:    ->    /var/log/httpd:日志目录

            日志文件有两类:访问日志access_log    错误日志err_log

        /var/www: 资源文件目录

            html   :静态文件路径

            cgi-bin:动态文件路径

                cgi: Common Gateway Interface httpd通过cgi和各个模块进行通信

                        client --> httpd(index.cgi) --> spawn process(index.cgi) --> httpd --> client

                        perl, python, java(servlet,jsp), php

                cgi工作原理:

                    1.一个动态请求到Web Server,Web Server判断cgi类型,创建对应的cgi进程来处理动态请求,并返回html给Web Server,Web Server响应client。动态cgi进程销毁

                    2.fast-cgi:cgi进程池,由master-workers模式

                            一个动态请求Web Server,Web Server和master进程通信由master分配给worker进程,来处理

                        这样Web Server与cgi可以部署在不同Server上

                    

                    动静分离:

                    ----->|    -------              |                             |    ------------    |

                             |    Apache            |                             |     应用服务器    |

                             |     如果是静态的,                                | 

                                    则直接返回                     

                                                                                        |

                                    如果是动态的,

                                    则请求应用服务器            ------>        |                    |

                             |   --------               |

        httpd是不处理动态文件的,而是通过调用模块,处理,并返回静态文件

2.源码编译

三、Global配置

[root@hfdb0001 conf]# pwd
/etc/httpd/conf

[root@hfdb0001 conf]# grep "Section*" httpd.conf             => 可以看出配置主要有三段。
### Section 1: Global Environment                 => 全局配置项
### Section 2: 'Main' server configuration        => 主Server配置
### Section 3: Virtual Hosts                      => 虚拟主机配置(与主Server配置不能同时生效)

ServerTokens OS

    http://httpd.apache.org/docs/2.2/zh-cn/mod/core.html#servertokens

    ServerTokens Major|Minor|Min[imal]|Prod|[uctOnly]|OS|Full


#超时时间 TCP相关的,如TCP第一次握手后,就不在请求了。

Timeout 120


KeepAlive Off #如果服务器的访问不大,则需要打开长连接

MaxKeepAliveRequests 100

KeepAliveTimeout 15

#是否使用长连接(tcp连接每次都需要3次握手,而长连接,则第一次三次握手后,一直保持连接状态),如果是KeepAlive On,则需要定义MaxKeepAliveRequests 100(即该连接打开后,最多能请求的资源数,不能无尽的请求)。这样一个用户请求都会最多能请求100个。 KeepAliveTimeout 15.当用户拥有一个长连接,但是并不请求,15s后,即自我销毁了。

#对于繁忙的Server可以降低KeepAliveTimeout的值,可以提高并发

#eg 当第一个请求到来,获取一个长连接,他最多能请求100个,到了后,就会断开连接,重新排队。这样下一个请求就能回的连接,请求资源,不然,第一个请求永远拥有连接,除非自我断开。


MPM:Multi-Processing Modules(可以切换,通过配置文件修改)

    当并发请求时,Server是如何工作的

    1.mpm_winnt

    2.prefork (一个请求用一个进程响应)=>预先会生成多个进程,每个进程响应一个请求

    3.worker (一个请求用一个线程响应)=>生成多个进程,进程不处理,每个进程生成多个线程,每个线程来处理请求

        多线程共享。当同一个进程下的线程已经打开了文件,其他线程和读取,但是存在竞争。需要枷锁。

    4.event (一个进程处理多个请求)

[root@hfdb0001 conf]# httpd -l            => 查看所有的模块,可以看到当前只支持prefork模型
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c
  
 [root@hfdb0001 conf]# rpm -ql httpd | grep bin
/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd                       => 是默认的,prefork
/usr/sbin/httpd.event
/usr/sbin/httpd.worker                => 可以看出Server是支持worker,event的。
/usr/sbin/httxt2dbm
/usr/sbin/rotatelogs
/usr/sbin/suexec

[root@hfdb0001 conf]# httpd.worker -l
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c
  
 我们可以修改配置文件,使得http.worker是默认的
 [root@hfdb0001 conf]# cat /etc/sysconfig/httpd 
# Configuration file for the httpd service.

#
# The default processing model (MPM) is the process-based
# 'prefork' model.  A thread-based model, 'worker', is also
# available, but does not work with some modules (such as PHP).
# The service must be stopped before changing this variable.
#
#HTTPD=/usr/sbin/httpd.worker

....

   prefork:

<IfModule prefork.c>
StartServers       8                => service启动后,会创建8个进程
MinSpareServers    5                => 最小空闲进程(当有4个请求后,会重新创建一个,保持最少5个)
MaxSpareServers   20                => 最大空闲进程(当100个进程空闲后,会被kill,至20个,即最多20个)
ServerLimit      256                =>
MaxClients       256                => 最多可以处理256个请求,多余的请求排队 MaxClients < ServerLimit
MaxRequestsPerChild  4000           => 一个进程最多能响应多少次请求(当一个进程响应请求后,空闲了,还没有被kill,此时又有请求过来,并响应,那么该进程响应次数就加1,当达到4000后,无论如何都会被kill,再可能会生成新进程来响应)
</IfModule>    

[root@hfdb0001 conf]# ps aux|grep httpd                => 可以看到初始是8个httpd
root     13180  0.0  0.0 175724  3712 ?        Ss   03:52   0:00 /usr/sbin/httpd  =>主进程,不处理请求
apache   13182  0.0  0.0 175860  3032 ?        S    03:52   0:00 /usr/sbin/httpd
apache   13183  0.0  0.0 175860  3036 ?        S    03:52   0:00 /usr/sbin/httpd
apache   13184  0.0  0.0 175724  2940 ?        S    03:52   0:00 /usr/sbin/httpd
apache   13185  0.0  0.0 175724  2940 ?        S    03:52   0:00 /usr/sbin/httpd
apache   13186  0.0  0.0 175860  2960 ?        S    03:52   0:00 /usr/sbin/httpd
apache   13187  0.0  0.0 175860  2964 ?        S    03:52   0:00 /usr/sbin/httpd
apache   13188  0.0  0.0 175724  2516 ?        S    03:52   0:00 /usr/sbin/httpd
apache   13189  0.0  0.0 175724  2516 ?        S    03:52   0:00 /usr/sbin/httpd

    worker:

<IfModule worker.c>
StartServers         4        => 初始生成进程数,到不够是,会创建新的进程,并生成线程
MaxClients         300            
MinSpareThreads     25        => 最小空闲线程数(是所有的进程数的总和)
MaxSpareThreads     75        => 最大空闲线程数
ThreadsPerChild     25        => 每个进程最多能生成多少个线程
MaxRequestsPerChild  0        => 每个进程最多能响应多少个响应,由于是有线程响应的,则不做控制,即为0
</IfModule>

Listen 80                   => 监听该Server上所有的80 端口

Listen 8080                =>可以监听多个端口

Listten x.x.x.x:8181    => 可以指定IP:端口

Include conf.d/*.conf    =>加载conf.d目录下所有conf文件(以段文件形式)

LoadModule   path/to/...so

User apache                

Group apache                =>所有的httpd进程,只有一个是root:root权限启动的,其他的都是apache:apache权限


四、虚拟主机配置概述

Socket IP:Port

        1.基于IP的虚拟主机(如果一个server有多个ip,而在互联网上,每个IP每年都需要一定的费用)

            IP1:80

            IP2:80

            ....:80

        2.基于端口的虚拟主机(如果不是标准的80端口,那么别人无法知道到底使用的是啥端口,互联网上不好适用)

            IP:80

            IP:8080

        3.基于域名的虚拟主机(比较好的选择)

            IP:80

                    主机名不同(不同的主机名会被解析到同一个IP和端口上)

                        www.harry1.com        =>    都会被解析到IP:80上

                        www.harry2.com        =>    都会被解析到IP:80上

            通过HTTP协议的请求头的host: 来判断到底访问的那台主机

    ServerName:www.harry1.com

    ServerAlias:www.harry11.com     => 当想www.harry1.com 和 www.harry11.com是同一个Server时

    DocuemtRoot    /www/harry1.com/

    <Directoy "/www/harry1.com">    => 本地文件系统的路径

    .....

    .....

    </Directoy>

    当访问 http://www.harry1.com/images => 自然会解析到/www/harry1.com/这个目录下的images

    Alias    => 当想再访问http://www.harry1.com/test/images 也要解析到 之前的images目录,此时需要别名 

    ErrorLog

    CustomLog


    <Location "/images">    => URL路径,可以再访问该路径的时候,作限制

    <Location>

    ScriptAlias


<VirutalHost HOST>

</VirtualHost>


虚拟主机和中心主机是不能使用的,注释中心主机的DocumentRoot即可

五、虚拟主机配置

1.基于IP

    Host:

        ip1:80

        ip2:80

注释httpd.conf的DocuemtRoot配置,即注释中心主机配置
[root@hfdb0001 conf]# pwd
/etc/httpd/conf

在conf.d目录下新建配置文件
[root@hfdb0001 conf.d]# pwd
/etc/httpd/conf.d

[root@hfdb0001 conf.d]# ll
total 12
-rw-r--r-- 1 root root 392 Aug 13  2013 README
-rw------- 1 root root 227 Oct 30 05:39 virtual-ip.conf
-rw-r--r-- 1 root root 299 Aug  2  2013 welcome.conf

[root@hfdb0001 conf.d]# cat virtual-ip.conf         => 前提是要有两个ip
<VirtualHost 10.224.243.1:80>
	ServerName www.harry1.com
	DocumentRoot "/www/harry1.com"
</VirtualHost>

<VirtualHost 10.224.243.2:80>
        ServerName www.harry2.com
        DocumentRoot "/www/harry2.com"
</VirtualHost>

创建根目录 注意目录权限 755
[root@hfdb0001 conf.d]# mkdir -p /www/{harry1.com,harry2.com}

创建index.html

分别访问10.224.243.1:80 和 10.224.243.2:80  => 会被解析到不同的目录下

2.基于端口

    Host:

        ip:80

        ip:8080

    

在conf.d目录下新建配置文件
[root@hfdb0001 conf.d]# pwd
/etc/httpd/conf.d

[root@hfdb0001 conf.d]# ll
total 12
-rw-r--r-- 1 root root 392 Aug 13  2013 README
-rw------- 1 root root 227 Oct 30 05:39 virtual-ip.conf-bak
-rw------- 1 root root 227 Oct 30 05:39 virtual-port.conf
-rw-r--r-- 1 root root 299 Aug  2  2013 welcome.conf

[root@hfdb0001 conf.d]# cat virtual-port.conf 
<VirtualHost 10.224.243.1:80>
	ServerName www.harry1.com
	DocumentRoot "/www/harry1.com"
</VirtualHost>

<VirtualHost 10.224.243.1:8080>
        ServerName www.harry2.com
        DocumentRoot "/www/harry2.com"
</VirtualHost>

修改主配置,listen 8080

分别访问10.224.243.1:80 和 10.224.243.1:8080 也会被解析到不同的目录下

3.基于域名

    serverName不同即可

在conf.d目录下新建配置文件
[root@hfdb0001 conf.d]# pwd
/etc/httpd/conf.d

[root@hfdb0001 conf.d]# ll
total 12
-rw-r--r-- 1 root root 392 Aug 13  2013 README
-rw------- 1 root root 227 Oct 30 05:39 virtual-ip.conf-bak
-rw------- 1 root root 227 Oct 30 05:39 virtual-port.conf-bak
-rw-r--r-- 1 root root 299 Aug  2  2013 welcome.conf

[root@hfdb0001 conf.d]# cat virtual-domain.conf ===> domain需要被解析到该主机上,可以修改hosts可以DNS
NameVirutalHost 10.224.243.1:80

<VirtualHost 10.224.243.1:80>
	ServerName www.harry1.com
	DocumentRoot "/www/harry1.com"
</VirtualHost>

<VirtualHost 10.224.243.1:80>
        ServerName www.harry2.com
        DocumentRoot "/www/harry2.com"
</VirtualHost>


分别访问www.harry1.com 和 www.harry2.com 也会被解析到不同的目录下

注意:如果此时访问的是10.224.243.1:80 ==> 那么会被解析到第一个

每个虚拟主机可以定义自己的CustomLog,format,error等等

六、其他配置

1.目录权限控制

针对某个IP不能访问www.harry1.com

[root@hfdb0001 conf.d]# cat virtual-domain.conf ===> domain需要被解析到该主机上,可以修改hosts可以DNS
NameVirutalHost 10.224.243.1:80

<VirtualHost 10.224.243.1:80>
	ServerName www.harry1.com
	DocumentRoot "/www/harry1.com"
	<Directory "/var/www/harry1.com">
		Options none
		AllowOverride none
		Order deny,allow                  => 注意指定了Order为deny allow,那么就只排除 
		Deny from {ip}
	</Directory>
</VirtualHost>

<VirtualHost 10.224.243.1:80>
        ServerName www.harry2.com
        DocumentRoot "/www/harry2.com"
</VirtualHost>

2. 身份验证 转http://www.cnblogs.com/loveCloud/archive/2012/01/12/2320636.html

一、编辑虚拟目录配置文件,设置认证方式
<VirtualHost 10.224.243.1:80>
	ServerName www.harry1.com
	DocumentRoot "/www/harry1.com"
	<Directory "/var/www/harry1.com">
		Options none
		AllowOverride AuthConfig       => 表明需要进行身份验证(会再虚拟目录下,查找.htaccess文件)
		Order deny,allow                
		Deny from {ip}
	</Directory>
</VirtualHost>

注意:也可以把以下第二步的内容嵌入到Directory节点下。

二、创建.htaccess文件,并配置
vim /var/www/harry1.com/.htaccess
AuthName "test"                              => 仅仅是描述,但最好设置成虚拟目录的名字,(会在弹出层有体现)
AuthType Basic                               => 验证类型
AuthUserFile /var/www/harry1.com/.htpasswd   => 密码文件路径
Require valid-user                           => 表示验证成功的用户都可以访问

注意:Apache默认系统对.ht开头的文件默认是不允许外部访问的。安全性较高。
注意:Require valid-user表示只要htpasswd文件验证都给的任何一个均可以登陆
也可以仅仅允许htpasswd文件内的个别用户 Require user username1 username2
也可以仅仅允许htpasswd文件内的个别用户组 Require group group1 group2

注意文件权限:
-rw-r--r--    .htaccess
-rwxr--r--    .htpasswd
三、创建.htpasswd文件,并配置

htpasswd -c /var/www/harry1.com/.htpasswd {username}  第一次创建用户用-c ,第二次则不用 ,会提示你输入密码的。密码是加密的

htpasswd -m /var/www/harry1.com/.htpasswd {username}   修改密码

四、通过用户组访问

3.Location配置 相对于Directory是配置本地文件系统路径的,而Location是针对URL路径的

<Location /server-status>
    SetHandler server-status        => 该Handler能查看当前系统的状态,如启用了多少进程,即各个进程状态
    Order Deny,Allow
    Deny from all
    Allow from {ip}
</Location>



© 著作权归作者所有

HarryWu
粉丝 7
博文 153
码字总数 60358
作品 0
马鞍山
私信 提问
RHEL5.1+SELINUX--LAMP=APACHE+PHP+MYSQL+PHPMYADMIN

引用:Install LAMP 编译环境:RedHat Enterprise AS 5.1 开启SELlinux(我个人认为,它既然被REDHAT用上了,肯定就有它的道理,没有理由关掉它啊,嘿嘿) 安装所需要的软件均为最新的源代码包...

范堡
2009/05/06
1K
0
Windows下手动添加Apache服务

今天电脑重装了下系统,发现原来的apache服务没有了,又不想再重新安装apache了,那就手动设置吧!! 第一、在开始->命令里面输入:cmd 按回车打开我们熟悉的DOS黑窗口; 第二、用cd命令切换...

Adairs
2016/04/10
293
0
saltstack数据系统及其相关应用

grains grains是静态的,只有minion启动才加载 [root@salt-master ~]# salt '' grains.items [root@salt-master ~]# salt '' grains.get hwaddr_interfaces salt-minion: ---------- eth1: 00......

eddy_linux
2016/07/06
48
0
Apache 2.4.20 编译安装

1.安装版本 Apache版本:2.4.20 2.安装编译环境 [root@Kry123 ~]# yum -y install gcc gcc-c++ pcre pcre-devel 源码安装apr和apr-util,第6步中有安装方法。 3.下载Apache [root@Kry123 ~]#...

Kry1702
2018/06/28
0
0
源码安装apache后将其设置为开机启动

从网上下载apache的源码包,例如/usr/local/src/httpd-2.2.34.tar.gz,解压到目录/usr/local/src/httpd-2.2.34,编译并安装,假如安装到/usr/local/apache目录中,将其设置为开机启动,并且可以...

jetyi
2017/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深入理解JVM - 类加载机制

类加载过程 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(...

xiaolyuh
11分钟前
57
0
脸盲症的小伙伴 测试下你的脸盲症程度

笔者在背单词的时候突然想到了一个问题,就是背单词的时候,相近的词容易混淆,例如:coast和roast,在我背诵的时候,我就很烦恼,不光是英文单词,还有汉字,例如“籍”和“藉“,我还是个中...

蛤蟆丸子
12分钟前
50
0
「网易官方」极客战记(codecombat)攻略-地牢-囚犯the-prisoner

解放囚犯,你会得到盟友。 简介 敬请期待! 默认代码 # 释放囚犯,击败守卫并夺取宝石。 # 从"Weak Door"后解救Patrick。 # 击败名为"Two"的守卫。 # 获得宝石。 概览 您可以按照名称 "Weak ...

极客战记
13分钟前
12
0
Final cut pro 10.4.4中文版本

1.双击打开dmg,点击红框图示 2.出现这个界面后直接回车 3直接将fcp拖拽到application文件夹 然后就可以直接打开了! 百度网盘地址:链接: https://pan.baidu.com/s/1Db9hXmzPV4EdR7_LxEqctA...

kylin_ink
15分钟前
32
0
jquery.validate

规则名称 类型 描述 required Boolean 设置该项内容为必填 remote Json|String 请求远程资源来校验内容有效性 minlength Number 设置内容的最少字符长度 maxlength Number 设置内容的最多字符...

愚蠢的土豆
15分钟前
129
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部