ASF:Apache Software Foundation
Apache Project: httpd/tomcat/hadoop/
httpd: apache
a patchy(补丁) server = apache
- 高度模块化:core + modules
- DSO: Dynamic Shared Object
- MPM: Multipath Processing Modules 多路处理模块
- prefork: 多进程模型,每个进程响应一个请求;
- 一个主进程:负责生成子进程及回收子继承;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
- n个子进程:每个子进程处理一个请求;
- 工作模型:会预生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
- worker:多进程多线程模型,每个线程处理一个用户请求;
- 一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
- 多个子进程:每个子进程负责生成多个线程;
- 每个线程:负责响应用户请求;
- 并发响应数量:m*n
- m: 子进程数量
- n: 每个子进程所能创建的最大线程数量;
- event:事件驱动模型,多进程模型,每个进程响应多个请求;
- 一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
- 子进程:基于事件驱动机制直接响应多个请求;
- http-2.2: 测试使用模型
- httpd-2.4: event 可生产环境使用
- prefork: 多进程模型,每个进程响应一个请求;
- httpd 1.3: 官方已经停止维护
- httpd 2.0 主流版本
- httpd 2.2 主流版本 (CentOS 6 默认版本)
- httpd 2.4 目前最新稳定版 (CentOS 7 默认版本)
- CGI: Common Gateway Interface
- 虚拟主机:IP,PORT,FQDN
- 反向代理
- 负载均衡
- 路径别名
- 丰富的用户认证机制
- basic
- digest
- 支持第三方模块
-
rpm 包安装:CentOS 发行版中直接提供
-
编译安装:定制新功能,或其他原因;
-
CentOS 6: httpd-2.2
- 程序环境:
-
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
-
服务脚本
/etc/rc.d/init.d/httpd
- 脚本配置文件:
/etc/sysconfig/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
- 开启自启动:
-
- 程序环境:
~]# rpm -ql httpd
~]# service httpd start
访问 http://172.16.1.1
~]# cd /etc/httpd/conf.d/
~]# ls
~]# mv welcome.conf welcome.conf.bak
~]# service httpd reload
~]# vim /var/www/html/test.html
<h1>Test Site</h1>
访问 http://172.16.1.1
- CentOS 7: httpd-2.4
- 安装 httpd:
~]# yum -y install httpd && rpm -ql httpd
- 程序环境
-
配置文件
- 主配置文件:
/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:
~]# systemctl start httpd.service
~]# systemctl status httpd.service
/etc/httpd/conf/httpd.conf
~]# grep -i "Section" httpd.conf
查看主配置分段信息
- Section 1: Global Enviroment 全局配置
- Section 2: 'Main' Server configuration 中心主机配置段
- Section 3: Virtual Hosts 虚拟主机配置段
directive value
- directive: 不区分字符大小写
- value: 为路径时,是否区分字符大小写,取决于文件系统
~]# cd /etc/httpd/conf/ && cp -v httpd.conf{,.backup}
备份主配置文件
Listen [IP:]PORT
IP 可以省略可以监听本机所有网卡端口
- 省略 IP 表示为 0.0.0.0 (本机正常使用的所有 IP)
Listen
指令可重复出现多次,监听多个端口Listen 80
Listen 8080
- 修改监听
socket
,重启服务进程方可生效
Persistent Connection: tcp 连接建立后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求的进行
-
如何断开连接?
- 数量限制
- 时间限制
-
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应
-
折衷:使用较短的持久连接时长,以及较少的请求数量
KeepAlive On|Off
默认是 OffKeepAliveTimeout 15
长连接持续时间MaxKeepAliveRequests 100
最多请求资源数量,超出这个数量限制自动断开连接
-
模拟请求资源测试长连接
telnet 连接请求资源
~]# telnet 172.16.100.6 80
Trying 172.16.100.6...
Connected to 172.16.100.6.
Escape character is '^]'.
GET /test.html HTTP/1.1
Host: 172.16.100.6
Enter
Enter
响应请求资源
HTTP/1.1 200 OK
Date: xxx
Server: Apache/2.2.xx(CentOS)
Last-Modified: xxx
ETag: "xxx"
Accept-Range: bytes
Content-Length: 19
Connection: close
Content-Type: text/html; charset=UTF-8
<h1>Test</h1>
Connection closed by foreigh host.
长连接
~]# vim httpd.conf
KeepAlive On
KeepAliveTimeout 15
MaxKeepAliveRequests: 100
重启服务
~]# service httpd reload
再一次 telnet 连接请求资源
~]# telnet 172.16.100.6 80
Trying 172.16.100.6...
Connected to 172.16.100.6.
Escape character is '^]'.
GET /test.html HTTP/1.1
Host: 172.16.100.6
Enter
Enter
-
在限定时长内最多可以请求多少个连接,不包括第一个连接,总共可以连接100+1
-
客户端模拟请求:时间过期和最大请求数
~]# yum -y install telent
~]# telnet 192.168.1.61 80
GET /test.html HTTP/1.1
Host: 192.168.1.61
http-2.2不支持同时编译多个 MPM 模块,所以只能编译选定要使用的哪个
-
CentOS 6 的 rpm 包为此专门提供了三个应用程序文件
- httpd(prefork)
- httpd.worker
- httpd.event
-
分别用于实现对不同的MPM机制的支持;确认现在使用的哪个程序文件的方法:
# ps aux | grep httpd
- 默认使用的
/usr/sbin/httpd
,其为prefork
的MPM模块
-
查看 httpd 程序的模块列表
-
查看静态编译的模块:
# /usr/sbin/httpd -l
- core.c 核心模块
- prefork.c prefork模块
- http_core.c http核心模块
- mod_so.c 动态加载模块
-
查看静态编译及动态编译的模块:
# /usr/sbin/httpd -M
-
-
更换使用httpd程序,以支持其他 MPM 机制
~]# service httpd stop
~]# vim /etc/sysconfig/httpd 默认使用prefork
HTTPD=/usr/sbin/httpd.{worker|event}
~]# service restart stop
- 脚本配置文件
~]# vim /tmp/useradd.conf`
username=myuser`
~]# vim useradd.sh`
#!/bin/bash`
[ -f /tmp/useradd.conf ] && source /tmp/useradd.conf
username=${username:-testuser}
useradd $username # myser
- prefork配置
<IfModule prefork.c>
StartServers 8 服务进程启动时子进程数量
MinSpareServers 5 最少空闲进程数
MaxSpareServers 20 最多空闲进程数
ServerLimit 256 允许在线最大进程数量
MaxClients 256 最大响应客户端请求数量
MaxRequestsPerChild 4000 每个进程最多处理多少个请求,达到4000个销毁进程,创建新的子进程
</IfModule>
prefork 是 select IO 模型(1024并发)
1秒处理5请求,256进程请求一秒内处理多少个请求,256x5=1280 一天38400x1280 = 1亿,一个页面100个资源= 1亿/100=100万PV。每个请求10KB, 1280个请求, 1280x10KB=12800KB/1024=12MBx8=96Mbps,没有算报文首部和其他开销数据,所以带宽 100Mbps 可能不够。
-
以峰值作为标准性能指标
-
PV: Page View 页面浏览量(css+js+html+mp3+mp4+...)
-
UV: User View 用户浏览量
-
worker配置
<IfModule worker.c>
StartServers 4 服务启动时子进程数量
MaxClients 300 最大响应客户端请求数量
MinSpareThreads 25 最少空闲线程数
MaxSpareThreads 75 最大空闲线程数
ThreadsPerChild 25 每个进程生成多少个线程
MaxRequestsPerChild 0 (0:无限)
</IfModule>
问题:子进程4 x 每个进程生成25个线程 VS 最大空闲线程数 75,4X25 vs 75??? 脑残设计
A shell 运行
~]# vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
~]# ps aux | grep httpd
~]# watch -n.5 'ps aux | grep httpd'
B shell 运行
~]# service htptd restart
发现开始生成4个进程,之后删除一个进程
Dynamic Share Object, 动态共享对象
配置指令实现模块加载 : LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:相对于 ServerRoot
(默认/etc/httpd)
~]# ls -l /etc/httpd/
logs -> ../../var/log/httpd
modules -> ../../usr/lib64/httpd/modules
run -> ../../var/run/htpd
~]# httpd -M 编译进去的静态模块和动态装载模块
~]# httpd -l 编译进去的静态模块
-
提供一个站点方式:
- 可以在 mainServer 定义(只有一个站点时使用)
- 可以在虚拟主机定义一个站点(多个站点时使用)
-
文档路径映射:
DocumentRoot
执向的路径为 URL 路径的起始位置- 其相当于站点 URL 的根路径
- (FileSystem)/var/www/html/index.html => (URL)/index.html
-
http-2.4版本的
DocumentRoot和访问控制列表
同时设置才可生效
~]# mkdir -pv /web/host1
~]# vim /web/host1/index.html
<h1>New Location</h1>
~]# vim /etc/httpd/http.conf
DocumentRoot "/web/host1"
# 站点访问控制
<Directory>
</Directory>
~]# service httpd reload
在浏览器访问 172.16.100.6
基于两种机制指明对哪些资源进行何种访问控制
- 文件系统路径
所有目录及其子目录
<Directory "">
...
</Directory>
单个文件访问控制
<File "">
...
</File>
类文件访问控制
<FileMatch "PATTERN">
...
</FileMatch>
- URL路径
<Location "">
...
</Location>
<LocationMatch "">
...
</LocationMatch>
Options
: 后跟 1 个或多个以空白字符分隔的选项列表
Indexes
:指明的 URL 路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;推荐不使用FollowSymLinks
:仅允许跟踪符号链接文件指向的源文件内容;推荐不使用
~]# cd /web/host1
~]# cd
~]# ln -sv /etc/fstab /web/host1/test2.html
~]# ls -l /web/host1/
~]# vim httpd.conf
Options FollowSymLinks
~]# service httpd reload
访问 http://172.16.100.1/test2.html,显示 /etc/fstab文件内容
SymLinksifOwnerMatch
:与目标文件属主属组相同时访问源文件内容ExecCGI
:通用网管 CGIMultiViews
:内容协商,消耗资源None
:不使用All
:所有都使用
AllowOverride None
- 与访问控制相关的哪些指令可以放在
.htaccess
文件(每个目录下都可以有一个)中; All
影响性能None
不能存放在.htaccess
- Order allow,deny
-
order
:定义生效次序;写在后面的表示默认法则 -
order allow,deny
:白名单 -
deny,allow
:黑名单 -
Allow from 来源地址, Deny from 来源地址
- 来源地址:
- IP
- NetAddr : 网段地址
- 172.16
- 172.16.0.0
- 172.16.0.0/16
- 172.16.0.0/255.255.0.0
- 来源地址:
-
除了 172.16.100.6 之外 172.16 网段访问
Order,allow,deny
Deny from 172.16.100.6
Allow from 172.16
- 定义路径别名
格式:Alias /URL/ "/PATH/TO/SOMEDIR/"
-
DocumentRoot "/www/htdocs"
http://IP/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://IP/download/bash-4.4.2-3.el6.x86_64.rpm
-/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
-
http://IP/images/logo.png
/www/htdocs/images/logo.png
DirectoryIndex
index.html index.html.var
AddDefaultCharset UTF-8
- 中文字符集:GBK, GB2312, GB18030
日志类型:访问日志和错误日志
错误日志:ErrorLog
指令(进程运行错误、用户访问错误页面)
ErrorLog logs/error_log (logs 相对于ServerRoot => /etc/httpd)
LogLevel warn 日志级别
Possible values include: debug(所有信息), info(信息), notice(注意), warn(警告), error(错误), crit(严重错误), alert,emerg(紧急错误)
访问日志:CustomLog
指令(用户访问页面)
组合日志格式
LogFormat %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
访问日志指定
CustomLog logs/access_log combined
日志记录格式:LogFormat "" 格式名称
-
LogFormat %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
-
%h : 客户端IP地址
-
%l : 远程登入用户名(remote user), 通常为一个减号("-")
-
%u : remote user (from auth; may be bogus if return status(%s) is 401)认证名;非为登录访问时,其为一个减号;
-
%t :服务器收到请求时的时间
-
%r : First line of request,请求报文的首行; METHOD /URL HTTP/版本
-
%>s :响应的状态码
-
%b :响应报文的大小,单位是字节;不包括响应报文的 HTTP 首部
-
%{Referer}i :请求报文中首部referer的值;即从哪个页面中的超链接跳转至当前页面的(i表示特定首部的值)
-
%{User-Agent}i :请求报文中首部 User-Agent的值;发出请求的应用程序
- 认证方式:
- 表单认证(form+db)
- http 协议认证(http)
- 认证质询:
- WWW-Authenticate:响应码为 401,拒绝客户端请求,并说明要求客户端提供账号和密码
- 认证:
- Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
- 认证方式有两种:
- basic:明文
- digest: 信息摘要(摘要认证)(很多浏览器可能不支持)
- 认证方式有两种:
- 安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;
- 用户的账号和密码存放于何处?
-
虚拟账号:仅用于访问某服务时用到的认证标识
-
存储:
- 文本文件
- SQL数据库
- ldap目录存储
-
- 定义安全域
DocumentRoot "/web/host1"
访问目录认证
<Directory "/web/host1/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Please input your admin name and password."
AuthUserFile "/etc/httpd/conf/.htpasswd"
Require user tom jerry
</Directory>
允许账号文件中的所有用户登录访问:Require valid-user
- 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
~]# htpasswd [opitons] /PATH/TO/HTTPD_PASSWD_FILE username
-c:create a new file **自动创建**此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5 加密
-s:SHA 加密
-D:删除指定用户
-h: 帮助信息
~]# htpasswd -h
~]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom
~]# htpasswd -m /etc/httpd/conf/.htpasswd jerry
~]# htpasswd -m /etc/httpd/conf/.htpasswd obama
- 测试配置文件是否有语法错误
~]# httpd -t (CentOS 7)
~]# service httpd configtest (CentOS 6)
~]# service httpd reload 注意一定要先检查语法错误
- 访问地址 : http://172.16.100.6/admin/
- 定义安全域
<Directory "/web/host1/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Please input your admin name and password."
AuthUserFile "/etc/httpd/conf/.htpasswd"
AuthGroupFile "/etc/httpd/conf/.htgroup"
Require group mygrp mygrp2
</Directory>
- 创建用户账号和组账号文件
~]# vim /etc/httpd/conf/.htgroup
mygrp: obama black eric
组文件:每一行定义一个组
GRP_NAME:username1 usernam2 ...
~]# htpasswd -m /etc/httpd/conf/.htpasswd obama
~]# htpasswd -m /etc/httpd/conf/.htpasswd black
~]# htpasswd -m /etc/httpd/conf/.htpasswd eric
~]# httpd -t
~]# service httpd reload
- 访问页面 : http://172.16.100.6/admin/
-
站点标识:socket
- IP 相同,但端口不同(易于实现,并不实用)
- IP 不同,但端口均为默认端口
- FQDN 不同
- 请求报文首部
- Host:www.lingyima.com (根据Host判断实用哪个虚拟主机)
-
有三种实现方案:
- 基于IP: 为每个虚拟主机准备至少一个IP地址
- 基于PORT: 为每个虚拟主机使用至少一个独立的PORT
- 基于FQDN:为每个虚拟主机使用至少一个FQDN
-
注意:一般虚拟主机不要与中心主机混用;因此,要使用虚拟主机,得先禁用
main主机
禁用方法:注释中心主机的DocumentRoot指令即可;
- 虚拟主机的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot "/PATH/TO/HOST_DIR"
</VirtualHost>
- 其他可用指令
ServerAlias 虚拟主机的别名; 可多次使用
ErrorLog 错误日志
CustomLog 访问日志
<Directory ""> 基于文件系统路径控制访问资源文件
...
</Directory>
Alias 路径别名
~]# ifconfig eth0:0 172.168.6.0/16
~]# ifconfig eth0:1 172.168.6.1/16
~]# ifconfig eth0:2 172.168.6.2/16
- 基于IP的虚拟主机示例:
<VirtualHost 172.168.6.0:80>
ServerName www.a.com
DocumentRoot "/www/a.com/html"
</VirtualHost>
<VirtualHost 172.168.6.1:80>
ServerName www.b.net
DocumentRoot "/www/b.net/html"
</VirtualHost>
<VirtualHost 172.168.6.2:80>
ServerName www.c.org
DocumentRoot "/www/c.org/html"
</VirtualHost>
~]# mkdir -pv /www/{a,com,b.net,c.org}/htdocs
~]# vim /www/a.com/htdocs/index.html
~]# vim /www/b.net/htdocs/index.html
~]# vim /www/c.org/htdocs/index.html
~]# httpd -t
~]# for i in a.com b.net c.org; do mv /www/$i/htocs /www/$i/htdocs; done
~]# ls /www/a.com
~]# ls /www/b.net
~]# ls /www/c.org
- 基于端口的虚拟主机示例
Listen 80
Listen 8080
Listen 8089
<VirtualHost 172.168.6.0:80>
ServerName www.d.com
DocumentRoot "/www/d.com/html"
</VirtualHost>
<VirtualHost 172.168.6.1:8080>
ServerName www.e.net
DocumentRoot "/www/e.net/html"
</VirtualHost>
<VirtualHost 172.168.6.2:8089>
ServerName www.f.org
DocumentRoot "/www/f.org/html"
</VirtualHost>
- 基于 FQDN 的虚拟主机示例:
- 基于名称虚拟主机配置, httpd-2.2版本必须设置
NameVirtualHost 172.168.6.0:80
<VirtualHost 172.168.6.0:80>
ServerName www.g.com
DocumentRoot "/www/g.com/html"
</VirtualHost>
<VirtualHost 172.168.6.0:80>
ServerName www.h.net
DocumentRoot "/www/h.net/html"
</VirtualHost>
<VirtualHost 172.168.6.0:80>
ServerName www.i.org
DocumentRoot "/www/i.org/html"
</VirtualHost>
- httpd.conf 文件中 加载
LoadModule status_module modules/mod_status.so
~]# vim /etc/httpd.conf
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from all
</Location>
# httpd -t
# service reload httpd
-
"_" Waiting for Connection等待连接请求,空闲状态
-
"S" Starting up正在创建
-
"R" Reading Request正在读取请求
-
"W" Sending Reply正在发送响应报文
-
"K" Keepalive(read)长连接状态,
-
"D" DNS Lookup (DNS查询)
-
"C" Closing connection连接关闭
-
"L" Logging正在写日志
-
"G" Gracefully finishing优雅关闭
-
"I" idle cleanup of worker空闲清理工作进程(缓存相关)
-
"." Open slot with no current process打开没有当前进程槽(茶壶和茶碗,空闲茶碗)
-
PID Key:
- 7606 in state: W, 7607 in state: _, 7608 in state: _
- 7609 in state: _, 7610 in state: _, 7611 in state: _
- 7612 in state: _, 7613 in state: _
7606 表示进程号
基于URL语法在命令行方式下工作的文件传输工具。支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LOAP等协议。curl支持HTTP认证,并且支持HTTP的POST、PUT方法、FTP上传,kerberos认证,HTTP上传,代理服务器,cookies, 用户名/密码认证,下载文件断点续传,http代理服务器管道(proxy tunneling),甚至它还支持IPv6, socks5代理服务器,通过http代理服务器上传文件到FTP服务器等等。
curl [options] [URL...]
curl options:
-A/--user-agent <string> : 设置用户代理发送给服务器
-e/--refere <URL> : 来源网址
--basic : 使用http基本认证
-u/--user <user[:password]> : 设置服务器的用户和密码
--tcp-nodelay
--cacert <file> : CA 证书(ssl)
--compressed : 要求返回是压缩的格式(传输过程压缩)
-H/--header <line> : 自定义首部信息传递给服务器
-I/--head : 只显示响应报文首部信息
--limit-rate <rate> : 设置传输速度
-O/--http1.0 : 使用 http1.0
- MIME: major/minor
- images/png
- image/gif
- text/html
- text/plain
-dump
不进入交互式模式,而直接将URL的内容输出至标准输出
指定以哪个用户的身份运行httpd服务进程
User apache
Group apache
- rpm安装:apache
- 编译安装:daemon
suid
SUexec
使用 mod_deflat 模块压缩页面优化传输速率
使用场景
- 节约带宽,额外消耗 CPU;同时,可能有些叫老浏览器不支持
- 压缩适于压缩的资源,文本文件
输出过滤器
SetOutputFilter DEFLATE
# mod_deflat configuration
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/text
# Level of compression (Hightest 9 - Lowest 1) 压缩级别
DeflateCompressionLevel 9
排除老式浏览器
# Netscape 4.x has come problems
BroserMatch ^Mozilla/4 gzip-only-test/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
Content-Encoding: gzip
# vim httpd.conf
# Defalt
SetOutputFilter DEFLATE
# mod_deflat configuration
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/text
# Level of compression (Hightest 9 - Lowest 1) 压缩级别
DeflateCompressionLevel 9
# systemctl reload httpd.service
# curl I http://fqsj.com/index.html
- http 文本格式(明文)
- https 二进制格式(密文)
- 客户端发送可供选择的加密方式,并向服务器请求证书
- 服务器端发送证书以及选定的加密方式给客户端
- 客户端取得证书并进行证书验证
- 如果新人给其他证书的 CA
- a) 验证证书来源的合法性;用 CA 的公钥解密证上的数字签名
- b) 验证证书的内容的合法性;完整性验证
- c) 检查证书的有效期限
- d) 检查证书是否被吊销
- e) 证书中拥有者的名字,与访问的目标主机要一致
-
客户端生成临时会话密钥(对称加密),并使用服务期端的公钥加密此数据发送给服务器,完成密钥交换;
-
服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机
- 为服务器申请数字证书
- 测试:通过私建CA发证书
- a) 创建私有CA
- b) 在服务器创建证书签署请求
- c) CA签证
- 配置 httpd 支持使用 ssl, 及使用的证书
# yum -y install mod_ssl
配置文件
# vim /etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCentificateFile
SSLCertificateKeyFile
- 测试基于https访问相应的主机
openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
172.16.100.67(自建 CA证书)
# cd /etc/pki/CA/
# ls
# (umask 077; openssl genrsa -out private/cakey.pen 2048)
# ll private/
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem 自签证书
CN
Beijing
Beijing
Lingyima
Ops
ca.lingyima.com
[email protected]
# touch serial index.txt`
# echo 01 > serial
172.16.100.6
# cd /etc/httpd/
# ls
# mkdir ssl
# cd ssl/
# ls
# (umask 077;penssl genrsa -out httpd.key 1024) 生成私钥
# openssl req -new -key httpd.key -out httpd.csr 创建证书请求
CN
Beijing
Beijing
Lingyima
Ops
www.lingyima.com 真实服务器域名
[email protected]
# scp httpd.csr [email protected]:/tmp/
172.16.100.67(签署证书)
~]# cd /etc/pki/CA/
~]# openssl ca -in /tmp/httpd.csr -out certs/httpd.crt
y
y
~]# scp certs/httpd.crt 172.16.100.6:/etc/httpd/ssl/ 复制证书到客户端
第一步完成
172.16.100.6
# yum -y install mod_ssl
# rpm -ql mod_ssl
/etc/httpd/confd./ssl.conf
/usr/lib64/httpd/module/mod_ssl.so
...
# httpd -M | grep ssl
# cd /etc/httpd/conf.d/
# cp -pv ssl.conf{,.backup}
# vim ssl.conf
DcoumentRoot "/var/www/html"
ServerName www.lingyima.com
SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /etc/httpd/ssl/httpd.crt 服务器证书
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key 私钥文件
# httpd -t
# service httpd restart
# ss -tnl
443
测试访问:172.16.100.67
# openssl s_client -connect www.lingyima.com:443
# openssl s_client -connect www.lingyima.com:443 -CAfile /etc/pki/CA/cacert.pem
GET /index.html HTTP/1.1
Host: www.lingyima.com
-CAfile /etc/pki/CA/cacert.pem 验证客户端证书
浏览器加载CA证书
CA 服务器
# scp [email protected]:/etc/pki/CA/cacert.pem ./
# mv cacert.pem cacert.crt
浏览器:设置 -> 高级设置 -> HTTPS/SSL -> 证书管理器 -> 授权中心(选项都勾选) -> 导入
# vim /etc/hosts
172.16.100.6 www.lingyima.com
访问:https://www.lingyima.com
htpasswd: basic 认证基于文件实现时,用到的账号密码文件生成工具;
apachectl: httpd 自带的服务控制脚本,支持 start 和 stop, gracefulll;
apxs: 有 httpd-devel 包提供,扩展 httpd 使用第三方模块的工具;
rotatelogs: 日志滚动工具
access.log -->
access.log(新的文件), access.1.log(旧的文件1) -->
access.log(新的文件), access.1.log(旧的文件2), access.2.log(旧的文件1)
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行;
ab: apache bench
- CLI: ab, webbench, http_load, seige
- GUI: jmeter, loadrunner
- tcpcopy: 网易开发的,复制生产环境中的真实请求,并将之保存下来
ab [OPTIONS] URL
-n: 总请求数
-c:模拟的并发数
-k:以持久连接模式测试
# ab -c 100 -n 1000
- Time per request : 并发100个请求所花费时间
- Time per request : 请求1个所花费的时间
- Connect: 客户端连接服务器时间(服务器进程数量))
- Processing: 服务器接收请求并处理时间(服务器处理应用时间)
- Waiting: 服务器响应给位客户端所花费时间(服务器带宽)
- Run-time Loadable MPMs: MPM 支持运行为 DSO 机制;以模块形式按需加载
- Event MPM(网络IO) 生产环境可用
- Asynchronous support: 异步读写功能
- Per-module and per-directory LogLevel configuration: 支持每模块及每目录的单独日志级别定义
- Per-request configuration sections: 每请求相关的专用配置
- General-purpose expression parser: 增强版的表达式分析器
- KeepAliveTimeout in milliseconds: 毫秒级持久连接时长定义
- NameVirtualHost directive: 基于 FQDN 的虚拟主机也不再需要NameVirtualHost指令
- Override Confgiuration: 新指令 AllowOverrideList
- Config file variables: 支持用户自定义变量
- Reduces memory usage: 更低的内存消耗
- mod_proxy_fcgi(驱动 fastCGI 库)
- mod_proxy_scgi (Python)
- mod_remoteip(给予远程访问IP控制,取消了 allow/deny机制,替换新的机制))
- httpd-2.4 依赖于
apr-1.4+, apr-util-1.4+, [apr-iconv]
apr
: apache portable runtime : apache可运行环境
CentOS 6 默认提供 apr-1.3.9, apr-util-1.3.9
# rpm -q apr
# rpm -q apr-util
- 编译安装步骤:
- 开发环境包组:
Development Tools, Server Platform Development
- 开发程序包:
pcre-devel
, 支持perl正则表达式
- 开发环境包组:
- apr-1.4+
# ./configure --prefix=/usr/local/apr
# make && make install
- apr-util-1.4+
apr-util 依赖 apr-1.4
# ./configure --prefix=/usr/local/apr-util \
--with-apr=/usr/local/apr
# make -j 2 && make install
- httpd-2.4
# ./configure --help | less
# ./configure --prefix=/usr/local/apache24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--enable-modules=most \
--enable-mpms-shared=all \
--sysconfdir=/etc/httpd24 \
--with-mpm=prefork \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
# make -j 4 && make install
--enable-so 启用DSO机制
--enable-ssl 启用SSL功能
--enable-cgi 启用CGI
--enable-rewrite 启用重写机制
--enable-modules=most 启用哪些模块,most是常用模块
--enable-mpms-shared=all 哪些MPM模块编译
--sysconfdir=/etc/httpd24 配置文件目录
--with-mpm=prefork 默认运行mpm模块
--with-zlib 依赖zlib程序库
--with-pcre 依赖perl正则表达式
--with-apr=/usr/local/apr
--with-apr-util=/usr/local/apr-util
- apr-1.5.0.tar.bz2
- apr-util.1.5.3.tar.bz2
- httpd-2.4.10.tar.bz2
# tar xf apr-1.5.0.tar.bz2
# cd apr-1.5.0
# ./configure --help | less
# ./configure --prefix=/usr/local/apr
# make && make install
# ls -l /usr/local/apr
# tar xf apr-util-1.5.3.tar.bz2
# cd apr-util-1.5.3
# ./configure --prefix=/usr/local/apr-util \
--with-apr=/usr/local/apr
# make -j 2 && make install
# ls /usr/local/apr-util/
# tar xf htpd-2.4.10.tar.bz2
# cd httpd-2.4.10
# ./configure --prefix=/usr/local/apache24 \
--enable-so --enable-ssl --enable-cgi \
--enable-rewrite \
--enable-modules=most \
--enable-mpms-shared=all \
--sysconfdir=/etc/httpd24 \
--with-mpm=prefork \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--enable/disable:启用/禁用哪些特性
--with-?:依赖于哪些程序包
--without-?: 不依赖哪些程序包
worker,event是基于线程模型
# make && make install
启动服务 : ~]# /usr/local/apache24/bin/apachectl start
查看 httpd 编译安装过程记录文件:~]# vim /usr/local/apache24/build/config.nice
临时生效 : ~]# export PATH=/usrl/local/apache24/bin:$PATH && echo $PATH
永久生效,但必须重启系统
# vim /etc/profile.d/httpd.sh
export PATH=/usrl/local/apache24/bin:$PATH
# apachectl stop
# hash
导出头文件
# ln -sv /usr/local/apache24/include /usr/include/httpd
# ls /usr/include/httpd/
导出库文件
# ldconfig -v 当前系统加载的库
# ldconfig -p 当前系统已经加载的库的所有路径
# vim /etc/ld.so.conf.d/httpd.conf
/usr/local/apache24/lib
# ldconfig -v 加载库文件
配置 http-2.4 服务脚本
# cd /etc/rc.d/initd./
# cp httpd httpd24
# vim httpd24
conf
pid
log
lock
# chkconfig --add httpd24
# chckconfig --list httpd24
# service httpd24 status|start|stop|reload
切换 MPM
# vim /etc/httpd24/httpd.conf
# 导入mpm配置文件
include /etc/httpd24/extra/httpd-mpm.conf
后者导入 event 模块
# vim /etc/httpd.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
# vim /etc/httpd24/extra/httpd-mpm.conf
# yum -y install httpd
- 配置文件:
- 主配置文件:
/etc/httpd/conf/httpd.conf
- 模块配置文件:
/etc/httpd/conf.modules.d/*.conf
- 配置文件组成部分:
/etc/httpd/conf.d/*.conf
- 主配置文件:
# ls /etc/httpd/modules/
# httpd -l
# httpd -M 模块列表
- 切换MPM
启用要启用的MPM相关的LoadModule指令即可
# httpd -M
# vim /etc/httpd/conf.moduled.d/00-mpm.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
# systemctl restart httpd.service
# httpd -M
# mkdir /apps/www/htdocs -pv
# vim /apps/www/htdocs/index.html
# pwd
# vim /etc/httpd/conf/httpd.conf
# cd conf
# cp httpd.conf{,.bak}
# vim httpd.conf
# systemctl reload httpd.service
# cd ../conf.d/
# ls
# mv welcome.conf welcome.conf.bak
# systemctl reload httpd.service
# cd ../conf
# vim httpd.conf
DocumentRoot "/apps/www/htdocs"
#示例:所有主机访问, 禁用Indexes
<Directory "/apps/www/htdocs">
Options -Indexes FollowSymLinks
Require all granted
#所有主机访问,除了172.16.100.2
<RequireAll>
Require all granted
Require not ip 172.16.100.2
</RequireAll>
</Directory>
# httpd -t
- 基于 IP 人访问控制
DocumentRoot "/apps/www/htdocs"
-
允许所有主机访问:
Require all granted
-
拒绝所有主机访问:
Require all deny
-
控制特定的IP访问:
Require ip IPADDR
授权指定来源的IP访问Require not ip IPADDR
拒绝指定来源的IP访问
-
控制特定的主机访问:
Require host HOSTNAME
授权指定来源的主机访问Require not host HOSTNAME
拒绝指定来源的主机访问
-
HOSTNAME:
- FQDN:特定主机
- Domain.tid:指定域名下的所有主机
- 虚拟主机
基于 FQDN 的虚拟主机不再需要设置 NameVirtualHost 指令
# vim httpd.conf
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "/apps/www/htdocs"
<Directory "/app/www/htdocs">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
-
注意:任意目录下的页面只有现实授权才能被访问
-
没有虚拟主机与之配对的域名是访问第一个虚拟主机
默认虚拟主机设置:
# vim httpd.conf
<VirtualHost _default_:80>
ServerName _default_
DocumentRoot "/apps/default/htdocs"
<Directory "/app/default/htdocs">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
- ssl
# yum -y install mod_ssl
# rpm -ql mod_ssl
- 毫秒级持久连接时长
# vim httpd.conf
KeepAlive on
KeepAliveTimeout 30ms
MaxKeepAliveRequests 20
- 建立httpd服务
1.1 提供两个基于名称的虚拟主机
www1.stuX.com
,页面文件目录为/web/vhosts/www1
;错误日志为/var/log/httpd/www1/error_log
,访问日志为/var/log/httpd/www1/access_log
;
www2.stuX.com
,页面文件目录为/web/vhosts/www2
;错误日志为/var/log/httpd/www2/error_log
,访问日志为/var/log/httpd/www2/access_log
;
1.2 通过www1.stuX.com/server-status
输出其状态信息,且要求只允许提供账号用户访问
1.3 www1不允许192.168.1.0/24
网络中的主机访问
- 上面的第2个虚拟主机提供
https
服务,使得用户可以通过https安全的访问此web站点
2.1 要求使用证书,证书中要求使用国家(CN), 州(Beijing), 城市(Beijing),组织为(lingyima)
2.2 设置部分为 Ops
,主机名为 www2.stux.com