http服务器程序:
httpd(apache)
nginx
lighttpd
应用程序服务器:
IIS: .net
tomcat:.jsp
可访问网址:
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
/etc/httpd/conf.d/*.conf
服务脚本:
/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,重启服务进程方可生效;
2. 持久连续
PersistentConnection:tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它的资源请求的进行;
如何断开?
数量限制;
时间限制
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常的响应;
折中:使用较短的持久连接时长,以及较少的请求数量;
KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
测试:
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host:WEB_SERVER_IP
Note:15s不请求将会自动退出;
3. MPM
httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;centos6的rpm包为此专门提供了三个应用程序文件,httpd(prefork),httpd.worker,httpd.event,分别用于实现不同的MPM机制的支持;确认现在使用的是哪个程序文件的方法:
ps aux | grep httpd
可以看出现在使用的是prefork文件。
默认使用的为/usr/sbin/httpd,其为prefork的MPM模块;
查看httpd程序的模块列表:
查看静态编译的模块:
#httpd –l
持卡看静态编译及动态编译的模块:
#httpd –M
更换使用httpd程序,以支持其他的MPM机制:
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}
编辑图中红框部分,将#删掉,保存退出重启服务,进程使用了httpd.worker文件;
Note:必须重启服务,配置才能生效;
MPM配置:
prefork的配置:
<IfModule prefork.c>
StartServers 8 服务启动后默认开启的进程数;
MinSpareServers 5 最小空闲服务器进程,保存备用;
MaxSpareServers 20 最大空闲服务器进程,保存备用;
ServerLimit 256 最大活动进程数,一般此项会大于并发数;
MaxClients 256 最大并发数,最大数量的工作线程;
MaxRequestsPerChild 4000 每个子进程在生命周期内所能够服务的最大请求个数;
</IfModule>
Worker的配置:
<IfModule worker.c>
StartServers 4 服务启动后默认开启的进程数;
MaxClients 300 最大并发数,最大数量的工作线程;
MinSpareThreads 25 最小空闲进程,保存备用;
MaxSpareThreads 75 最大空闲进程,保存备用;
ThreadsPerChild 25 每个进程可生产的线程数;
MaxRequestsPerChild 0 每个子进程在生命周期内所能够服务的最大请求个数,0代表不限制;
</IfModule>
4. DSO
配置指定实现模块加载;
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:
相对于ServerRoot(默认/etc/httpd)
5. 定义’Main’server的文档页面路径
DocumentRoot “”
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
其相当于站点URL的根路径;
(FileSystem)/web/host1/index.html -->(URL)/index.html
我们可以自定义网页文件站点,并不一定把网页文件放在/var/www/html目录下;
1) 修改配置文件,把下图中路径都改为现在定义的路径;
2) 创建相关文件及目录;
3) 重新加载配置文件,测试;
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:定义生效次序;写在后面的表示默认法则;
order allow,deny(设置白名单)
order deny,allow(设置黑名单)
Allow from:
Deny from:
示例:
1) 设置白名单;
2) 测试,在192.168.19.134主机上测试,不能访问了;
7. 定义默认主页面;
DirectoryIndex index.html index.html.var
8. 定义路径别名;
格式:
Alias /URL/ “/PATH/TO/SOMEDIR/”
DocumentRoot“/www/htdocs”
/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias/download/ “/rpms/pub/”
/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
示例:
1) 编辑配置文件,定义别名;
2) 创建相关文件及目录
3) 测试;
9. 设定默认字符集;
AddDefaultCharset UTF-8
10.日志设定
日志类型:访问日志 和 错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn
Possible values include: debug, info, notice,warn, error, crit, alert, emerg.
访问日志:
LogFormat “%h %l %u %t \”%r\”%>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
CustomLog logs/access_log combined
LogFormat format strings:
%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主机上查看日志;
11.基于用户的访问控制;
认证质询:
www-authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
认证方式有两种;
Basic:明文
Digest:消息摘要认证;
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;
用户的账号和密码存放在何处?
虚拟账号:仅用于访问某服务时用到的认证标识;
存储:
文本文件;
SQL数据库;
ldap目录存储;
basic认证配置示例:
1) 定义安全域
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName “String”
AuthUserFile “PATH/TO/HTTPD_USER_PASSWD_FILE”
Require user username1 username2 …
</Directory>
允许账号文件中的所有用户登录访问:
Require valid-user
2) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-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 group grpname1 grpname2 ...
</Directory>
创建用户账号和组账号文件;
组文件:每一行定义一个组
GRP_NAME: username1 username2 ...
示例:基于用户认证;
1) 创建用户账号文件,添加用户;
2) 编辑配置文件,添加安全域;
3) 测试,要求输入密码;
4) 输入用户名及密码,能进入;
示例2:基于组认证;
1) 在上面示例的基础上再创建个用户;
2) 创建组文件,将tom和obama为一个组;
3) 在上一示例的基础上修改配置文件;
4) 检查错误并测试;
浏览器访问测试如下,输入jerry账号不能访问:
输入tom或obama账号可以访问;
12.虚拟主机
站点标识:socket
IP相同,但端口不同;
IP不同,但端口均为默认端口;
FQDN不同:
请求报文中首部;
Host:
有三种实现方案:
基于ip:
为每个虚拟主机准备至少一个ip地址;
基于port:
为每个虚拟主机使用至少一个独立的port;
基于FQDN:
为每个虚拟主机使用至少一个FQDN;
注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用“main”主机;
禁用方法:注释中心主机的DocumentRoot指令即可;
虚拟主机的配置方法;
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot “”
</VirtualHost>
其它可用指令:
ServerAlias:虚拟主机的别名:可多次使用;
ErrorLog:
CustomLog:
<Directory “”>
…
</Directory>
Alias
…
基于IP虚拟主机示例:
1) 注释DocumentRoot指令选项;
2) 编辑虚拟主机配置文件;
3) 创建相关目录及文件;
创建相关文件;
4) 添加ip地址;
5) 测试;
测试192.168.19.128;
测试192.168.19.129;
测试192.168.19.131;
基于端口的虚拟主机:以下在以上配置的基础上进行修改;
1) 修改监听端口;
2) 修改虚拟主机配置文件;
3) 配置文件保存退出后,重启服务;
4) 在192.168.19.134主机上测试;
测试192.168.19.128:80端口(默认80);
测试192.168.19.128:808端口;
测试192.168.19.128:8080端口;
Note:修改完配置文件后必须保存退出,然后重启服务;这样测试才会有效;
基于FQDN的虚拟主机:
1) 修改配置文件;
2) 重载服务
3) 在测试主机上修改添加hosts文件;
4) 测试;
访问;
访问;
访问;
13.Status页面;
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 192.168.19
</Location>
1) 编辑配置文件;
2) 重启服务;
3) 测试;