Web服务器输入/输出结构:
单线程I/O结构
多线程I/O结构
复用的I/O结构:单个线程响应多个请求
复用多线程I/O结构:多个线程,每个进程响应多个请求
httpd: 高度模块化
core + modules
DSO:Dynamic Shared Object
MPM:Multipath Processing Module
多道处理模块,非一个模块,而是对一种特性的称谓
prefork:一个进程一个请求
select():1024
worker:一个进程多个线程,一个线程一个请求
event:一个线程响应多个请求
event-driven:事件驱动,主要目的在于实现单线程响应多个请求:
httpd的功能特性:
路径别名:alias
用户认证:authentication
虚拟主机:virtual host
反向代理:
负载均衡
用户站点:
CGI:Common Gateway Interface
安装httpd:
yum -y install httpd
服务脚本: /etc/rc.d/init.d/httpd
脚本配置文件: /etc/sysconfig/httpd
运行目录: /etc/httpd
配置文件:
主配置: /etc/httpd/conf/httpd.conf
扩展配置: /etc/httpd/conf.d/*.conf
Socket: 80/tcp,443/tcp
文档根目录: /var/www/html
CGI目录: /var/www/cgi-bin/
日志滚动:
日志切割
access.log,
access.log
时间、空间
Docroot:文档根目录
配置文件:
/etc/httpd/conf/httpd.conf
配置参数 值
配置指令不区分字符大小写
值有可能区分字符大小写
有些指令可以重复出现多次
例如: Listen [IP:]80
配置文件格式:
全局配置
主机配置:用于仅提供一个站点时
虚拟主机:用于提供多个站点时
配置文件语法测试:
# service httpd configtest
# httpd -t
绝大多数配置修改后,可以通过service httpd reload来生效:如果修改了监听的地址或端口,必须重启服务才能生效:
MIME,多媒体类型
major/minor
HTML: text/html
ASCII: text/plain
JPEG: image/jpeg
GIF: image/gif
QuickTime: video/quicktime
1、监听套接字
Listen [IP:]port
此指令可以出现多次,用于指定监听多个不同的套接字:
Listen 80
Listen 8080
2、配置使用keep alive
KeepAlive {On|Off}
KeepAliveTimeout 2
MaxKeepAliveRequests 50
3、MPM
StartServers:默认启动的工作进程数;
MinSpareServers:最少空闲进程数;
MaxSpareServers:最大空闲进程数;
ServerLimit:最大活动进程数;
MaxClients:并发请求的最大数;
MaxRequestPerChild:每个子进程在生命周期内所能够服务的最多请求个数;
StartServers:启动的子进程的个数
MaxClients:并发请求的最大数
MinSpareThreads:最小空闲线程数
MaxSpareThreads:最大空闲线程数
ThreadsPerChild:每个子进程可生成的线程数
MaxRequestsPerChild:每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定
4、DSO模块加载方式
LoadModule module_name /path/to/module
如果使用相对路径,则相对于ServerRoot所定义的位置而言:例如:
LoadModule php5_module /usr/lib64/httpd/modules/php5.so
让服务重载配置文件方能生效;
httpd -M: 列出已经装载的所有DSO及非DSO模块
httpd -L: 列出支持使用的非DSO模块
5、配置站点根目录
DocumentRoot /path/to/somewhere
6、配置页面访问属性
Options:
Indexes:缺少指定的默认页面时,允许将目录中的所有文件以列表形式返回给客户:危险:
FollowSymlinks:允许跟随符号链接所指向的原始文件
None:所有都启用
All:所有都启用
ExecCGI:允许使用mod_cgi模块执行CGI脚本
Includes:允许使用mod_include模块实现服务器端包含
MultiViews:允许使用mod_negotiation实现内容协商
SymlinksIfOwnerMatch:在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件
7、基于主机的访问控制
Options
AllowOverride None
Order Allow,Deny
Allow
Deny
最佳匹配:从列表中找出最小的能匹配到访问者的地址的条目为最终生效的:
Allow from
Deny from
IP,Network Address
基于用户做访问控制:
8、定义默认主页面
DirectoryIndex index.php index.html
9、用户目录
如果期望让每个用户都可以创建个人站点: ~Username/
userdir disabled:禁止
userdir public_html
public_html是用户家目录下的目录名称,所有位于此目录中的文件均可通过签署的访问路径进行访问
用户的家目录得赋予运行httpd进程的用户拥有执行权限
10、配置日志功能
/var/log/httpd/
access.log:访问日志,其需要记录的内容需要自定义
error.log:错误日志
访问日志:
CustomLog "/path/to/access_log_file" LogFormat_Name
LogFormat Format_String Format_Name
%h 客户端地址
%l 远程登录名
%u 认证时的远程用户名
%t 收到请求时的时间
%r 请求报文的起始行
%>S 响应状态码
%b 响应报文的长度,单位为字节
%{Header_Name}i:记录指定请求报文首部的内容
错误日志:
ErrorLog
11、路径别名
Alias /alias/ "/path/to/somewhere"
意味着访问alias/时,其页面文件来自于/path/to/somewhere这个位置:
12、设定默认字符集
AddDefaultCharset
13、CGI脚本别名
CGI:Common Gateway Interface
协议
Content-Type: text/html
SUID,SGID
php,SAPI,UWSGI
mod_alias, mod_cgi
ScriptAlias /URL/ "/path/to/somewhere/"
在/var/www/cgi-bin目录下定义一个名为test的cgi脚本
#!/bin/bash
cat << EOF
Content-Type: text/html
The hostname is: `hostname`.
The time is: `date`
EOF
重新载入httpd,显示效果图如下:
14、基于用户的访问控制
虚拟用户:
文件: /etc/httpd/conf/.htpasswd
SQL数据库:
dbm:
ldap:
认证类型(auth):
basic:基本认证,帐号和密码明文发送;
digest:摘要认证,hash编程之后发送;
认证提供者(authentication provider):帐号和密码的存放位置
authn
授权机制(authorization):根据什么进行授权,
案例:基于文件,做基本认证,根据用户和组进行授权
定义一个访问需认证的目录
Options None
AllowOverride AuthConfig
AuthType Basic
AuthName "Private Area"
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
创建个密码的认证文件
[root@localhost fin]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom
New password:
Re-type new password:
Adding password for user tom
再重试,访问时输入帐号和密码tom
结果如下图所示:
使用htpasswd命令生成认证库
htpasswd
-c:创建文件,创建第一个用户时使用
-m:密码基于MD5编码存储
15、虚拟主机
一个物理服务器提供多个站点;使用虚拟主机得先取消中心主机
web: Socket(IP,port)
基于不同的IP实现不同的虚拟主机
变化IP
基于不同的port实现不同的虚拟主机
变化port
基于不同的FQDN实现不同的虚拟主机
变化ServerName的值
ServerName
DocumentRoot ""
ServerAlias
ServerAdmin
实例1:定义两个虚拟主机
IP1:192.168.1.9
IP2:192.168.1.100
修改apache主配置文件/etc/httpd/conf/httpd.conf
加入配置两个虚拟主机的代码
ServerName
DocumentRoot "/web/a.com/htdocs"
ServerName
DocumentRoot "/web/b.org/htdocs"
分别创建相应的网页目录和索引文件,重启http
展示效果如下:
实例2:基于FQDN的虚拟主机
在主配置文件httpd.conf加入下面的代码
NameVirtualHost *:80
ServerName
DocumentRoot "/web/a.com/htdocs"
ServerName
DocumentRoot "/web/b.org/htdocs"
ServerName
DocumentRoot "/web/c.net/htdocs"
打开测试页面:可以看到使用域名可以正常的访问该页面
虚拟主机的单独配置:
用户认证
访问日志
错误日志
别名
脚本别名
基于IP认证机制,基于用户认证
http协议认证、表单认证
16、https协议
x509.3证书格式:
证书格式版本号
证书序列号
证书签名算法
证书颁发者
有效期
持有者的名称
持有者的公钥
CA的ID
持有者的ID
其它扩展信息
基本约束
证书策略
密钥的使用限制
CA签名
PKI:Public Key Infrastructure
端实体(申请者)
注册机构(RC)
签证机构(CA)-->签证机构(CA)
证书撤销列表(CRL)发布机构
证书存取库
SSL握手要完成的工作:
交换协议版本号
选择双发都支持的加密方式
对两段实现身份验证
密钥交换
http:文本协议,80/tcp
https:二进制格式的协议,443/tcp
SSL会话基于IP地址进行:不支持在基于FQDN的虚拟主机上实现
客户端验证服务器证书时:
日期检测:证书是否在有效期内
证书颁发者的可信度:
证书的签名检测:
持有者的身份检测:
httpd: 基于mod_ssl模块实现对ssl的支持
示例:
1、生成私钥
[root@localhost CA]# pwd #进入到生成证书目录
/etc/pki/CA
[root@localhost CA]# (umask 077; openssl genrsa 2048 > private/cakey.pem)
Generating RSA private key, 2048 bit long modulus
.........................+++
................................................+++
e is 65537 (0x10001)
2、修改/etc/pki/tls/openssl.cnf 配置文件
修改CA的一些信息