本文旨在复习httpd2.2常用配置。复习http协议相关知识、httpd2.2配置文件相关配置介绍、配置httpd的身份验证、配置httpd虚拟主机 等等。
知识储备:
http协议知多少?
http协议:
HTTP:hyper text transfer protocol,超文本传输协议,是互联网上应用最为广泛的一种网络协议。HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准。通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到 请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
http协议版本:
http/0.9:原型版本,功能简陋
http/1.0: cache,MIME,method
MIME:Multipurpose Internet Mail Extension
method(请求方法):GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS
http/1.1: 增强了缓存功能
http/2.0:
http工作模式:
HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则 在那个端口监听客户端的请求。一旦收到 请求,服务器会向客户端返回一个状态
http请求报文:http request
http响应报文:http response
简单来来说 一次http事务就是:请求<-->响应
web资源:web resource
静态资源:无需服务端做出额外处理。如:.jpg, .png, .gif, .html, .txt, .js,.css, .mp3,.avi 等。
动态资源:服务端需要通过执行程序做出处理, 发送给客户端的是程序的运行结果。
如 .php,.jsp
注意:一个页面中展示的资源可能有多个,每个资源都需要单独处理。
资源标识:URL 统一资源标识符
Uniform Resource Locator:用于描述服务器特定资源的位置
例如: http://www.sina.com.cn/index.html
Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
一次完整的http请求处理过程:
(1)建立或者处理连接;接收或者拒绝请求
(2)接收请求;接收来自互联网上的主机请求报文中对某特定资源的一次请求过程。
(3)处理请求;对请求资源进行解析,获取客户端的请求资源及请求方法。
(4)访问资源:通过存储IO获取用户的请求的资源。
(5)构建响应报文
(6)发送响应报文
(7)记录日志
并发访问响应模型:
单进程I/O模型:启动一个进程处理用户请求;一次只能处理一个请求,多个请求被串行响应。
多进程I/O模型:并行启动多个进程,每个进程响应一个请求。
复用I/O模型:一个进程响应n个请求。
多线程模式:一个进程生成n个线程,一个线程处理一个请求。
事件驱动(event-driven):一个进程直接处理n个请求。
复用的多进程I/O模型:启动多个(m)进程,每个进程生成(n)个线程。
http协议实现:
静态服务器技术:httpd(apache),nginx,lighttpd ...
应用程序服务器:动态服务器技术,IIS: .net 、tomcat:.jsp
httpd测程序版本:
httpd 1.3:官方已经停止维护
httpd 2.0:
httpd 2.2:MPM不支持DSO机制
httpd 2.4:目前最新稳定版:支持DSO
CentOS6.7中httpd-2.2配置详解
1.httpd的相关功能
CGI:Common Gateway Interface
虚拟主机:IP,PORT, FQDN
反向代理
负载均衡:bytraffic,bybusiness,byrequest
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块
......
2.httpd的特性
高度模块化:core+modules
DSO:dynamic shared object 动态共享对象
MPM:Multipath processing Modules (多路处理模块)
prefork:多进程模型。一个主进程,多个子进程。每个进程响应一个请求;
主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给
某子进程进行处理;
n个子进程:每个子进程处理一个请求。
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲.
worker:多进程多线程模型,一个线程响应一个用户请求;
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程
进行处理;
多个子进程:每个子进程负责生成多个线程;
每个线程:负责响应用户请求;
并发数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量;
event:事件驱动模型,多进程模型,每个进程响应多个请求;
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进
行处理
子进程:基于事件驱动机制直接响应多个请求;
httpd-2.2: 仍为测试使用模型;
httpd-2.4:event可生产环境中使用;
3.centos6: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
/ust/sbin/httpd.worker
日志文件:
/var/log/httpd:
access_log:访问日志
error_log:错误日志
站点目录:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
服务控制和启动:
chkconfig httpd on|off
service httpd {start|stop|restart|status|configtest|reload}
4.httpd配置文件介绍
4.1 主配置文件:/etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
4.2 修改监听的服务端口
Listen [IP:]PORT
(1) 省略IP表示为0.0.0.0
(2)Listen指令可重复出现多次;
Listen 80 Listen 8080
(3)修改监听socket,重启服务进程方可生效;
4.3 持久连接(长连接)
Persistent Connection:tcp连接建立后,每个资源获取完成后不全断开连接,而是继续等待
其它资源请求的进行;
如何断开持久连接?
可以通过数量限制和时间限制
持久连接的副作用:
对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
代码段:
KeepAlive On|Off KeepAliveTimeout 15 持久连接的时间限制 MaxKeepAliveRequests 100 持久连接时最大请求资源数量
4.4 MPM-多路处理模块
httpd-2.2不支持同时编译多个MPM模块,所以只能编译时选定一个;CentOS 6的rpm包为此专门
提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不
同的MPM机制的支持。默认使用prefork的MPM模块
确认现在使用的那个程序文件的方法:
# ps aux|grep httpd
查看httpd程序的模块文件列表:
# httpd -l
查看静态编译及动态编译的模块:
# httpd -M
更换使用的httpd程序,以支持其它MPM机制:
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}
注意:重启服务进程才能生效
MPM配置:
prefork的配置
StartServers 8 服务器启动时建立的子进程数 MinSpareServers 5 最小空闲子进程数 MaxSpareServers 20 最大空闲子进程数 ServerLimit 256 服务器允许配置的进程数上限 MaxClients 256 允许同时伺服的最大接入请求数量(最大子进程数) MaxRequestsPerChild 4000 每个子进程在其生存期内允许伺服的最大请求数量
worker的配置
StartServers 4 服务器启动时建立的子进程数 MaxClients 300 允许同时伺服的最大接入请求数量(最大线程数) MinSpareThreads 25 最小空闲线程数 MaxSpareThreads 75 最大空闲线程数 ThreadsPerChild 25 每个子进程建立的线程数 MaxRequestsPerChild 0 每个子进程在其生存期内允许伺服的最大请求数量,0表示进 程永远不会过期
4.5 DSO 动态共享对象
配置指定实现模块加载
LoadModule
模块文件路径可使用相对路径:
相对于ServerRoot(/etc/httpd指向的路径)
4.6 DocumentRoot "Main" server的文档页面路径
DoucmentRoot指向的路径为URL路径的起始位置
其相当于站点URL的根路径;
(FileSystem) /data/vhosts1/index.html --> (URL) /index.html
4.8 站点访问控制
基于两种机制指明对哪些资源进行何种访问控制
基于文件系统路径:
... ... ...
基于URL路径:
... ...
4.8.1
(1) Options
用于定义资源的展示方式,后跟1个或多个以空白字符分隔的“选项”列表;
Indexes:
指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给
用户。
FollowSymLinks:
允许跟踪符号链接文件所指向的源文件;
ExecCGI:允许执行CGI脚本。
None:
All:
(2)AllowOverride
httpd允许访问控制相关的哪些指令可以放在.htaccess文件(每个目
录下都可以有一个)中;
/data/web/
.htaccess
admin:.htaccess
p_w_picpaths:.htaccess
None:
All:
(3)order,allow和eny from
基于ip地址的访问控制
order:定义allow和deny的生效次序;写在后面的表示默认法则;
Allow from IP/NETWORK/FQDN
Deny from IP/NETWORK/FQDN
来源地址格式:
IP或者Netaddr
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
来源请求遵循最佳匹配法则机制:
order allow,deny(默认机制)白名单
order deny,allow(默认机制) 黑名单
allow from all
4.8.2 基于用户的访问控制机制
认证方式有2种:basic 明文,digest消息摘要认证
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户
认证的原因;
虚拟账号:仅用于访问某服务时用到的行号和密码
存储于何处(httpd要有相应的适配模块):
文本文件;sql数据库;ldap目录存储
basic基于用户认证配置示例:
(1) 定义安全域
Options None AllowOverride None AuthType Basic AuthName "SOME_STRING_HERE" AuthName "For Administrators" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthUserFile "/etc/httpd/conf/.htpasswd" Require user username1 username2 ...
允许账号文件中的所有用户登录访问:
Require valid-user
(2) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户
# htpasswd -c -m /etc/httpd/conf/.htpasswd jerry
# htpasswd -m /etc/httpd/conf/.htpasswd tom
basic基于组账号认证配置示例:
(1)定义安全域
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 ...
(2) 创建用户账号和组账号文件;
组文件:每一行定义一个组
GRP_NAME: username1 username2 ...
4.9 定义站点默认主页
DirectoryIndex index.html index.html.var
4.10 定义路径别名
Alias /URL/ "/PATH/TO/SOMEDIR/"
alias 指定的URL右侧的“/” 相当于后面的路径右侧的“/”
DocumentRoot "/data/vhosts1"
http://www.magedu.com/p_w_picpaths/logo.png
/data/vhosts1/p_w_picpaths/logo.png
Alias /p_w_picpaths/ "/tmp/pub/"
http://www.magedu.com/p_w_picpaths/logo.png
/tmp/pub/logo.png
4.11 设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
4.12 日志设定
日志类型:访问日志 和错误日志
错误日志:
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
LogFormat:定义日志信息格式
CustomLog:指明日志文件路径及日志格式
LogFormat format strings:
%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, 即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本; %>s:响应状态码; %b:响应报文的大小,单位是字节;不包括响应报文的http首部; %{Referer}i:请求报文中首部“referer”的值; 即从哪个页面中的超链接跳转至当前页面的; %{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;
4.13 虚拟主机配置
站点标识:socket
ip相同,但是端口不同
ip不同,但是端口默认端口
FQDN不同:
请求报文首部
虚拟主机有三种实现方案:
基于ip:为每个虚拟主机准备至少一个独有ip地址;
基于port:为每个虚拟主机使用至少一个独有的port;
基于FQDN:为每个虚拟主机使用至少一个FQDN;
注意:一般虚拟机不要与中心主机混用;因此要使用虚拟主机,得先禁用'main'机;
禁用方法:注释中心主机的DocumentRoot指令即可;
虚拟主机的配置方法:
ServerName FQDN DocumentRoot "" 其它可用指令: ServerAlias:虚拟主机的别名;可多次使用; ErrorLog: CustomLog:可设置访问控制 ... Alias ...