http服务器程序:
httpd(apache)
nginx
lighttpd
应用程序服务器:
IIS:.net
tomcat:.jsp
可访问网址:www.netcraft.com
httpd的安装和使用:
ASF:apache software foundation
httpd:apache
a patchy server =apache
httpd的特性:
高度模块化:core + modules
DSO:dynamic shared object
MPM:Multipath processing Modules(多路处理模块)
prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
N个子进程:每个子进程处理一个请求;
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
Worker:多进程多线程模型,每线程处理一个用户请求;
一个主进程:负责生成子进程;负责创建套接字;负责接受请求,并将其派发给某子进程进行处理;
多个子进程:每个子进程负责生成多个线程;
每个线程:负责响应用户请求;
并发响应数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量;
event:时间驱动模型,多进程模型,每个进程响应多个请求;
一个主进程:负责生成子进程;负责创建套接字;负责接受请求,并将其派发给某子进程进行处理;
子进程:基于时间驱动机制直接响应多个请求;
httpd的程序版本;http://httpd.apache.org/
httpd 1.3:官方已经停止维护;
httpd 2.0:
httpd 2.2:一本centos6上httpd预装版本;
httpd 2.4:目前最新稳定版;
httpd的功能特性:
CGI:common gateway interface
虚拟主机:IP,PORT,FQDN
反向代理
负载均衡
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块
……
安装httpd:
Rpm包:centos发行版中直接提供;
编译安装:定制新功能,或其他原因;
Centos6:httpd2.2
程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
650) this.width=650;" src="https://s4.51cto.com/oss/201711/02/5498f0b6077cc4860a78cea1634de8e8.png-wh_500x0-wm_3-wmp_4-s_727893854.png" title="1.png" alt="5498f0b6077cc4860a78cea1634de8e8.png-wh_" />
/etc/httpd/conf.d/*.conf
650) this.width=650;" src="https://s5.51cto.com/oss/201711/02/241b6df3e5b487a8ce729e18c38d002c.png-wh_500x0-wm_3-wmp_4-s_614470642.png" title="2.png" alt="241b6df3e5b487a8ce729e18c38d002c.png-wh_" />
服务脚本:
/etc/rc.d/init.d/httpd
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日志文件:
/var/log/httpd:
access_log:访问日志
error_log:错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
服务控制和启动:
chkconfig httpd on|off
service {start|stop|restart|status|configtest|reload}httpd
centos7:httpd2.4
程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
模块相关的配置文件:/etc/httpd/conf.modules.d/*.conf
systemd unit file:
/usr/lib/systemd/system/httpd.service
主程序文件:
/usr/sbin/httpd
httpd-2.4支持MPM的动态切换;
日志文件:
/var/log/httpd:
access_log:访问日志
error_log:错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
服务控制:
systemctl enable|disable httpd.service
systemctl {start|stop|restart|status} httpd.service
httpd-2.2的常用配置
主配置文件:/etc/httpd/conf/httpd.conf
### Section 1:Global Encronment(全局环境变量)
### Section 2:“Main”server configuration
### Section 3:Virtual Hosts;
配置格式:
directive value
directive:不区分字符大小写;
value:为路径时,是否区分大小写,取决于文件系统;
常用配置:
1.修改监听的IP和PORT;
Listen[IP:]PORT
1)省略IP表示为0.0.0.0;
2)Listen指令可重复出现多次;
Listen 80
Listen 8080
3)修改监听socket,重启服务进程方可生效;
650) this.width=650;" src="https://s2.51cto.com/oss/201711/02/9fc8b53a5a7d408c753211a98b2fcb30.png-wh_500x0-wm_3-wmp_4-s_3784183658.png" title="3.png" alt="9fc8b53a5a7d408c753211a98b2fcb30.png-wh_" />
2.持久连续
PersistentConnection:tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它的资源请求的进行;
如何断开?
数量限制;
时间限制
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常的响应;
折中:使用较短的持久连接时长,以及较少的请求数量;
KeepAliveOn|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
650) this.width=650;" src="https://s1.51cto.com/oss/201711/02/06fd23bbd46a4ff27267857700583878.png-wh_500x0-wm_3-wmp_4-s_3898293786.png" title="4.png" alt="06fd23bbd46a4ff27267857700583878.png-wh_" />
测试:
telnet WEB_SERVER_IP PORT
GET/URL HTTP/1.1
Host:WEB_SERVER_IP
650) this.width=650;" src="https://s2.51cto.com/oss/201711/02/e7cced8514f1ab075adb2ead10c6989e.png-wh_500x0-wm_3-wmp_4-s_965051896.png" title="5.png" alt="e7cced8514f1ab075adb2ead10c6989e.png-wh_" />
Note:15s不请求将会自动退出;
3.MPM
httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;centos6的rpm包为此专门提供了三个应用程序文件,httpd(prefork),httpd.worker,httpd.event,分别用于实现不同的MPM机制的支持;确认现在使用的是哪个程序文件的方法:
ps aux | grep httpd
650) this.width=650;" src="https://s4.51cto.com/oss/201711/02/86ca731eff836c8833e7be1071194dec.png-wh_500x0-wm_3-wmp_4-s_2106948485.png" title="6.png" alt="86ca731eff836c8833e7be1071194dec.png-wh_" />
可以看出现在使用的是prefork文件。
默认使用的为/usr/sbin/httpd,其为prefork的MPM模块;
查看httpd程序的模块列表:
查看静态编译的模块:
#httpd –l
650) this.width=650;" src="https://s5.51cto.com/oss/201711/02/7c66ba7f0e7e7f3644472a52257a24aa.png-wh_500x0-wm_3-wmp_4-s_4170092967.png" title="7.png" alt="7c66ba7f0e7e7f3644472a52257a24aa.png-wh_" />
持卡看静态编译及动态编译的模块:
#httpd –M
650) this.width=650;" src="https://s1.51cto.com/oss/201711/02/e21d9a6d5387c5965f9b3e30c2b1001c.png-wh_500x0-wm_3-wmp_4-s_955222654.png" title="8.png" alt="e21d9a6d5387c5965f9b3e30c2b1001c.png-wh_" />
更换使用httpd程序,以支持其他的MPM机制:
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}
650) this.width=650;" src="https://s2.51cto.com/oss/201711/02/e02181dda85a466a19ab15108ec47590.png-wh_500x0-wm_3-wmp_4-s_2321523785.png" title="9.png" alt="e02181dda85a466a19ab15108ec47590.png-wh_" />
编辑图中红框部分,将#删掉,保存退出重启服务,进程使用了httpd.worker文件;
650) this.width=650;" src="https://s4.51cto.com/oss/201711/02/5b6194d612114a48704e65f542cde42b.png-wh_500x0-wm_3-wmp_4-s_3000231833.png" title="10.png" alt="5b6194d612114a48704e65f542cde42b.png-wh_" />
Note:必须重启服务,配置才能生效;
MPM配置:
prefork的配置:
650) this.width=650;" src="https://s1.51cto.com/oss/201711/02/5e163ed8aac5979536c46ad675b21e59.png-wh_500x0-wm_3-wmp_4-s_471402956.png" title="11.png" alt="5e163ed8aac5979536c46ad675b21e59.png-wh_" />
<IfModule prefork.c>
StartServers 8 服务启动后默认开启的进程数;
MinSpareServers 5 最小空闲服务器进程,保存备用;
MaxSpareServers 20 最大空闲服务器进程,保存备用;
ServerLimit 256 最大活动进程数,一般此项会大于并发数;
MaxClients 256 最大并发数,最大数量的工作线程;
MaxRequestsPerChild 4000 每个子进程在生命周期内所能够服务的最大请求个数;
</IfModule>
Worker的配置:
650) this.width=650;" src="https://s1.51cto.com/oss/201711/02/6e4574fc07f53406f7cdc18e75193732.png-wh_500x0-wm_3-wmp_4-s_1865456351.png" title="12.png" alt="6e4574fc07f53406f7cdc18e75193732.png-wh_" />
<IfModule worker.c>
StartServers 4 服务启动后默认开启的进程数;
MaxClients 300 最大并发数,最大数量的工作线程;
MinSpareThreads 25 最小空闲进程,保存备用;
MaxSpareThreads 75 最大空闲进程,保存备用;
ThreadsPerChild 25 每个进程可生产的线程数;
MaxRequestsPerChild 0 每个子进程在生命周期内所能够服务的最大请求个数,0代表不限制;
</IfModule>
4.DSO
配置指定实现模块加载;
LoadModule <mod_name> <mod_path>
650) this.width=650;" src="https://s1.51cto.com/oss/201711/02/b9c32e6e29522bd3e8fae52d73bbcc10.png-wh_500x0-wm_3-wmp_4-s_2439191559.png" title="13.png" alt="b9c32e6e29522bd3e8fae52d73bbcc10.png-wh_" />
模块文件路径可使用相对路径:
相对于ServerRoot(默认/etc/httpd)
5.定义’Main’server的文档页面路径
DocumentRoot “”
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
其相当于站点URL的根路径;
(FileSystem)/web/host1/index.html -->(URL)/index.html
650) this.width=650;" src="https://s1.51cto.com/oss/201711/02/0dda17822b77e7f26cc11d4230ecdd32.png-wh_500x0-wm_3-wmp_4-s_1819104908.png" title="14.png" alt="0dda17822b77e7f26cc11d4230ecdd32.png-wh_" />
我们可以自定义网页文件站点,并不一定把网页文件放在/var/www/html目录下;
1)修改配置文件,把下图中路径都改为现在定义的路径;
650) this.width=650;" src="https://s3.51cto.com/oss/201711/02/4fc02b3ff747a2e9058b5085bdc7dabd.png-wh_500x0-wm_3-wmp_4-s_1834411652.png" title="15.png" alt="4fc02b3ff747a2e9058b5085bdc7dabd.png-wh_" />
2)创建相关文件及目录;
650) this.width=650;" src="https://s3.51cto.com/oss/201711/02/699f3233f93f59172f5cf891890bbe19.png-wh_500x0-wm_3-wmp_4-s_3923484010.png" title="16.png" alt="699f3233f93f59172f5cf891890bbe19.png-wh_" />
3)重新加载配置文件,测试;
650) this.width=650;" src="https://s1.51cto.com/oss/201711/02/e960eac25a8166d29f070bf62a4aa87e.png-wh_500x0-wm_3-wmp_4-s_1378048338.png" title="17.png" alt="e960eac25a8166d29f070bf62a4aa87e.png-wh_" />
6.站点访问控制常见机制;
可基于两种机制指明对哪些资源进行何种访问控制;
文件系统路径:
<Directory "">
...
</Directory>
<File"">
...
</File>
<FileMatch "PATTERN">
...
</FileMatch>
URL路径:
<Location "">
...
</Location>
<LocationMatch "">
...
</LocationMatch>
<Directory>中“基于源地址”实现访问控制;
1)Options
后跟1个或多个以空白字符分隔的“选项”列表;
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
None:
All:
2)AllowOverride
与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
All:
None:
3)order和allow、deny
order:定义生效次序;写在后面的表示默认法则;
orderallow,deny(设置白名单)
orderdeny,allow(设置黑名单)
Allow from:
Deny from:
650) this.width=650;" src="https://s3.51cto.com/oss/201711/02/c5b26e57c691a598272453963fb1eaae.png-wh_500x0-wm_3-wmp_4-s_2708500961.png" title="18.png" alt="c5b26e57c691a598272453963fb1eaae.png-wh_" />
示例:
1)设置白名单;
650) this.width=650;" src="https://s5.51cto.com/oss/201711/02/6aa06a0fdd605d164e5d192cfbf7e5b9.png-wh_500x0-wm_3-wmp_4-s_681758480.png" title="19.png" alt="6aa06a0fdd605d164e5d192cfbf7e5b9.png-wh_" />
2)测试,在192.168.19.134主机上测试,不能访问了;
650) this.width=650;" src="https://s3.51cto.com/oss/201711/02/8b7f823b9f9e60e54871f7effd7b89b9.png-wh_500x0-wm_3-wmp_4-s_2142664175.png" title="20.png" alt="8b7f823b9f9e60e54871f7effd7b89b9.png-wh_" />
7.定义默认主页面;
DirectoryIndex index.htmlindex.html.var
650) this.width=650;" src="https://s2.51cto.com/oss/201711/02/c0eaed82f6a40a3c4af1384bd643d2c7.png-wh_500x0-wm_3-wmp_4-s_1162491605.png" title="21.png" alt="c0eaed82f6a40a3c4af1384bd643d2c7.png-wh_" />
8.定义路径别名;
格式:
Alias/URL/ “/PATH/TO/SOMEDIR/”
DocumentRoot“/www/htdocs”
http://www.magedu.ocm/download/bash-4.4.2-3.el6.x86_64.rpm
/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias/download/ “/rpms/pub/”
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
示例:
1)编辑配置文件,定义别名;
650) this.width=650;" src="https://s3.51cto.com/oss/201711/02/2f89ebc08ead023cda29c771d2a8bcff.png-wh_500x0-wm_3-wmp_4-s_2260115323.png" title="22.png" alt="2f89ebc08ead023cda29c771d2a8bcff.png-wh_" />
2)创建相关文件及目录
650) this.width=650;" src="https://s2.51cto.com/oss/201711/02/860d84abea46153caa802bbaf323ad90.png-wh_500x0-wm_3-wmp_4-s_1169802591.png" title="23.png" alt="860d84abea46153caa802bbaf323ad90.png-wh_" />
3)测试;
650) this.width=650;" src="https://s1.51cto.com/oss/201711/02/d5766b4698f8e6dda02bcca671eb76dd.png-wh_500x0-wm_3-wmp_4-s_3534389382.png" title="24.png" alt="d5766b4698f8e6dda02bcca671eb76dd.png-wh_" />
9.设定默认字符集;
AddDefaultCharset UTF-8
650) this.width=650;" src="https://s5.51cto.com/oss/201711/02/f15ae733ad2b00201d74299cca59f355.png-wh_500x0-wm_3-wmp_4-s_1545701907.png" title="25.png" alt="f15ae733ad2b00201d74299cca59f355.png-wh_" />
10.日志设定
日志类型:访问日志 和 错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn
Possible values include: debug, info, notice,warn, error, crit, alert, emerg.
650) this.width=650;" src="https://s3.51cto.com/oss/201711/02/6158f974b915e320df063220730580cf.png-wh_500x0-wm_3-wmp_4-s_3159764158.png" title="26.png" alt="6158f974b915e320df063220730580cf.png-wh_" />
访问日志:
LogFormat “%h %l %u %t \”%r\”%>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
650) this.width=650;" src="https://s4.51cto.com/oss/201711/02/41f8ff6e3fcf4a9574514f36f41ef55f.png-wh_500x0-wm_3-wmp_4-s_1431886482.png" title="27.png" alt="41f8ff6e3fcf4a9574514f36f41ef55f.png-wh_" />
CustomLoglogs/access_log combined
650) this.width=650;" src="https://s4.51cto.com/oss/201711/02/dcb05ed94f46b2c8e2ab822cafc90d15.png-wh_500x0-wm_3-wmp_4-s_302952966.png" title="28.png" alt="dcb05ed94f46b2c8e2ab822cafc90d15.png-wh_" />
LogFormatformat strings:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h:客户端ip地址;
%l:Remote User,通常为一个减号(“-”);
%u:Remote user(fromauth;may be bogus if return status(%s)is 401);非为登录访问时,其为一个“-”号
%t:服务器收到的请求时的时间;
%r:First line ofrequest,即表示请求报文的首行;记录了此次请求的方法,URL以及协议版本;
%>s:响应状态码;
%b:响应报文的大小,单位是字节;不包括响应报文的http首部;
%{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
%{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;
示例:在192.168.19.134主机上访问192.168.19.128,在19.128主机上查看日志;
650) this.width=650;" src="https://s2.51cto.com/oss/201711/02/b7470d5208195e306e5a85a37854a395.png-wh_500x0-wm_3-wmp_4-s_1291213159.png" title="29.png" alt="b7470d5208195e306e5a85a37854a395.png-wh_" />
11.基于用户的访问控制;
认证质询:
www-authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
认证方式有两种;
Basic:明文
Digest:消息摘要认证;
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;
用户的账号和密码存放在何处?
虚拟账号:仅用于访问某服务时用到的认证标识;
存储:
文本文件;
SQL数据库;
ldap目录存储;
basic认证配置示例:
1)定义安全域
<Directory “”>
OptionsNone
AllowOverride None
AuthType Basic
AuthName “String”
AuthUserFile “PATH/TO/HTTPD_USER_PASSWD_FILE”
Require user username1 username2 …
</Directory>
允许账号文件中的所有用户登录访问:
Requirevalid-user
2)提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options]/PATH/TO/HTTPD_PASSWD_FILEusername
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5格式加密;
-s:sha格式加密;
-D:删除指定用户
另外:基于组账号进行认证;
定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile"/PATH/TO/HTTPD_GROUP_FILE"
Require groupgrpname1 grpname2 ...
</Directory>
创建用户账号和组账号文件;