http协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 –百度百科
http工作于应用层,监听在TCP的80端口上,用来传输超文本(由HTML语言开发出来的文本)的一种协议。
http事务
当用户在浏览器中输入一个URL(统一资源定位符),http协议会将请求报文通过特定的语法格式封装成请求首部,该请求首部中包含了请求方法、请求地址、http协议版本以及请求头部。由于是请求报文,所以是不包含请求内容的
一次完整的http事务涉及到域名解析,TCP协议的三次握手,http协议的请求首部以及服务器响应首部格式、状态码等相关知识,这里不在这里过多阐述。以后会另起篇幅详细的描述一下完整的http事务
httpd
http是协议,httpd就是基于这种协议工作的程序,一种服务。httpd是当今世界上最流行的web服务,它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用。而且,httpd服务支持众多模块,拥有众多功能。
httpd的特性
- 高度模块化:httpd是由一个核心加上众多模块组成,不同的模块拥有不同的功能,用户可以根据自己的需要装载所需要的模块
- 支持DSO:Dynamic Shared Object,动态装/卸载模块。不用停止正在运行的httpd服务即可直接装/卸载模块
- MPM机制:Multipath Processing Modules,多路处理模块,实现了多种不同的I/O模型机制
MPM有三种机制:多进程模型(prefork),多线程模型(worker),事件驱动模型(event)
prefork模型:与进程池相似。主进程会生成一定数量的进程,每个子进程也被称之为工作进程,每个进程响应一个请求
worker模型:主进程生成子进程,每个进程生成多个线程,一个线程响应一个请求
event模型:一个线程响应多个请求
httpd的安装(以CentOS 6为例)
[root@ling ~]#yum install httpd -y
配置文件
[root@ling ~]#rpm -qc httpd
主配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf 该目录下所有以.conf结尾的文件。
此文件是为主配置文件提供额外的配置片段。当一个程序的配置文件过大的时候往往就会将其切割成多个片段进行维护
httpd的配置文件没有安装在/etc/httpd目录下,而是将主配置文件放在/etc/httpd/conf目录下,是因为它将/etc/httpd目录作为程序的安装目录,也就是程序运行的根目录服务脚本:/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd //默认使用的是prefork
/usr/sbin/httpd.event
/usr/sbin/httpd.worker日志文件目录:
/var/log/httpd
access_log: 访问日志
error_log: 错误日志站点文档目录:/var/www/html
httpd的常用配置
打开主配置文件,在对httpd程序进行设置。以下所有的配置都是在主配置文件中进行的。
[root@ling ~]#vim /etc/httpd/conf/httpd.conf
(1) 持久连接
KeepAlive Off
MaxKeepAliveRequests 100 最大连接数
KeepAliveTimeout 15 超时时长
每个客户端与服务端进行通信都要进行三次握手与四次断开,这样会浪费大量的时间,所以为了解决这个问题就提出了持久连接。连接建立之后,每个资源获取完成之后不会断开连接,而是继续等待其请求完成。但是持久连接对并发访问量较大的服务器会造成一定影响,会使有些请求得不到响应。根据实际生产环境来
(2) MPM,多道处理模块
httpd服务默认为prefork模型,httpd-2.2不支持event模型
prefork的配置:
<IfModule prefork.c>
StartServers 8 //服务器启动时,启动的进程数
MinSpareServers 5 //最小空闲进程数
MaxSpareServers 20 //最大空闲进程数
ServerLimit 256 //服务器进程的最大数目值
MaxClients 256 //最大并发请求数
MaxRequestsPerChild 4000 //服务器进程能够响应的最大请求数目
</IfModule>
worker的配置:
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
更换httpd的工作模式
[root@ling ~]#vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker //取消注释,将从prefork变成worker模式
查看httpd装载的模块
root@ling ~]#ps aux | grep httpd
root 41080 0.1 0.4 139032 5020 pts/1 S+ 19:06 0:00 vim /etc/sysconfig/httpd
root 41109 1.0 0.3 177468 3860 ? Ss 19:07 0:00 /usr/sbin/httpd.worker
apache 41111 0.0 0.2 177468 2480 ? S 19:07 0:00 /usr/sbin/httpd.worker
apache 41112 0.0 0.2 177468 2496 ? S 19:07 0:00 /usr/sbin/httpd.worker
apache 41113 0.0 0.2 177468 2480 ? S 19:07 0:00 /usr/sbin/httpd.worker
apache 41114 0.0 0.2 177468 2480 ? S 19:07 0:00 /usr/sbin/httpd.worker
apache 41115 0.0 0.2 177468 2480 ? S 19:07 0:00 /usr/sbin/httpd.worker
apache 41116 0.0 0.2 177468 2480 ? S 19:07 0:00 /usr/sbin/httpd.worker
apache 41117 0.0 0.2 177468 2480 ? S 19:07 0:00 /usr/sbin/httpd.worker
apache 41118 0.0 0.2 177468 2480 ? S 19:07 0:00 /usr/sbin/httpd.worker
root 41120 0.0 0.0 103328 888 pts/0 S+ 19:07 0:00 grep httpd
这表示为worker模型
(3) 修改监听IP和端口
Listen [IP:]port
在配置虚拟主机的时候,根据端口进行配置的时候会用上
(4) 配置文档访问路径
DocumentRoot “/var/www/html”
默认为/var/www/html,也可以根据业务需求,将页面更改到别的目录下。当修改访问路径之后可能之后的站点访问控制中的路径也要跟着修改
(5) 基于来源地址的访问控制机制
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Options:定义用户在对该目录下的资源进行访问时的访问机制
Indexes: 页面索引(这是一项很有用但是很危险的选项,如果是一个提供下载的网站,那么又非常有用)
一般的一个网站都有自己定义的默认主页面,定义在DocumentRoot路径下的两个文件(index.html,index.html.var),如果没有这两个文件,那么在访问该站点时系统会自动显示默认的欢迎信息(/etc/httpd/conf.d/welcome.conf)。如果这个文件也没有,而且选项Indexs是启用的,那么系统就会将你在该目录下(“/var/www/html”)的所有文件全部列出来,可以下载,可以查看。所有这是一个很危险的用法,但是当我们要用这个网站提供下载的时候又非常有用Indexes的选项:
FollowSymLinks: 是否允许跟踪符号链接
All:表示开启options中所有的选项(测试环境中使用这个)
None:表示禁止options中所有的选项(生产环境中一般用这个)
还有其他一些无关紧要的选项这里就不提了,有兴趣的可以在配置文档中查找AllowOverride None(无关紧要,一般都是none)
基于来源地址的访问控制机制
Ordef allow, deny //白名单,默认deny(禁止)
Ordef deny, allow //黑名单,默认allow(允许)Allow from all
这里根据上面的黑名单或者白名单设置来,灵活运用。可以使用黑名单,允许特定的IP进行访问。也可以使用白名单,禁止特定的IP进行访问
(6) 定义默认主页面
DirectoryIndex index.html index.php
(7) 日志设定
错误日志
日志级别(由低到高):debug, info, notice, warn, error, crit, alert, emerg.
LogLevel warn:默认为warn,表示从wran到emerg级别的日志都会被记录访问日志
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
日志记录格式默认为combined
%h: 客户端IP地址
%I: 不怎么重要,一般都是空
%u:基于认证的用户,一般也是空
%t: 服务器收到请求的时间
%r: 请求报文的首行信息
%>s: 响应状态码
%b:响应报文的大小,大小是字节,不包括响应报文首部
%{Referer}i:请求报文当中”referer”首部的值,当前资源的访问入口,即从哪个页面中的超链接跳转而来
如果不明白可以对照着日志文件看,目录位于/var/log/httpd/access_log
(8) 路径别名
Alias /index.html “/var/www/html/1.html”
将/var/www/html/index.html映射到/var/www/html/1.html上,与linux中的别名相似
(9) 基于用户的访问控制
这个访问控制就是让用户输入用户名与密码,才能访问该路径下的资源。如果是一个大型的项目的话一般都是基于表单认证(用户通过网页进入了某一个网站,而要想访问这个网站必须输入用户名和密码)的方式进行认证,而不是基于httpd网页进行认证。
请按照以下方式在主配置文件中的任意一个地方输入
<Directory "/var/www/html"> //表示将此目录加密
Options None
AllowOverride None
AuthType Basic //基于basic认证
AuthName "String" //提示名称
AuthUserFile "/etc/httpd/conf.d/.htpasswd" //用户名放置的位置,一般都是这个目录
Require user tom //用户白名单
Require valid-user //表示允许所有的用户登录
</Directory>
提供账号和密码存储
[root@ling ~]#htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom
[root@ling ~]#htpasswd -c /etc/httpd/conf.d/.htpasswd tom
-c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用
-m:md5加密用户密码
-s:sha1加密用户密码
-D:删除指定用户s
(10) 虚拟主机
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址(实际用的比较少)
基于port:为每个虚拟主机准备至少一个专用port(实际用的更少)
基于hostname:为每个虚拟主机准备至少一个专用hostname(常用)
这里以hostname为例,其他的方式用的不多,方法相似
NameVirtualHost 192.168.64.129:80
<VirtualHost 192.168.64.129:80>
ServerName web1.magedu.com
DocumentRoot "/web/web1"
</VirtualHost>
<VirtualHost 192.168.64.129:80>
ServerName web2.magedu.com
DocumentRoot "/web/web2/htdocs"
</VirtualHost>
<VirtualHost 192.168.64.129:80>
ServerName web3.magedu.com
DocumentRoot "/web/web3/htdocs"
</VirtualHost>
注意:
(1) 将第90行的NameVirtualHost 解除注释,有的可能不是这一行
(2) 虚拟主机的IP与端口要与NameVirtualHost 192.168.64.129:80这里一致
(3) 由于没有域名解析服务器,只能自己进行解析。修改/etc/hosts文件,并将虚拟主机的名称添加进去:
192.168.64.129 web1.magedu.com web2.magedu.com web3.magedu.com
(4) 如果要用Windows中的浏览器进行访问,那么也要手动修改Windows中的hosts配置文件,并添加以上内容
以上就是httpd的简单配置,修改完成之后注意检查语言,之后再重载
[root@ling ~]#httpd -t
[root@ling ~]#service httpd reload