Apache-httpd

2016-07-12 10:25:24来源:oschina作者:wilbur人点击

一、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@hfdb0001conf]#pwd
/etc/httpd/conf
[root@hfdb0001conf]#grep"Section*"httpd.conf=>可以看出配置主要有三段。
###Section1:GlobalEnvironment=>全局配置项
###Section2:'Main'serverconfiguration=>主Server配置
###Section3:VirtualHosts=>虚拟主机配置(与主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@hfdb0001conf]#httpd-l=>查看所有的模块,可以看到当前只支持prefork模型
Compiledinmodules:
core.c
prefork.c
http_core.c
mod_so.c
[root@hfdb0001conf]#rpm-qlhttpd|grepbin
/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@hfdb0001conf]#httpd.worker-l
Compiledinmodules:
core.c
worker.c
http_core.c
mod_so.c
我们可以修改配置文件,使得http.worker是默认的
[root@hfdb0001conf]#cat/etc/sysconfig/httpd
#Configurationfileforthehttpdservice.
#
#Thedefaultprocessingmodel(MPM)istheprocess-based
#'prefork'model.Athread-basedmodel,'worker',isalso
#available,butdoesnotworkwithsomemodules(suchasPHP).
#Theservicemustbestoppedbeforechangingthisvariable.
#
#HTTPD=/usr/sbin/httpd.worker
....

prefork:



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

[root@hfdb0001conf]#psaux|grephttpd=>可以看到初始是8个httpd
root131800.00.01757243712?Ss03:520:00/usr/sbin/httpd=>主进程,不处理请求
apache131820.00.01758603032?S03:520:00/usr/sbin/httpd
apache131830.00.01758603036?S03:520:00/usr/sbin/httpd
apache131840.00.01757242940?S03:520:00/usr/sbin/httpd
apache131850.00.01757242940?S03:520:00/usr/sbin/httpd
apache131860.00.01758602960?S03:520:00/usr/sbin/httpd
apache131870.00.01758602964?S03:520:00/usr/sbin/httpd
apache131880.00.01757242516?S03:520:00/usr/sbin/httpd
apache131890.00.01757242516?S03:520:00/usr/sbin/httpd

worker:



StartServers4=>初始生成进程数,到不够是,会创建新的进程,并生成线程
MaxClients300
MinSpareThreads25=>最小空闲线程数(是所有的进程数的总和)
MaxSpareThreads75=>最大空闲线程数
ThreadsPerChild25=>每个进程最多能生成多少个线程
MaxRequestsPerChild0=>每个进程最多能响应多少个响应,由于是有线程响应的,则不做控制,即为0

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


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


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


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


LoadModulepath/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/


=> 本地文件系统的路径


.....


.....



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


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


ErrorLog


CustomLog

=> URL路径,可以再访问该路径的时候,作限制



ScriptAlias


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


五、虚拟主机配置


1.基于IP


Host:


ip1:80


ip2:80


注释httpd.conf的DocuemtRoot配置,即注释中心主机配置
[root@hfdb0001conf]#pwd
/etc/httpd/conf
在conf.d目录下新建配置文件
[root@hfdb0001conf.d]#pwd
/etc/httpd/conf.d
[root@hfdb0001conf.d]#ll
total12
-rw-r--r--1rootroot392Aug132013README
-rw-------1rootroot227Oct3005:39virtual-ip.conf
-rw-r--r--1rootroot299Aug22013welcome.conf
[root@hfdb0001conf.d]#catvirtual-ip.conf=>前提是要有两个ip

ServerNamewww.harry1.com
DocumentRoot"/www/harry1.com"


ServerNamewww.harry2.com
DocumentRoot"/www/harry2.com"

创建根目录注意目录权限755
[root@hfdb0001conf.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@hfdb0001conf.d]#pwd
/etc/httpd/conf.d
[root@hfdb0001conf.d]#ll
total12
-rw-r--r--1rootroot392Aug132013README
-rw-------1rootroot227Oct3005:39virtual-ip.conf-bak
-rw-------1rootroot227Oct3005:39virtual-port.conf
-rw-r--r--1rootroot299Aug22013welcome.conf
[root@hfdb0001conf.d]#catvirtual-port.conf

ServerNamewww.harry1.com
DocumentRoot"/www/harry1.com"


ServerNamewww.harry2.com
DocumentRoot"/www/harry2.com"

修改主配置,listen8080
分别访问10.224.243.1:80和10.224.243.1:8080也会被解析到不同的目录下

3.基于域名


serverName不同即可


在conf.d目录下新建配置文件
[root@hfdb0001conf.d]#pwd
/etc/httpd/conf.d
[root@hfdb0001conf.d]#ll
total12
-rw-r--r--1rootroot392Aug132013README
-rw-------1rootroot227Oct3005:39virtual-ip.conf-bak
-rw-------1rootroot227Oct3005:39virtual-port.conf-bak
-rw-r--r--1rootroot299Aug22013welcome.conf
[root@hfdb0001conf.d]#catvirtual-domain.conf===>domain需要被解析到该主机上,可以修改hosts可以DNS
NameVirutalHost10.224.243.1:80

ServerNamewww.harry1.com
DocumentRoot"/www/harry1.com"


ServerNamewww.harry2.com
DocumentRoot"/www/harry2.com"
分别访问www.harry1.com和www.harry2.com也会被解析到不同的目录下
注意:如果此时访问的是10.224.243.1:80==>那么会被解析到第一个
每个虚拟主机可以定义自己的CustomLog,format,error等等

六、其他配置


1.目录权限控制


针对某个IP不能访问www.harry1.com
[root@hfdb0001conf.d]#catvirtual-domain.conf===>domain需要被解析到该主机上,可以修改hosts可以DNS
NameVirutalHost10.224.243.1:80

ServerNamewww.harry1.com
DocumentRoot"/www/harry1.com"

Optionsnone
AllowOverridenone
Orderdeny,allow=>注意指定了Order为denyallow,那么就只排除
Denyfrom{ip}



ServerNamewww.harry2.com
DocumentRoot"/www/harry2.com"

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


一、编辑虚拟目录配置文件,设置认证方式

ServerNamewww.harry1.com
DocumentRoot"/www/harry1.com"

Optionsnone
AllowOverrideAuthConfig=>表明需要进行身份验证(会再虚拟目录下,查找.htaccess文件)
Orderdeny,allow
Denyfrom{ip}


注意:也可以把以下第二步的内容嵌入到Directory节点下。
二、创建.htaccess文件,并配置
vim/var/www/harry1.com/.htaccess
AuthName"test"=>仅仅是描述,但最好设置成虚拟目录的名字,(会在弹出层有体现)
AuthTypeBasic=>验证类型
AuthUserFile/var/www/harry1.com/.htpasswd=>密码文件路径
Requirevalid-user=>表示验证成功的用户都可以访问
注意:Apache默认系统对.ht开头的文件默认是不允许外部访问的。安全性较高。
注意:Requirevalid-user表示只要htpasswd文件验证都给的任何一个均可以登陆
也可以仅仅允许htpasswd文件内的个别用户Requireuserusername1username2
也可以仅仅允许htpasswd文件内的个别用户组Requiregroupgroup1group2
注意文件权限:
-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路径的



SetHandlerserver-status=>该Handler能查看当前系统的状态,如启用了多少进程,即各个进程状态
OrderDeny,Allow
Denyfromall
Allowfrom{ip}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台