httpd笔记之理论详解优化配置(Apache)web入门
Linux的爱之初体验web服务~~!!!(之所以这么说我觉得这是进入Linux世界的第一个也是重要的一个服务)
文章叫长,懂的随便看看可能有不对的地方请校正。小白看看也可以理解理解大白话写的!
http 超文本传输协议笔记
传输层:tcp/udp提供进程地址
Port number:
tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路;数据流通信协议
0-65535 Linux中端口数
udp:User Datagram Protocol,无连接的协议;无连接的数据报文通信协议
0-65535
IANA:
0-1023:众所周知,永久的分配给固定的应用使用,特权端口,22/tcp(ssh), 80/tcp(http), 443/tcp(https) 只有管理员拥有权限注册使用
1024-41951:亦为注册端口,但要求并不是特别严格,分配给程序注册为某应用使用,11211/tcp, 11211/udp (memcached), 3306/tcp(mysql)
41952+:客户端程序随机使用的端口;动态端口,或私有端口;其范围的定义:/proc/sys/net/ipv4/ip_local_port_range
客户端访问服务器端随机生成端口,访问服务器端的某固定端口。
套接字Socket: IPC的一种实现,允许位于不同主机(甚至同一主机)上不同进程之间进行通信;从而完成数据交换;也称为Socket API库调用接口, 第一次出现在1983年,4.2 BSD系统上(伯克利系统分发版)。
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAW: 裸套接字(不借助UDP/TCP的接口进行通信)
IPv4:
分类:
A:1-127
B:128-191
C:192-223
D:组播,224-239
E:240-254
私有地址:
A:10.0.0.0/8
B:172.16.0.0/16-172.31.0.0/16
C:192.168.0.0/24-192.168.255.0/24
TCP协议的特性:
建立连接:三次握手
将数据打包成段:校验和(CRC-32)循环冗余检验
确认、重传以及超时:
报文排序:逻辑序号
流量控制:滑动窗口算法(有接收缓存控制,快满时暂停接收)发送方流量小的情况下
拥塞控制:慢启动和拥塞避免算法
Socket Domain(根据其所使用的地址):socket又分为三类
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主机上不同进程之间通信时使用;
每类套接字都至少提供了两种socket:流,数据报
流:可靠地传递、面向连接、无边界;
数据报:不可靠地传递、有边界、无连接;(比如寄信,有信封,封装多封就需要多个)
套接字相关的系统调用:
socket(): 创建一个套接字;
bind():绑定
listen():监听
accept():接收请求
connect():请求连接建立
write():发送
read():接收
send(), recv(), 发接
sendto(), recvfrom() 发接
HTTP协议
http: hyper text transfer protocol, 80/tcp
html: 编程语言,超文本标记语言;
blabla... blabal
CSS: Cascading Style Sheet 级联样式表
js: javascript
MIME: Multipurpose Internet Mail Extesion多用途Internet邮件扩展
工作机制:
http请求
http响应
被请求的内容称为:Web资源:web resource
静态文件:.jpg, .gif, .html, .txt, .js, .css, .mp3, .avi
动态文件:.php, .jsp, (客户端请求时不是直接反馈给客户端而是先在服务器端执行一次)
(比如:Windows浏览器需要借助外部插件来工作,浏览器本身不具备打开图片或视频等而且根据文件的后缀名来决定借助由客户端的某个插件来打开)
媒体:决定了客户端的浏览器如何打开借助那个插件
媒体类型(MIME类型):major/minor(主类型/次类型)
text/html 超文本文档
text/plain 纯文本文档
p_w_picpath/jpeg
p_w_picpath/gif
URI: Uniform Resource Identifier统一资源标识符
URL: Uniform Resorce Locator,用于描述某服务器某特定资源的位置;
Scheme://Server:Port/path/to/resource
http://www.magedu.com/p_w_picpaths/logo.jpg
URN: Uniform Resource Naming统一资源命名
http协议版本:
HTTP/0.9:原型版本,功能简陋
HTTP/1.0:第一个广泛使用的版本,支持MIME
HTTP/1.1: 增强了缓存功能
Spdy
HTTP/2.0:
rfc文档读一读有助于了解 1.1 2.0
一次完整的http请求处理过程:
(1) 建立或处理连接:接收请求或拒绝请求
(2) 接收请求:
接收来自于网络的请求报文中对某资源的一次请求的过程;
并发访问响应模型(Web I/O):
单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个;多个请求被串行响应;(多个请求到来排队,依次处理)
多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
复用I/O结构:一个进程响应n个请求;(借用一个复用I/O 处理器基于事件驱动机制)
多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;
事件驱动:event-driven(一个进程内部维持一个类似事件监控器,能够监控着多个I/O使得一个服务器进程能够同时连接多个请求)针对怎么知道每一个请求的连接与结束,在服务器编程时在内部基于事件回调的机制来完成连接状态(i/o)的追踪,并基于回调的状态来完成连接与结束的响应。
复用的多进程/线程--I/O结构:启动多个(m)进程,每个进程响应n个请求;
(3) 处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息
元数据:请求报文首部
Host: www.magedu.com 请求的主机名称
Connection://指明此次连接使用的方式
(4) 访问资源:获取请求报文中请求的资源
web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源;这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot
/var/www/html/
p_w_picpaths/1.jpg
http://www.magedu.com/p_w_picpaths/1.jpg
web服务器资源路径映射方式:
(a) docroot
(b) alias
(c) 虚拟主机docroot
(d) 用户家目录docroot
(5) 构建响应报文
资源的MIME类型:标记的方法
显式分类
魔法分类
协商分类
URL重定向:
web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径;
(6) 发送响应报文
(7) 记录日志
http服务器程序:
httpd (apache)
nginx
Lighttpd //德国人研发轻量级类似Nginx
应用程序服务器(容器类):动静都能解析
IIS
tomcat, jetty, jboss, resin
webshpere, weblogic, oc4j
www.netcraft.com //查看一些web服务器占用市场的份额
httpd的安装配置和使用:
httpd: apache
a patchy server = apache
ASF: apache software foundation //软件基金会
httpd的特性:
高度模块化:core + modules
DSO: Dynamic Shared Object 动态模块机制
MPM:Multipath Processing Modules 实现多种不同I/O模型机制
prefork:多进程模型,每个进程响应一个请求;每个主进程只负责监听套接字,接收请求交给子进程处理请求。
一个主进程:负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
worker:多线程模型,每个线程响应一个请求;
一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求;
event:事件驱动模型,每个线程响应n个请求;
一个主进程:生成m个子进程,每个进程直接n个请求;
m进程,n线程:m*n
httpd-2.2: event为测试使用
httpd-.24:event可生产使用
CentOS 6:
程序环境
配置文件:
/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
access_log: 访问日志
error_log:错误日志 //启动停止访问错误等信息
站点文档目录:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
配置文件的组成:
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment //全局环境配置
### Section 2: 'Main' server configuration //主服务器配置
### Section 3: Virtual Hosts ///虚拟主机配置
配置格式:directive value 指令对应的值来完成 比如listen 80
directive: 不区分字符大小写;
value: 为路径时,取决于文件系统;
常用配置:修改完配置文件 httpd -t 或者 service httpd configtest 测试语法
1、修改监听的IP和Port //修改监听端口需要restart
Listen [IP:]PORT
省略ip表示监听本机所有IP; Listen可重复出现多次;
2、持久连接
Persistent Connection(长连接):连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成;
如何断开?
数量限制:100 资源请求默认100
时间限制:可配置
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应;
折衷:使用较短的持久连接时间;5秒
httpd-2.4 支持毫秒级持久时间;
非持久连接
KeepAlive On|Off //是否开启
MaxKeepAliveRequests # //最大连接请求数量
KeepAliveTimeout # //连接超时
测试:
telnet HOST PORT
GET /URL HTTP/1.1
Host: HOSTNAME or IP
3、MPM
Multipath Process Module:多道处理模块
prefork, worker, event
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持;确认方法:
# ps aux | grep httpd
默认为/usr/sbin/httpd, 其使用prefork
查看模块列表:
查看静态编译的模块
# httpd -l ///httpd.worker -l///httpd.event -l
Compiled in modules:
Core.c //核心模块
Prefork.c /已经使用的
http_core.c //功能核心模块
mod_so.c //支持模块动态装卸载的功能
查看所有静态编译及动态装载的模块
# httpd -M
更换使用的httpd程序:
/etc/sysconfig/httpd
HTTPD=
重启服务生效;
prefork的配置:
StartServers 8 //服务启动时启动多少服务子进程
MinSpareServers 5 //最小空闲进程数
MaxSpareServers 20 //最大空闲进程数
ServerLimit 256 ///在服务器声明周期内为MaxClients生成数量
MaxClients 256 ///最大并发数
MaxRequestsPerChild 4000 //一个进程最多能够响应多少次请求然后死掉
worker的配置:
StartServers 4 //服务启动时启动多少服务子进程
MaxClients 300 ///最大并发数,最大启动的线程数
MinSpareThreads 25 //最少空闲线程
MaxSpareThreads 75 //最大空闲线程
ThreadsPerChild 25 //每个进程能够启动的线程数
MaxRequestsPerChild 0 //每个线程最大响应的请求数
PV, UV
PV: Page View 页面访问量
UV: User View 用户数量
独立IP有效访问量;
4、DSO
配置指令实现模块加载
LoadModule
模块路径可使用相对地址
相对于ServerRoot(/etc/httpd)指向的路径而言;
/etc/httpd/modules/
5、定义'Main' server的文档页面路径
DocumentRoot
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置;
DocumentRoot "/var/www/html"
test/index.html --> http://HOST:PORT/test/index.html
6、站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
访问控制机制:
基于来源地址;
基于账号;
7、Directory中"基于来源地址"实现访问控制
(1) Options 建议关闭(如果是下载网站打开不指定默认网页可以打开网站上资源,非下载网站是不安全的在没有定义默认页的情况下同事http的也没有做测试页客户端打开网站会获取服务器端的所有网站资源)
比如默认根目录下存放的没有默认定义的主页面(index.html)就会索引到根目录下其他的文档。
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None, All
Indexes: 索引;//当访问网站目录下默认主页面
FollowSymlinks:允许跟踪符号链接文件;允许访问网站中根目录下作链接的文件
SymLinksifOwnerMatch: 允许追踪链接文件和源文件为同一属主就允许(使用少)
MultiViews: 是否允许多视图(不开启)(使用少)
(2) 基于来源地址的访问控制机制
Order:检查次序
Order allow,deny
Order 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
8、定义默认主页面 访问没有指明自左向右访问
DirecotryIndex index.html index.html.var index.php
9、日志设定
错误日志:
ErrorLog logs/error_log
LogLevel warn
debug, info, notice, warn, error, crit, alert, emerg
调试信息、通知、警告、 错误、暴击、警报、紧急
定义warn那么比warn高的级别都将记录。
访问日志:
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h:客户端IP地址;
%l: Remote logname (from identd, if supplied). -表示为空;远程登录名大多数为空
%u: Remote user, (from auth; may be bogus if return status (%s) is 401);用户认证时的用户名 大多数无需认证-表示为空
%t:Time the request was received (standard english format),服务器收到请求的时间;默认为英文格式
%r:First line of request,请求报文的首行信息(请求的URL以及协议版本等)(method url version);
%>s: 响应状态码;
%b: 响应报文的大小,单位是字节,不包括响应报文首部;
%{Referer}i:请求报文当中"referer"首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来;
%{User-Agent}i:请求报文当中"User-Agent"首部的值;即发出请求用到的应用程序;
详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10、路径别名
DocumentRoot "/www/htocs"
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
--> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /3/ "/1/2"
http://www.magedu.com/3/index.html
--> /1/2/3/
Alias /bbs/ "/forum/htdocs"
http://www.magedu.com/bbs/index.html
--> /forum/htdocs/bbs/
11、设定默认字符集
AddDefaultCharset UTF-8
GBK, GB2312, GB18030 中文字符
12、基于用户的访问控制
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源;
认证类型:
basic:明文
digest:消息摘要
安全域:需要用户认证后方能访问的路径;
应该通过名称对其进行标识,并用于告知用户认证的原因;
用户的账号和密码存储于何处?
虚拟账号:仅用于访问某服务时用到的认证标识;
存储:
文本文件
SQL数据库
ldap
nis
basic认证:
(1) 定义安全域
Options None
AllowOverride None
AuthType Basic
AuthName "STRING" ///安全域名称
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" //认证时使用的账号文件
Require user username1 username2 ... //所有合法(允许)账号都行
允许账号文件中的所有用户登录访问:
Require valid-user
(2) 提供账号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
-m: md5加密用户密码;
-s: sha1加密用户密码;
-D: 删除指定用户
(3) 实现基于组进行认证
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2 ...
要提供:用户账号文件和组文件;
组文件:每一行定义一个组
GRP_NAME:user1 user2 user3 ... 组名 冒号 用户名用空格分隔
示例:
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmin
13、虚拟主机
有三种实现方案:
基于ip:
为每个虚拟主机准备至少一个ip地址;
基于port:
为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:
为每个虚拟主机准备至少一个专用hostname;
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:
SeverName
DocumentRoot ""
ServerAlias: 虚拟主机的别名;以下这些都可以定义在虚拟主机中
ErrorLog
CustomLog
ip addr add [ip/mask] dev eth0 /添加新的IP
Ip addr list //查看
示例1:基于ip
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
示例2:基于port
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
示例3:基于hostname
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
14、内置的status页面 //内置状态页面
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16
实现:基于账号实现访问控制