
正文
httpd2.2
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
httpd -t:检查httpd配置文件/etc/httpd/conf/httpd.conf的语法错误
请求报文语法 | |
<method> <request-URL> <version> | 资源获取方法,资源是什么,http协议版本号 |
<headers> | 请求报文首部 |
空行 | |
<entity-body> | 报文主体 |
GET / HTTP/1.1 | 起始行 /代表主页 headers域 |
method:请求方法,标明客户端希望服务器对资源执行的动作
GET:从服务器获取资源
HEAD:只从服务器获取文档的响应首部,就是除了报文主体部分。没有报文主体
POST:向服务器发送要处理的数据。报文主体有数据
PUT:将请求的主体部分存储在服务器上,就是上传数据。报文主体有数据
DELETE:请求删除服务器上的文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的方法
version:HTTP/major.minor版本号
响应报文语法 | |
<version> <status> <reason-phrase> | 响应协议版本号,状态码,状态码解释 |
<headers> | 响应报文首部 |
空行 | |
<entity-body> | 报文主体 |
HTTP/1.1 200 OK | 起始行 -------header域 |
status | |
1xx | 纯信息100-101 |
2xx | 成功类的信息200-206 200:请求的所有数据通过响应报文的主体部分发送。"OK" |
3xx | 重定向类信息300-305 301:请求的URL指向资源已被删除,单在响应报文中通过首部Location指明了资源现在所处的新位置,即永久重定向"Moved Permanently" 302:与301相似,只不过是临时指向到新位置,即临时重定向"Found" 304:客户端发出请求,但服务器上的资源未曾发生改变,则通过响应304通知客户端,即无改变"Not Modified" |
4xx | 客户端错误信息400-415 401:需要输入账号和密码,认证后才能访问。"Unauthorized" 403:请求被禁止。"Forbidden" 404:服务器无法找到客户端请求的资源。"Not Found" |
5xx | 服务端错误信息500-505 500:服务器内部错误。"Internal Server Error" 502:代理服务器从后端服务器收到一条伪响应。"Bad Gateway" |
head | |
通用首部 | Date:报文创建时间 Connection:连接状态,如keep-alive,close Via:显示报文经过的中间节点 Cache-Control:控制缓存 |
请求首部 | Accept:通知服务器能接收的媒体类型 Accept-Charset:通知服务器能接收的字符 Accept-Encoding:通知服务器能接收的编码格式 Accept-Language:能接收的语言 Client-IP:客户端ip Host:请求的服务器名称和端口号 Referer:从哪个页面跳转 User-Agent:浏览器类型 |
条件请求首部 | Expect If-Modified-Since:自从指定时候后,请求的资源是否发生过修改。缓存请求 If-Unmodified-Since:同上,是否没变过 If-None-Match:本地缓存中存储文件的Etag标签是否与服务器文档的Etag不匹配 If-Match:同上,是否匹配 |
安全请求首部 | Authorization:向服务器发送认证信息,如账号密码 Cookie:客户端向服务器段发送Cookie Cookie2:第二版的 |
代理请求首部 | Proxy-Authorization:向代理服务器认证 |
响应首部 | Age:响应持续时长 Server:服务器软件名称和版本 |
协商首部 | Accept-Ranges:服务器可接受的请求范围类型 Vary:服务器查看的其他首部列表 |
安全响应首部 | Set-Cookie:向客户端设置Cookie Set-Cookie2:第二版的 www-Authenticate:来自服务器的对客户端的质询认证表单 |
内容首部 | Allow:列出对此资源可使用的请求方法 Location:告诉客户端真正内容位于何处 Content-Encoding:内容编码格式 Content-Language:内容语言 Content-Length:内容的长度 Content-Location:内容真正位置 Content-Type:内容的类型 |
缓存相关 | Etag:内容扩展标签 Expires:内容过期时间 Last-Modified:内容最后一次修改时间 |
Web服务器处理并发连接请求的架构方式
1、单线程web服务器(Single-threaded web servers)
一个进程处理用户请求,一次处理一个
此种架构方式中,web服务器一次处理一个请求,结束后读取并处理下一个请求。在某请求处理过程中,其它所有的请求将被忽略,因此,在并发请求较多的场景中将会出现严重的必能问题。
2、多进程/多线程web服务器
启用多个进程,每个进程处理一个请求
此种架构方式中,web服务器生成多个进程或线程并行处理多个用户请求,进程或线程可以按需或事先生成。有的web服务器应用程序为每个用户请求生成一个单独的进程或线程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程或线程将会消耗大量的系统资源。
3、I/O多路复用web服务器
一个进程生成多个N个线程,每个线程响应一个请求
为了能够支持更多的并发用户请求,越来越多的web服务器正在采用多种复用的架构——同步监控所有的连接请求的活动状态,当一个连接的状态发生改变时(如数据准备完毕或发生某错误),将为其执行一系列特定操作;在操作完成后,此连接将重新变回暂时的稳定态并返回至打开的连接列表中,直到下一次的状态改变。由于其多路复用的特性,进程或线程不会被空闲的连接所占用,因而可以提供高效的工作模式。
4、多路复用多线程web服务器
启用多个进程,每个进程响应N个请求
将多进程和多路复用的功能结合起来形成的web服务器架构,其避免了让一个进程服务于过多的用户请求,并能充分利用多CPU主机所提供的计算能力。
MPM:多道处理模块
1.prefork:一个请求用一个进程响应
一个主进程负责生成n个子进程,主进程不负责处理请求,子进程也称为工作进程,每个子进程处理一个用户请求,即便没有用户请求,也会预先生成多个空进程,随时等待请求。最大不超过1024个

