1、HTTPD特性php
httpd:特性html
1.事先建立进程:在请求来以前,建立进程监听,加快响应速度
java
2.按需维持适当的进程python
3.模块设计,核心比较小,各个功能均可以按照模块添加linux
4.支持多种方式的虚拟主机配置:
shell
Socket IP:Port
apache
1.基于IP的虚拟主机(若是一个server有多个ip,而在互联网上,每一个IP每一年都须要必定的费用)
vim
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重写
2、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.源码编译
3、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权限
4、虚拟主机配置概述
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便可
5、虚拟主机配置
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等等
6、其余配置
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
1、编辑虚拟目录配置文件,设置认证方式 <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节点下。 2、建立.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 3、建立.htpasswd文件,并配置 htpasswd -c /var/www/harry1.com/.htpasswd {username} 第一次建立用户用-c ,第二次则不用 ,会提示你输入密码的。密码是加密的 htpasswd -m /var/www/harry1.com/.htpasswd {username} 修改密码 4、经过用户组访问
3.Location配置 相对于Directory是配置本地文件系统路径的,而Location是针对URL路径的
<Location /server-status> SetHandler server-status => 该Handler能查看当前系统的状态,如启用了多少进程,即各个进程状态 Order Deny,Allow Deny from all Allow from {ip} </Location>