首页 > 代码库 > httpd详解
httpd详解
Web:是一个由许多互相链接的超文本组成的系统,通过互联网访问。 在这个系统中,每个有用的事物,称为一样“资源”;并且由一个全局“统一资源标识符”(URI)标识;这些资源通过超文本传输协议(Hypertext Transfer Protocol)传送给用户,而后者通过点击链接来获得资源。
DARPA :
IANA:
众所周知:
0-1023:管理员才有权限,永久地分配给某应用使用;
注册端口:
1024-41951:只有一部分被注册,分配原则上非特别严格;
动态端口或私有端口: 内核分配的临时端口
41952+:
/proc/sys/net//ipv4/ip_local_port_range:定义两个数字,表示可以做为临时端口的起始数字和结束数字;定义哪个范围内的端口作为临时端口
传输层协议:TCP,UDP,SCTP,DCCP
套接字类型:
tcp socket
udp socket
raw socket
TCP协议的功能:
连接建立 :建立一个通话
将数据打包成段:
校验
确认、重传以及超时
排序
序列号
流量控制:
缓冲区:发送缓冲、接受缓冲
滑动窗口:实现流量控制 去
拥塞控制:
慢启动
拥塞避免算法
RFC:
IPC: 进程中的通信
socket:IPC的一种实现,用于同一或不同主机上的进程间的通信;
socket通信在domain中实现
识别一个socket的方法(socket地址格式)
domain:
Unix domain:基于socket机制实现同一主机不同进程间通信的一种方式:AF_UNIX,AF_LOCAL;地址是一个路径名(文件)
IPv4 domain:AF_INET,基于socket机制借助于ipv4协议实现不同主机(也可以是同一主机)上的进程间通信的机制;地址是32位的ipv4地址+16位的端口号
ipv6 domain:AF_INET6地址是128位的ipv6地址+16位的端口号;
socket的类型:
TCP:流式socket,sock_stream
可靠、双向、面向字节流
udp:数据报式socket,
相关的系统调用:
socket():创建一个新的socket。
bind():绑定于一个套接字地址上
listen():监听套接字;
accept():接收连接请求
connect():发起连接请求;
close():关闭连接
recv 接收请求 send 发送请求
read()读请求
read()和write(): recv(), send(), recvfrom(), sendto()
TCP协议通过TCP状态来标记当前处于通信过程的那个阶段。
CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED
http协议:
http: Hyper Text Transfer Protocol
传输文本:HTML
html: Hyper Text Mark Language
html文本框架
<html>
<head>
<title>TITLE</title>
</head>
<body>
<h1>H1</h1>
<p></p>
<h2>H1</h2>
<p> <a href="http://www.mamicode.com/admin.html">ToGoogle</a> </p>
</body>
</html>
css: Cascading Style Sheet层叠样式表
html文档的生成方式:
静态:
动态:编程语言编写的程序可输出html格式的结果
php,jsp,asp .net
依赖脚本解释器:
php:php解释器
jsp:jvm
http协议报文:
request:
请求不同html文档
response:
http协议:
http 0.9
http 1.0
MIME: Multipurpose Internet Mail Extesions多用途互联网邮件扩展
http 1.1
http 2.0
spdy
web服务器:
理解用户请求的资源格式不仅仅是纯html格式的文档
静态资源
动态资源:
application/php
text/html超文本
text/plain文本
web资源:
资源类型:MIME
major/minor
text/html
text/plain
image/jpeg
image/gif
vedio/mpeg4
application/vnd.ms-powerpoint
资源名称:URI 统一资源标记符
URL:统一资源定位符:描述一个特定服务器上某资源的特定位置。
http://www.magedu.com:80/download/bash-4.3.1-1.rpm
分为三部分:
scheme(方案):http://
服务器:www.mageedu.com:80
特定服务器上的资源:/download/bash-4.3.1-2.rpm
CGI:Common Gateway Interface通用网关基础
简化版的http
http事务:一次请求及对应的响应
http方法:
GET:请求获取一个资源,需要服务器发送
HEAD:跟GET近似,但其不需要服务响应请求的资源,而返回响应首部
POST:基于HTML表单向服务器提交数据,服务器常需要存储此数据;(位置,通常为关系型数据库)
PUT:与get相反,向服务器发送资源;服务器通常需要存储此资源;(位置:通常为文件系统)
DELETE:删除URL指向资源
options:探测服务器端对请求的URL所支持使用的请求方法
trace:跟一次请求中间所经过的代理服务器、防火墙或网关等
http状态码:
1xx:信息性状态码
2xx:成功状态码
200:OK
201:CRERTED
3xx:重定向类的状态码
301:moved permanently永久重定向,
302:found 临时重定向,会在相应报文中使用”location:新位置”;
304:not modified
4xx:客户端类错误
403:Forbidden请求被拒绝
404:Not Found资源不存在
405:Method Not Allowed方法不对,不允许你使用你的方法。
5xx:服务器类的错误
500:Internal Server Error服务器内部错误
502:Bad Gateway错误的网关,代理服务器从上游服务器收到一条伪相应
503:Service Unavailable服务暂时不可用
http协议:
协议首部:
name:value
例如:content-type:images/gif
分三类:
通用首部
请求首部
响应首部
http请求报文:
<method> <request-URL> <version>
请求方法-请求资源-协议版本
<HEADERS>
<entity-body>
请求实体
http响应报文:
<version> <status> <reason-phrase>
版本-状态码-原因短语
<HEADERS>
<entity-body>
相应首部
解释:
<method>:请求方法
<request-URL>: 请求的资源,可以是相对路径,如/images/log.jpg,也可以绝对路径,如http://www.magedu.com/images.banner.jpg
<version>: http协议版本,格式HTTP/<major>.<minor>,例如HTTP/1.0, HTTP/1.1
<headers>:各种所可以使用的首部
<status>: 状态码
<reason-phrase>: 原因短语,指状态码的易读信息
注意:http协议无状态,stateless
cookie:标记信息
set-cookie
http协议版本:
http 0.9: 仅用于传输html文档
http 1.0:引入MIME机制,从而支持多媒体数据;引入keep-alive(持久连接);缓存
http 1.1:更多请求方法,更精细缓存控制;持久连接(persistent);
http协议首部:
通用首部
请求首部
响应首部
实体首部
扩展首部:非标准首部,可由程序员自行创建;X-Forward-For, X-Via
通用首部:
Connection:定义c/s之间关于请求、响应的有关选项
Connection: keep-alive
Cache-Control: 缓存控制
请求首部:
Client-IP:
Host: 请求的主机
Referer: 指明了请求当前资源原始资源的URL
User-Agent: 用户代理
Accept首部:
Accept: 服务端能够发送的媒体的类型
Accept-Charset:
Accept-Encoding:
Accept-Language:
条件式请求:
跟安全相关请求:
Authorization:授权
Cookie:
响应首部:
Age:
Server: 向客户说明自己的程序名称和版本
协商首部:
vary:首部列表,服务器会根据列表中的内容挑一个最适用的版本发给客户端
跟安全相关:
www-authencation
set-cookie
实体首部:
location:资源的新位置
allow: 允许对此资源使用的请求方法
内容相关的首部;
Content-Encoding: 内容编码
Content-Language:语言
Content-Length:长度
Content-Location:
Content-Type:类型
缓存相关:
etag
expires
last-modified
一次web资源请求的具体过程(服务器角度):
建立连接
接收请求
处理请求
访问资源
构建响应
发送响应
记录日志
连接:
连接套接字:(client, cport <--> server, sport)
监听套接字:80端口
web服务器的I/O结构:
单进程模型:串行
多进程模型:每个进程响应一个用户请求实现并发的效果
复用的I/O机制:一个进程生成多个线程,每个线程响应一个用户请求
复用的I/O机制:多个线程,每个线程响应多个用户请求;
web server:
httpd
nginx
lighttpd
gws
App Server:
IIS
tomcat, jetty, resin
weblogic
websphere
httpd:
ASF: Apache Software Fundation
httpd,
a patchy server = apache
httpd,
httpd的特性:
高度模块化:core + modules
DSO:Dynamic Shared Object支持共享加载机制
MPM:Multipath Processing Module多道处理模块
统称,事实上又多个实现;
prefork:每个进程响应一个用户请求,预先生成多个空闲进程;
select():1024
worker:启动多个进程,每个进程生成多个线程,每个线程响应一个用户请求;
event:启动多个线程,每个线程响应N个请求;
event-driven:事件驱动
httpd的功能特性:
丰富用户认证:基本认证和摘要认证
CGI:通用网关接口 原生支持perl CGI
虚拟主机:
基于端口、ip、主机名
反向代理:
负载均衡
用户站点:
路径别名:
第三方模块:
安装方式:
rpm包
源码编译
centos 6:httpd
配置文件:
/etc/httpd/conf.d/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
模块目录:
/etc/httpd/modules: 链接文件
/usr/lib64/httpd/modules
主程序:
/usr/sbin/httpd: prefork
/usr/sbin/httpd.event: event
/usr/sbin/httpd.worker: worker
日志文件目录:
/var/log/httpd
access_log: 访问日志
error_log: 错误日志
站点文档根目录:
/var/www/html/images/a.jpg
http://www.magedu.com/images/a.jpg
httpd的配置文件说明:
# grep "Section" httpd.conf
### Section 1: Global Environment
### Section 2: ‘Main‘ server configuration
### Section 3: Virtual Hosts
主服务器的配置
虚拟主机配置
主服务器和虚拟主机一般不同时使用,默认仅启用了主服务器;
指令参数:不区分字符大小写,但其值有可能会区分大小写
1、持久连接
KeepAlive {On|Off}
MaxKeepAliveRequests 100
KeepAliveTimeout 15
2、MPM参数:
<IfModule prefork.c> 多进程模式
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
<IfModule worker.c>多线性模式
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
启动多少空闲进程
所允许最大并发请求用户
最小空闲线性进程
最大空闲线性进程
每个子进程可以生成多少线性
每个线性可以处理多少个进程
event:事件驱动模型
指定监听的地址和端口
listen [ip:]ro
listen 80
listen 8080
.....
此指令可重复指定多次
4、dso机制指定装载的模块
显示:
#httpd -D DUMP_MODULES
LoadModule Module_Name /path/to/Module_File
“格式 模块名称 模块路径名字”
5指定站点跟目录:网页存放位置
documentroot “/path/to/somewhere"
6、站点路径访问控制
基于本地文件系统路径
<directoty "/path/to/somewhere">
</directory>
基于URL访问路径做访问控制
<Location "/path/to/URL">
</Location>
7、于Directory中可用的访问控制
(1)options :定义访问选项
indexes:当访问的路径下无默认的主页面,将所有资源以列表形式呈现给用户;危险,慎用;
followsymlinks:跳跃符合链接
(2)allowoverride
支持在每个页面目录下创建,htaccess用于实现对此目录中资源访问时的访问控制功能
8、order基于ip做访问控制
order allow,deny(拒绝)
allow from all
deny from172.16.100.17拒绝
allow from172.0.0/16允许访问
from后面能接受的地址格式
IP, Network Address
网络地址格式较为灵活:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
9、定义默认的主页面
directoryindex
10、配置日志功能
日志级别:LogLevel {debug|info|notice|warn|error|crit|alert|emerg}
日志格式 LogFormat
访问日志CustomLog "/path/to/access_log" LogFormat_Name
指定错误日志 ErrorLog "/path/to/error_log"
自定义日志格式名称
logformat日志格式
%h:客户端地址;
%l:远程登录名,
%u:认证时输入的用户名,没有认证时为-
%t:服务器收到 用户请求时的时间
%r:请求报名的起始行;
%>s:响应状态码;
%b:响应报文的长度,单位是字节
%{header_name}i:记录指定首部对应的值
11、路径别名
站点根目录:/www/html
http://www.magedu.com/images/logo/new.gif
此文件位置:/www/html/images/logo/new.gif
实现URL路径的映射,从而所访问的资源不再依赖于站点根目录;
Alias /URL/ "/path/to/somewhere/"
12、设定默认字符集
字符集:GB2312,GB18030,GBK
13、CGI脚本 通用网关接口
CGI脚本路径别名
/var/www/cgi-bin
http://server/cgi-bin/
base写CGI脚本
所有文本都使用命令输出:echo,printf,cat
执行程序;命令引用
Content-Type: text/html
<pre>
</pre>
fastCGI:快速CGI协议
14、基于用户访问控制
用户认证:
基本认证:basic
摘要认证:digest
虚拟用户:仅用于访问某服务或获取某资源的凭证;
文本文件:.htpasswd账号是明文,密码是加密的
sql数据库中:
dbm:数据库引擎。提供API。 将用户账号密码
ldap;轻量级服务访问协议
authentication provider:账号和密码存储机制;
authorization provider: 授权
案例:基於文件做訪問控制
1) 基于用户进行认证
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "Admin Area."
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
Require valid-user: 文件中所有用户均可访问
Require user USERNAME, ...
2)提供認證文件
htpasswd
-C:如果此文件事先不存在,则创建;注意,只能在创建第一个用户使用。
-m:以md5的格式编码存储用户的密码信息
-D:删除指定用户
3)組認證
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "Admin Area."
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GROUP_NAME
</Directory>
组名:user1 user2 user3
15、虚拟主机
一个站点提供多个
虚拟主机:使用不同访问路径
基于端口
基于ip
基于主机名
1) 使用虚拟的前提:取消主服务器
注释主服务器的站点根路径指定:documentroot
2)定义虚拟主机
NameVirtualHost IP:PORT
<VirtualHost IP:PORT>
ServerName
DocumentRoot
ServerAlias
ErrorLog
CustomLog
</VirtualHost>
配置文件语法检查:
httpd -t
service httpd configtest
配置示例:
<VirtualHost 172.16.100.7:80>
ServerName www.mageedu.com
DocumentRoot "/web/hosta"
</VirtualHost>
<VirtualHost 172.16.100.8:80>
ServerName www.mageedu.com
DocumentRoot "/web/hostb"
</VirtualHost>
<VirtualHost 172.16.100.8:8080>
ServerName www.mageedu.com
DocumentRoot "/web/hostc"
</VirtualHost>
测试:elinks
-dump:获取到页面数据后直接退出进程
16、https协议
ssl(安全的套接字层),tls(传输层安全)
http协议:文本编码 明文 不安全
验证:使用telnet发请求
# telnet 172.16.100.7 80
Trying 172.16.100.7...
Connected to 172.16.100.7.
Escape character is ‘^]‘.
GET /index.html HTTP/1.0
Host: www.b.org
HTTP/1.1 200 OK
Date: Fri, 08 Aug 2014 03:03:51 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 08 Aug 2014 02:14:52 GMT
ETag: "e0009-12-50014c53e753f"
Accept-Ranges: bytes
Content-Length: 18
Connection: close
Content-Type: text/html; charset=UTF-8
<h1> Host B </h1>
Connection closed by foreign host.
httpd:ssl
ssl模块
单独成包
ssl会话基于IP地址创建,所以,每一个IP仅创建一个SSL会话;
ssl握手要完成的工作;
交换协议版本号
选择双方都支持的加密方式
客户端对服务器端实现身份验证
秘钥交换
https协议:基于ssl二进制编码,443/tcp
openssl s_client
客户端验证服务器端证书:
有效性检测:证书是否仍然在有效期内
ca的可信度检测
证书的完整性检查;
持有者的身份检查
配置httpd工作于https:
1、安装mod_ssl模块
# yum install mod_ssl
2、为服务器端生成私钥,并为其提供证书;
# mkdir /etc/httpd/ssl && cd /etc/httpd/ssl
# (umask 077; openssl genrsa -out httpd.key 1024)
# openssl req -new -key httpd.key -out httpd.csr
签署后的证书为:/etc/httpd/ssl/httpd.crt
3、配置使用https的虚拟主机;
SSLCertificateFile
SSLCertificateKeyFile
<VirtualHost IP:443>
DocumentRoot
ServerName
</VirtualHost>
4、重新装载配置
5、测试
# openssl s_client -connect IP:PORT -CAfile /path/to/ca_certificate
17、status页面
httpd内嵌有handler,其中有一个handler用于输出当前httpd服务相关状态信息
handler:server-status
启用handler要使用sethandler指令
18、访问属性配置总结
<Directory [~] "">
</Directory>
<File [~] "">
</File>
配置URL访问路径:
<Location [~] "">
</Location>
<LocationMatch "">
</LocationMatch>
/var/www/html/
images/
19、curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
curl的常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义头信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
20、使用mod_deflate模块压缩页面优化传输速度
SetOutputFilter DEFLATE
# mod_deflate 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/css
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/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
21、httpd程序包自带的工具介绍
httpd:
Apache服务器程序
-t:测试配置文件
-l:列表静态模块
-D:DUMP_MODULES:列出DSO模块
-M:
-D DUMP_VHOSTS: 列出所有虚拟主机
htpasswd:
为基于文件的basic认证创建和更新用户认证文件
apachectl:
脚本,httpd服务控制工具;
ab: apache benchmark
httpd的基准性能测试工具;
apxs:
httpd得以扩展使用第三方模块的工具;
htcacheclean:
磁盘缓存清理工具;
htdigest:
为digest认证创建和更新用户认证文件
httxt2dbm:
为rewrite map创建dbm格式的文件
rotatelogs:
不关闭httpd而切换其使用日志文件的工具
access_log, access_log.1, access_log.2,
suexec:
User apache
Group apache
当httpd进程需要以另外的用户的身份去访问某些资源时,可以以suexec作临时切换;
22、ab工具的初步使用
同类工具:http_load, webbench, seige
Usage: ab [options] [http[s]://]hostname[:port]/path
-c #: 模拟的并发数;
-n #: 总的请求数
-n的值一定要大于等于-c的值;
23、资源限定
软限定:可临时超出一定时长的上限
硬限定:绝对不可以超出上限
管理员可使用ulimit命令临时性的修改各种资源的软限制;
ulimit -n #:能同时打开文件数
-u #:能同时启动的进程数
配置文件:
/etc/security/limits.conf
/etc/security/limits.d/*.conf
24、编译安装httpd-2.4
httpd-2.0, httpd-2.2, httpd-2.4
httpd程序依赖于apr和apr-util
apr: apache portable runtime
httpd-2.4的新特性:
1)MPM支持在运行时装载;
--enable-mpms-shared=all --with-mpm={prefork|worker|event}
2)支持event mpm
3)异步读写
4)在每模块及每目录分别使用不同的日志级别
5)每请求的配置;<If>,<Elseif>
6)增强版的表达式分析器
7)毫秒级的keep alive的timeout
8)基于FQDN的虚拟主机不再需要NameVirtualHost指令;
9)支持用户使用自定义变量
新增了一些模块:mod_proxy_fcgi, mode_ratelimit, mod_request, mod_remoteip
修改了一些配置机制:
不再支持使用order, allow, deny定义基于ip的访问控制;改为require
编译安装httpd-2.4
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-mpms-shared=all --with-mpm=event --enable-modules=most
# make && make install
基于IP做访问控制:
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
控制某特定主机的访问:
Require ip IPADDR
Require not ip IPADDR
IPADDR:
单个ip
Network/Netmask:
Network/Length: 172.16.0.0/16
Net: 172.16
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME:
FQDN:具体的主机
DOMAIN: 域内的所有主机
本文出自 “正则表达式” 博客,请务必保留此出处http://hhxxb.blog.51cto.com/9152570/1538290