2.worker:一个请求用一个线程响应
一个主进程生成n个子进程,子进程生成多个线程,每个线程对应一个请求

3.event:一个进程响应多个请求
类似于worker模型,但是会独有管理长连接的线程

I/O模型
blocking IO:阻塞式IO
noblcoking IO:非阻塞式IO
IO multiplexing:复用型IO
signal driven IO:事件驱动型IO
asynchronous IO:异步IO
程序环境
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件:
/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd 默认prefork模型
/usr/sbin/httpd.event event模型
/usr/sbin/httpd.worker worker模型
日志文件目录:
/var/log/httpd/
/var/log/httpd/access_log 访问日志
/var/log/httpd/error_log 错误日志
站点文档目录:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
/etc/httpd/modules 这个链接到上面
★httpd启动脚本配置文件
[root@localhost conf]# cat /etc/sysconfig/httpd# Configuration file for the httpd service.## The default processing model (MPM) is the process-based# 'prefork' model. A thread-based model, 'worker', is also# available, but does not work with some modules (such as PHP).# The service must be stopped before changing this variable.##HTTPD=/usr/sbin/httpd.worker 这里可以更改模型[root@localhost conf]# httpd -l 可以查看当前httpd可以支持的模型,缺少的话可以用rpm安装Compiled in modules: core.c prefork.c http_core.c mod_so.c
★httpd配置文件/etc/httpd/conf/httpd.conf,分为三个部分,全局、主、虚拟,主和虚拟不能同时配置
♦第一段:全局配置Section 1: Global Environment
指令:字符 指令不区分大小写,字符区分大小写ServerTokens OS: 显示一些主机的信息,有几个选项,分别代表显示信息的多少ServerRoot "/etc/httpd": 服务器根目录PidFile run/httpd.pid: pid号码,run代表根目录Timeout 60: 三次握手超时时间KeepAlive Off:长链接MaxKeepAliveRequests 100:最大长链接限制KeepAliveTimeout 15:长链接超时时间<IfModule prefork.c>假如使用prefork模块StartServers 8服务器刚启动就要起动8个进程MinSpareServers 5 最少空闲进程5个MaxSpareServers 20 最大空闲进程20个ServerLimit 256 服务器上限值,针对MaxClientsMaxClients 256 最大客户端数MaxRequestsPerChild 4000 一个进程最多响应4000次</IfModule><IfModule worker.c> 假如使用worker模型StartServers 4MaxClients 300 最大客户端数MinSpareThreads 25 最小空闲线程MaxSpareThreads 75 最大空闲线程ThreadsPerChild 25 一个进程可以生成多少个线程MaxRequestsPerChild 0 一个进程最多响应</IfModule>#Listen 12.34.56.78:80指定监听地址和端口Listen 80 如不指定代表监听主机上所有地址的80端口Listen 8080 可以同时监听多个端口# LoadModule foo_module modules/mod_foo.so指定装载模块#LoadModule auth_basic_module modules/mod_auth_basic.soLoadModule auth_digest_module modules/mod_auth_digest.soInclude conf.d/*.conf 包含conf.d/下所有.conf文件User apacheroot启动httpd服务之后由哪个用户接管httpd服务Group apache
♦第二段:中心主机配置Section 2: 'Main' server configuration
ServerAdmin root@localhost ##服务器管理员,邮箱地址#ServerName www.example.com:80 ##服务器名字,默认没有启用,如果启动httpd时报错,无法解析本地ip地址,可以在host文件中自定义解析UseCanonicalName OffDocumentRoot "/var/www/html"##文档根目录,就是网页的存放路径<Directory "/var/www/html">##限制/var/www/html目录的容器#options选项:生产环境中要做到都不启用#ALL:支持所有选项#NONE:不支持所有选项#Indexes:是否允许索引目录,如果没有首页时,是否把这个目录里面的文件都列出来#Includes:允许执行服务器端包含SSI文件#FollowSymLinks:允许访问符号链接,就是跳转页面#SymLinksifOwnerMatch:如果属主和符号链接的属主匹配才允许执行符号链接#ExecCGI:是否允许执行CGI脚本#MultiViews:多视图Options Indexes FollowSymLinks##默认启用这两个选项AllowOverride None##是否允许覆盖,覆盖掉下面Order的选项。#AllowOverride AuthConfig 覆盖掉下面Order选项,基于认证访问#AuthType Basic 认证类型基本认证类型 #AuthName “aaaaa” 这段话将出现输密码的地方#AuthUserFile “路径” 基于哪个文件作为用户认证文件#AuthGroupFile “路径” 基于哪个文件作为组认证文件#Require group|user|valid-user users 可以让哪些用户或者组的人访问,valid-user代表有效的用户都可以访问 Order allow,deny##allow和deny可以更改顺序,先后匹配的关系。用于定义基于主机的访问功能,ip、网络地址或主机定义访问控制机制 Allow from all##允许所有 Deny from all##拒绝所有。两个all同时使用就要看Order选项,哪个在后面,哪个生效#允许,拒绝可以从下面几个方面选择#IP:#network/netmask:#HOSTNAME:www.a.com#DOMAINNAME:a.com#Partial IP:10.10 = 10.10.0.0/16</Directory><Directory /> Options FollowSymLinks AllowOverride None</Directory><IfModule mod_userdir.c>#是否允许用户创建家目录网页 UserDir disabled#默认为不允许 #UserDir public_html#如果开放的话,需要用户在自己家目录下创建/public_html目录,在此目录下创建网页。访问http://域名/~用户名/public_html</IfModule>#<Directory /home/*/public_html>这一段是针对允许用户创建家目录时的限制# AllowOverride FileInfo AuthConfig Limit# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec# <Limit GET POST OPTIONS># Order allow,deny# Allow from all# </Limit># <LimitExcept GET POST OPTIONS># Order deny,allow# Deny from all# </LimitExcept>#</Directory>DirectoryIndex index.html index.html.var ##当没有指定访问那个页面时,指向这两个路径AccessFileName .htaccess##每目录的访问权限,生产环境不用<Files ~ "^\.ht">##文件容器,这段定义的是以.ht开头的文件,都不允许访问 Order allow,deny Deny from all Satisfy All</Files>TypesConfig /etc/mime.types#支持传输哪些非二进制文件DefaultType text/plain#默认传输文本<IfModule mod_mime_magic.c># MIMEMagicFile /usr/share/magic.mime MIMEMagicFile conf/magic</IfModule>HostnameLookups Off#记录日志时,是否把ip转换成主机名,浪费资源#EnableMMAP off#EnableSendfile offErrorLog logs/error_log#错误日志存放路径LogLevel warn#日志级别LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" commonLogFormat "%{Referer}i -> %U" refererLogFormat "%{User-agent}i" agent#这些都是日志记录的格式,每一行末尾都是一个名词,分别代表以什么形式存储日志#%h:远程主机%l:远程主机的登录名称%u:登录网站时用户%t:日志产生时间%r:请求报文第一行#%>s:最后一次请求的状态码%b:响应报文大小%{Referer}i:从哪个页面跳转#%{User-Agent}i:浏览器类型#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio#CustomLog logs/access_log common#CustomLog logs/referer_log referer#CustomLog logs/agent_log agentCustomLog logs/access_log combined#这个就是以什么形式记录访问日志ServerSignature OnAlias /icons/ "/var/www/icons/"#路径别名,可以写别的地方的路径,别名和路径后面的斜线同时有或没有<Directory "/var/www/icons"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all</Directory>
♦第三段:虚拟主机配置Section 3: Virtual Hosts,虚拟主机不能与中心主机同时使用,要在第二段注释掉DocumentRoot "/var/www/html"
# VirtualHost: If you want to maintain multiple domains/hostnames on your# machine you can setup VirtualHost containers for them. Most configurations# use only name-based virtual hosts so the server doesn't need to worry about# IP addresses. This is indicated by the asterisks in the directives below.## Please see the documentation at# <URL:http://httpd.apache.org/docs/2.2/vhosts/># for further details before you try to setup virtual hosts.## You may use the command line option '-S' to verify your virtual host# configuration.## Use name-based virtual hosting.##NameVirtualHost *:80## NOTE: NameVirtualHost cannot be used without a port specifier# (e.g. :80) if mod_ssl is being used, due to the nature of the# SSL protocol.### VirtualHost example:# Almost any Apache directive may go into a VirtualHost container.# The first VirtualHost section is used for requests without a known# server name.##<VirtualHost *:80># ServerAdmin webmaster@dummy-host.example.com# DocumentRoot /www/docs/dummy-host.example.com# ServerName dummy-host.example.com# ErrorLog logs/dummy-host.example.com-error_log# CustomLog logs/dummy-host.example.com-access_log common#</VirtualHost>
常用配置(httpd.conf):指令 字符 指令不区分大小写,字符为路径时取决于文件
1.修改监听的ip和port
Listen [ip:]port。省略ip表示监听本机所有ip,listen可重复出现多次。
2.长连接
KeepAlive On | Off 是否打开长连接
MaxKeepAliveRequests # 单个最大长链接限制
KeepAliveTimeout # 长连接超时时间
3.查看正在使用的模块
ps aux | grep httpd,默认为/usr/sbin/httpd,为prefork模型
4.查看模块列表
httpd -l:静态编译模块
httpd -M:静态和动态装载的模块
5.更换httpd模型
编辑/etc/sysconfig/httpd,替换httpd=****.worker | event
6.prefork模型
<IfModule prefork.c>假如使用prefork模块StartServers 8服务器刚启动就要起动8个进程MinSpareServers 5 最少空闲进程5个MaxSpareServers 20 最大空闲进程20个(大批量进,大批量出)ServerLimit 256 服务器上限值,针对MaxClientsMaxClients 256 最大客户端数MaxRequestsPerChild 4000 一个进程最多响应4000次</IfModule>
7.worker模型
<IfModule worker.c> 假如使用worker模型 StartServers 4 开始启用4个进程MaxClients 300 最大客户端数 MinSpareThreads 25 最小空闲线程 MaxSpareThreads 75 最大空闲线程 ThreadsPerChild 25 一个进程可以生成多少个线程 MaxRequestsPerChild 0 一个进程最多响应 </IfModule>
8.DSO(动态共享库)
LoadModule <mod_name> <mod_path>:模块加载,模块路径可使用相对地址,相对于ServerRoot(/etc/httpd)
9.网站文档存放路径
DocumentRoot “/var/www/html”
10.站点访问控制:可以基于ip,账号控制
文件系统路径:
<Directory " "> </Directory>
<File " "> </File>
URL路径:
<Location " "> </Location>
11.Directory访问控制
options
indexes:当没有定义主页时,是否将网站内所有的东西以目录展示。尽量不启用
FollowSymlinks:当目录内存在链接时,是否允许访问这个文件
SymLinksifOwnerMatch:如果链接到的文件属主匹配时,允许访问
None:都不启用
AllowOverride
None:这个代表是否允许覆盖针对每目录的具体配置,消耗资源,不启用
Order:基于ip的检查顺序
order allow,deny:白名单
order deny,allow:黑名单
allow from 192.168.1.1
deny from 192.168.0.0/24
12.定义默认主页面
DirectoryIndex index.html index.htm 从左到右匹配
13.日志设定
ErrorLog logs/error_log :错误位于/var/log/httpd下
LogLevel warn :日志级别,比warn高的级别都记录
CustomLog logs/access_log combined:访问日志,combined代表格式
LogFormat “ ********** ” combined :代表这种日志具体记录什么
%h:客户端ip地址
%l:远程登录名,-表示没有
%u:用户认证名,-表示没有
%t:服务器端收到请求时的时间
%r:请求报文首行信息
%>s:响应状态码
%b:响应报文的大小,单位字节,不包括首部
%{Referer}i:从哪个页面跳转过来的
%{User-Agent}i:发出请求用到的应用程序。(浏览器)
其他在Apache官方文档
14.路径别名
Alias /URL/ "/PATH/TO/SOMEDIR":前面要是文件,后面也得是文件。前面要是目录,后面也得是目录
15.设定默认字符集
AddDefaultCharset UTF-8
16.基于用户的访问控制
认证质询:www-authenticate,响应吗为401,拒绝客户端请求,并说明要求客户端提供账号和密码。
认证:authorization,客户端用户填入账号和密码后再次发送请求报文,认证通过,则服务器发送响应的资源
安全域:需要用户认证号方能访问的路径
basic认证:
(1)基于用户进行认证
<Directory " ">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "密码文件"
Require user user1 user2 :这个文件中允许哪些用户登录
(Require valid-user 允许所有用户登录)
</Directory>
(2)提供账号和密码存储文件
htpasswd [options] passwordfile username:命令添加用户。
-b:在命令行中直接指定用户密码
-c 路径:指定密码文件存储路径,只有第一次用到
-m:采用md5方式加密密码
-s:采用SHA方式加密密码
-D:删除用户
(3)基于组进行认证
<Directory " ">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "密码文件"
AuthGroupFile “组存放路径”
Require group group1 group2
</Directory>
组文件格式:每一行定义一个组 组名:user1 user2
17.虚拟主机,三种实现方案
基于ip,port,hostname。虚拟主机和中心主机不能同时使用,需要注释DocumentRoot
基于IP,HOST写法
<VirtualHost 10.10.1.1:80> ServerName www.a.com DocumentRoot "/www/a"#这个目录要存在并且有文件</VirtualHost><VirtualHost 10.10.1.2:80> ServerName www.b.com DocumentRoot "/www/b"#这个目录要存在并且有文件</VirtualHost>
基于端口,HOST写法
<VirtualHost 10.10.1.1:80> ServerName www.a.com DocumentRoot "/www/a"#这个目录要存在并且有文件</VirtualHost><VirtualHost 10.10.1.1:8080> #监听8080端口要在主配置文件中填写Listen 8080 ServerName www.b.com DocumentRoot "/www/b"#这个目录要存在并且有文件</VirtualHost>
基于主机名,HOST写法
NameVirtualHost 10.1.1.1:80 #启用虚拟主机,<VirtualHost 10.10.1.1:80> ServerName www.a.com DocumentRoot "/www/a"#这个目录要存在并且有文件</VirtualHost><VirtualHost 10.10.1.1:80> ServerName www.b.com DocumentRoot "/www/"#这个目录要存在并且有文件</VirtualHost>
18.内置status页面,就是网页显示服务器状态,启用下面这项
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 1.1.1.1
</Location>
19.使用mod_deflate模块压缩页面优化传输速度
节约带宽,消耗资源,老版本浏览器不支持,适合压缩的资源为文件
SetOutputFilter DEFLATE 开启压缩功能
20.https
SSL会话建立的过程(SSL会话基于IP地址,所有单IP主机上只能使用一个https主机)
(1)客户端发送可供选择的加密方式,并向服务器请求证书
(2)服务器端发送证书以及选定的加密方式给客户端
(3)证书验证
(a)验证证书来源的合法性,用CA的公钥解密证书上的数字签名
(b)验证证书内容的合法性
(c)检查证书的有效期
(d)检查证书是否被吊销
(e)证书中拥有者的名字应该与目标主机要一致
(4)客户端生成临时会话秘钥(对称秘钥),并使用服务器端的公钥加密此数据发送给服务器,完成秘钥交换
(5)服务器用此秘钥加密用户请求的资源,响应给客户端
21.配置httpd支持https
(1)为服务器申请数字证书
(2)配置httpd支持使用ssl,及使用的证书
首相将ssl模块安装好[root@localhost httpd]# yum install mod_ssl -y之后去编辑ssl的配置文件[root@localhost httpd]# cat conf.d/ssl.conf | grep -v "^# .*"Listen 443 https #监听端口SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialogSSLSessionCache shmcb:/run/httpd/sslcache(512000)SSLSessionCacheTimeout 300SSLRandomSeed startup file:/dev/urandom 256SSLRandomSeed connect builtin#SSLRandomSeed startup file:/dev/random 512#SSLRandomSeed connect file:/dev/random 512#SSLRandomSeed connect file:/dev/urandom 512SSLCryptoDevice builtin#SSLCryptoDevice ubsec<VirtualHost _default_:443>#DocumentRoot "/var/www/html" #这里需要取消注释,将主页设置好#ServerName www.example.com:443 #主机名也要设置ErrorLog logs/ssl_error_logTransferLog logs/ssl_access_log #传输日志LogLevel warnSSLEngine on #开启SSL功能SSLProtocol all -SSLv2 -SSLv3 #支持哪些协议版本SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA #支持哪些加密方式#SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5#SSLHonorCipherOrder onSSLCertificateFile /etc/pki/tls/certs/localhost.crt #证书文件SSLCertificateKeyFile /etc/pki/tls/private/localhost.key #与上面证书匹配的私钥#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt#SSLVerifyClient require #是否验证客户端证书#SSLVerifyDepth 10#<Location />#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \#</Location>#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire<Files ~ "\.(cgi|shtml|phtml|php3?)$"> SSLOptions +StdEnvVars</Files><Directory "/var/www/cgi-bin"> SSLOptions +StdEnvVars</Directory>BrowserMatch "MSIE [2-5]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"</VirtualHost>
(3)测试基于https访问相应的主机





