1、网络基础 2、HTTP相关概念 3、一次网站的HTTP请求过程 <> 4、Web 服务器响应模型 5、Apache介绍 6、Apache配置 7、sendfile机制 8、其他工具 9、编译安装最新版本apache2.4.25 10、HTTP协议 11、资源限定 ============================================================================================================================================ 网络基础 1、主机间通信 任何主机间的通信都要使用TCP/IP协议栈的下三层,即传输层,网络层,数据链路层,由于不同的应用都有可能会使用到协议栈下三层的功能,所有下三层 的协议是在内核实现的,在应用层不同的应用都要使用内核协议栈的功能。应用层的应用需要和远程的主机通信时,需要向内核发出请求,从而使用内核集 成的协议栈。 应用层协议有:http、https、smtp、pop、imap、ftp、ladp,应用层的协议是在用户空间实现的。 2、套接字 Internet Berkeley sockets,是一种通信机制,早期由BSD研发。套接字是一种应用程序的接口API,它包含了一个用[C语言实现的开发库],用于实现进 程间通信。允许位于不同主机或者同一主机上不同进程间通信,数据交换。 基于套接字的主机间通信,也是进程间通信(IPC)的一种实现。在本地通信过程中,进程的PID唯一标记了一个进程,在远程通信过程中,由 IP 和端口号 共同唯一标记了网络进程,进而利用协议实现通信。Socket 是应用层和传输层之间的一个抽象层,将传输层复杂的操作简化为一个简单的接口,供应用 层使用。基于套接字的通信,表现为客户端和服务器端都维护一个文件,可以向自己维护的 socket 文件写入或读取内容。 套接字类型: 1、流套接字(SOCKET_STREAM):使用了传输层的TCP协议,提供可靠的传输服务。 2、数据报套接字(SOCK_DGRAM):提供无连接的服务,使用传输层的UDP协议实现。 3、裸套接字(SOCKET_RAW):原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的 数据。 套接字通信机制: 1、AF_UNIX # Unix Sock,基于文件的通信机制 2、AF_INET # IPv4+port,IP负责主机间的通信,port实现进程间的通信。IPv4:port 3、AF_INET6 # IPv6+port,IP负责主机间的通信,port实现进程间的通信。IPv6:port 流:可靠地传输,面向连接,无边界。 数据包:不可靠地传递,无连接,有边界 套接字相关的系统调用: socket() 创建一个新的确定类型的套接字,类型用一个整型数值标识(文件描述符),并为它分配系统资源 bind() 一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,一个指定的本地端口和IP地址 listen() 用于服务器端,使一个绑定的TCP套接字进入监听状态。 connect() 用于客户端,为一个套接字分配一个自由的本地端口号。 如果是TCP套接字的话,它会试图获得一个新的TCP连接 accept() 用于服务器端。它接受一个从远端客户端发出的创建一个新的TCP连接的接入请求,创建一个新的套接字,与该连接相应 的套接字地址相关联 send()/recv()或者write()/read()或者recvfrom()/sendto()用于往/从远程套接字发送和接受数据 close() 用于系统释放分配给一个套接字的资源。 如果是TCP,连接会被中断 gethostbyname()和gethostbyaddr() 用于解析主机名和地址 select() 用于修整有如下情况的套接字列表: 准备读,准备写或者是有错误 poll() 用于检查套接字的状态。 套接字可以被测试,看是否可以写入、读取或是有错误 getsockopt() 用于查询指定的套接字一个特定的套接字选项的当前值 setsockopt() 用于为指定的套接字设定一个特定的套接字选项 3、端口 在传输层的TCP协议或者UDP协议的数据包头中,定义了源端口和目标端口号,使用16位二进制数表示,范围介于 0 ~ 65535 之间。 0 TCP中是保留端口,在UDP中表示无源端口 0 ~ 1023 永久的分配的固定端口,特权端口,只有管理员可以使用打开 1024 ~ 4195 也是注册端口,但要求并不严格 41952+ 客户端程序随机端口。其范围定义在 /proc/sys/net/ipv4/ip_local_port_range 4、TCP协议的特性 TCP协议的连接过程有三次握手连接,并将数据打包成段,以及校验和,接收的数据包的确认,重传以及超时重传等等功能。当接收方接收到数据包 文后,还要将数据包排序。当一方发送的速率和对方接收的速率严重不协调时,TCP协议能够进行速率控制(通过滑动窗口的机制)。 TCP的连接是双向的,在两个主机间都维护者发送缓冲和接收缓冲。 ================================================================================================================================================ HTTP相关概念 1、HTTP服务通信过程 服务器端: 创建套接字scoket(),将套接字绑定bind()到 80 端口,并监听linsten()某个 IP 地址上,允许套接字连接accept(),等待客户端连接。 当客户端发出请求后,套接字通知应用程序开始读取请求,之后处理HTTP请求报文,响应HTTP请求,直到关闭连接。 客户端: 创建新的套接字scoket() --> 连接服务器IP:PORT connect() --> 连接成功 --> 发送HTTP请求 write() --> 等待HTTP响应 --> 关闭连接 2、HTTP协议介绍 HTTP(Hypertext Transport Protocol)超文本传输协议,是一种应用层协议,HTTP协议设计之初就是为了传输 HTML 页面,通过 HTTP 协议请 求的资源有统一资源定位符进行标识。 URI:统一资源标识符(Uniform Resource Identifier)。是一个用于标识某一互联网资源名称的字符串。 URL:统一资源定位符(Uniform / Universal Resource Locator),有时也被俗称为网页地址(网址)。如同在网络上的门牌,是因特网上标准的 资源的地址(Address)。 HTTP/0.9 1991年,仅用于传输html文档,只接受 GET 一种请求方法 HTTP/1.0 1999年6月,支持多媒体数据的处理,保存连接,有缓存功能首次加入(MIME:多用途互联网邮件扩展)功能。头信息是 ASCII 码,后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的作用。这些数据类型总 称为 MIME(Multipurpose Internet Mail Extensions) 多用途互联网邮件扩展,每个值包括一级类型和二 级类型,预定义的 类型,也可自定义类型。 常见 Content-Type 值: Note:在linux中,存放支持MIME的类型文件 /etc/mime.types HTML:text/html ASCII:text/plain JPEG:image/jpeg GIF:image/gif QuickTime:video/quicktime HTTP/1.1 1.0版本新特性: 1.持久连接(persistent connection),一个TCP连接默认不关闭,可以被多个HTTP请求复用而不用声明keep-alive。 2.管道机制(pipelining),同一个TCP连接当中,客户端可同时发送多个请求 3.新增方法:PTT、PATCH、OPTIONS、DELETE 4.同一个TCP连接里面,所有的数据通信是按次序进行的。服务器 只能顺序处理回应,前面的回应慢,会有许多请求排队,造成 "队头堵塞"(Head-of-line blocking)。解决方法:1.减少请求数 2.开始持久连接 5.HTTP协议是无状态的,每次请求都会请求全部资源,浪费带宽 HTTP/2 2015年5月正式发布 特性: 1.头信息和数据体都是二进制,称为头信息帧和数据帧 2.复用TCP连接,在一个连接里,客户端和浏览器都可以同 时发送多个请求或回应,且不用按顺序一一对应,避免了"队头堵塞" 此双向的实时通信称为多工(Multiplexing) 3.头信息压缩机制(header compression),头信息使用gzip或者commpression进行压缩然后发送,客户端和服务器端都维持一张 索引表,这张表中保存着所有的信息头记录,在需要发送头信息的时候,只发送这张表中保存的序号,而不发送真正的信息 头,避免的过多的信息发送,提高了通信速度 4.服务器端可以在客户端未请求的情况下发送信息给客户端(server push) 3、HTTP连接机制 <> 串行连接 并行连接 持久连接 管道化持久连接 4、HTTP事务:一次请求及与其对应的响应 5、URI(Uniform Resource Identifier) 统一资源标识。 URI有两种形式:(URL和URN是URI的一个子集) URL:Uniform Resorce Locator 统一资源定位符 URN:Uniform Resource Naming 统一资源命名 ---> P2P下载使用的磁力链接是 URN 的一种实现 URL组成: ://:@:/;?# schame:方案,访问服务器以获取资源时要使用哪种协议 params:参数,某些方案用这个组件来指定输入的参数,参数为名/值对, URL中可多含多个参数,用;分隔 query:查询,某些方案会用这个组件传递参数以激活程序,如数据库,用 ?分隔,多个查询用&分隔 frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔。例如在一个页面的内容一半内容处的位置 6、网站访问量 IP(Internet Protocol):一天内不同 IP 访问站点的数量,是衡量网站流量的重要指标。局域网内的所有主机连接外部网络都有可能一个IP地址。 PV(Page View):访问量。即页面(单个HTML)浏览量或点击量,用户每次刷新即被计算一次。将同一个站点的每一个页面的刷新次数相加即PV。 单独页面的PV就是此页面被请求刷新的次数。 UV(Unique Visitor):访客数量,一天内,不同电脑(一台电脑作为一个客户端)访问站点的数量。网站判断来访电脑的身份是通过cookies实现的, 如果更换了IP地址,但不清除cookies则UV数是不变的。 7、HTTP服务器响应模型 ================================================================================================================================================ 一次网站的HTTP请求过程 <> 建立连接 客户端发起建立TCP连接的请求,服务器可以接受并进行相应,也可以明确拒绝连接 接受请求 视web服务的处理I/O模型不同,接受请求 处理请求 根据方法、资源、首部和可选的主体部分对请求进行处理。 访问资源 对资源的映射及访问,静态资源或者动态生成的内容 构建响应 web服务器识别出资源后,就执行请求方法中的描述,并返回响应报文。响应报文中包含响应状态码、首部及响应实体。 发送响应 Web服务器通过连接发送数据时也会面临与接收数据一 样的问题。服务器可能有很多条到各个客户端的连接,有些是空 闲的,有些在向服务器发送数据,还有一些在向客户端回送响应 数据。服务器要记录连接的状态,还要特别注意对持久 连接的处 理。对非持久连接而言,服务器应该在发送了整条报文之后,关 闭自己这一端的连接。对持久连接来说,连 接可能仍保持打开状 态,在这种情况下,服务器要正确地计算Content-Length首部 ,不然客户端就无法知道响应什么 时候结束。 记录事务日志 在日志文件中记录日志 ================================================================================================================================================ Web 服务器响应模型 <> 复用I/O模型 { 实现方法: 1.多线程模型:一个进程生成N个线程,每线程响应一个连接请求 2.事件驱动:一个进程处理N个请求 } 启动一个进程,同时响应N个连接请求 单个线程通过记录跟踪每一个Sock(I/O流)的状态 多个I/O可以复用一个进程 理解:单个进程监控多个连接的状态,如果某个连接需要操作时,进程就操作某个连接。 引入代理机制,代理可以监控连接状态。 { 实现: 1983年左右 在BSD里面实现 select 1997年 实现了 poll 2002年 epoll {当连接有I/O流事件产生的时候,epoll就会去告诉进程哪个连接有I/O流事件产生} select与poll原理是一样的,只不过select只能观察1024个连接,poll可以观察无限个连接。 } 复用多进程I/O模型 启动M个进程,每个进程响应N个连接请求 ,同时接收M*N个请求 ================================================================================================================================================ Apache介绍 1、实现HTTP的服务器端程序(只能解析静态内容) httpd(Apache) a patchy server Note:htpd的帮助手册是 httpd-manual Nginx lighttpd 应用程序服务器(静态内容和动态内容都可以响应) IIS tomcat jetty jboos resion webshpere(IBM) weblogic oc4j(Oracle) 2、设计特性 1、高度模块化设计:core + modules 2、DSO:Dynamic Share Object 动态启动或者关闭模块。修改/etc/httpd/conf.modules.d/目录下的配置文件,加载或停止某个模块。 3、MPM:Multipath Processing Modules,多路处理模块,非一个模块。而是对一种特性的称谓 prefork (多进程模型) 由父进程(主进程)管理多个子进程,一个子进程(工作进程)响应一个请求。当apache启动时预先分配出子进程,即预先 fork 出子进程,当有 访问请求时可以立刻响应,空闲时回收机制。 它也是隔离每个请求的最佳MPM,因为单个的请求不会影响任何其他请求。perfork模型,不适合高并发的场景,每个子进程都会占用系统资源。 prefork会预先保留一些空闲子进程,以备有请求的的时候快速响应。非线程型、预派生、MaxClients调到大值,以便应对潜在的请求高峰。 prefork模型最多不能超过1024个并发连接。 worker (多进程多线程模型) 由父进程生成管理多个子进程,和 prefork 相同也产生多个子进程,worker 和 prefork 不同的是一个进程会产生多个线程,由一个线程响应 一个请求,一个进程产生的线程数量是固定的。和prefork相同,worker也会保留空闲进程,以备有请求的时候快速响应。因为线程可以共享父 进程的内存空间,所以worker模式下会相对节省系统资源。 event (事件驱动模型) 和worker类似。区别是:event模块中,会有一些不负责响应请求的线程,用来释放已经响应完成的工作线程,以用来更好的响应请求,MPM-event 模块为每个进程使用专用的监听器线程来检测所有处于 Keep Alive 状态的套接字,当有 Keep Alive 长期连接,且没有请求甚至超时时,用来 监听的线程将他释放。能够承受更高的并发负载。 3、httpd程序环境 /etc/httpd # 运行目录 /etc/logrotate.d/httpd # 文日志滚动配置件 /etc/sysconfig/httpd # 脚本配置文件 /usr/lib/systemd/system/httpd.service # 服务脚本 /var/www # Docroot,文档根目录 /etc/httpd/conf # 主配置文件 /etc/httpd/conf.d # 扩展配置文件,每一个配置都可以写入conf.d目录,方便管理配置 /etc/httpd/modules -> ../../usr/lib64/httpd/modules # httpd模块 存放目录 4、httpd配置文件 /etc/httpd/conf/httpd.conf 格式:配置参数 值 Note:配置指令不区分大小写;值有可能区分大小写;有些指令可以出现多次 组成: 全局配置 主机配置:用于提供一个站点 虚拟主机配置:提供多个站点 ================================================================================================================================================ Apache配置 1、监听地址/端口 Listen 12.34.56.78:80 或者 Listen 80 Note: Listen指令可以出现多次 如果不指定监听IP地址,则表示监听所有IP 可以同时监听多个端口 I配置监听IPv6地址,地址必须放在方括号内,例如 Listen [2001:db8::a00:20ff:fea7:ccea]:80 2、持久连接 KeepAlive on|off # 持久连接,默认是启用 MaxKeepAliveRequests N # 最大请求资源数,默认为100 KeepAliveTimeout N # 超时时长,单位为秒,httpd2.4也可以配置为毫秒 Nms 含义:MaxKeepAliveRequests,当KeepAlive打开时,MaxKeepAliveRequests指令限制每个连接允许的同时请求数。如果设置为0,将允许无限制请求。 建议将此设置保持在较高的值以实现最大的服务器性能。 KeepAliveTimeout,超时时长,KeepAliveTimeout决定一个KeepAlive的连接能保持多少时间, HTTP 的 Keepalive 方式能减少 TCP 连接数量 和网络负载,但是keepalive需要和进程或线程绑定,所以就会消耗过多的系统资源。 Note: 对于请求量非常大的服务器请求可能得不到响应,因为客户端会一直保持和服务器连接没有断开连接 启用持久连接后,由服务器端主动断开 可以使用 telnet 发送请求,测试KeepAlive功能是否生效 $ telnet 172.18.26.5 80 Trying 172.18.26.5... Connected to 172.18.26.5. Escape character is '^]'. GET /index.html HTTP/1.1 Host: 172.18.26.5 3、服务器工作目录 ServerRoot "/etc/httpd" 4、文档根目录 DocumentRoot "/var/www/html" 含义:如果 http://my.example.com/index.html 则是指 /var/www/html/index.html 路径下的目录。如果目录路径不是绝对路径,则此处指定的相对路径 是相对于ServerRoot目录。此路径相当于URL的起始位置 路径尾部不能使用 "/" 5、显示器版本信息 ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full ServerTokens Prod[uctOnly] :Server: Apache ServerTokens Major: Server: Apache/2 ServerTokens Minor: Server: Apache/2.0 ServerTokens Min[imal]: Server: Apache/2.0.41 ServerTokens OS: Server: Apache/2.0.41 (Unix) ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2 # 只能配置于整个虚拟机不适合虚拟主机的配置 建议使用:ServerTokens Prod 6、MPM:多道处理模块 Apache httpd 通过模块化的设计来适应各种环境。这种设计允许管理员通过在编译时或运行时,选择哪些模块将会加载在服务器中,来选择服务器特性。任何 时间,必须有一个,而且只能有一个 MPM 加载到服务器中。要求更高伸缩性的站点可以选择使用线程的 MPM,即 worker 或 event; 需要可靠性或者与旧有软 件兼容的站点可以使用 prefork。在Linux中,MPM模块有prefork、worker、event。MPM类似于http的其他模块,但不同的是MPM模块必须有一个,而且只能一 个MPM模块加载。在类Unix平台下,MPM模块可以动态装卸载。使用yum安装的httpd可以在/etc/httpd/conf.modules.d/00-mpm.conf修改加载的MPM模块。 httpd-2.2不支持同时编译多个模块,只能编译一个模块到内核,但rpm包中提供了三个二进制程序,分别用于实现对不用MPM机制。在httpd-2.4可以同时编译到 httpd内核。 切换工作模式的: CentOS6:/etc/sysconfig/httpd CentOS7:/etc/httpd/conf.modules.d/00-mpm.conf 1、httpd命令 httpd -l # 显示httpd编译进内核的模块 httpd -t # 配置文件语法检测 httpd -V # 显示版本信息、使用MPM模型等 httpd -M # 显示所有已经动态加载的模块 httpd -S # 显示虚拟主机的配置信息 1、MPM/prefork配置 StartServers 5 # 初始启动httpd时,默认启动几个[初始工作进程],不包括主进程,默认为5 MinSpareServers 5 # [最少空闲进程数],如果空闲进程数小于这个数,则父进程以分裂的方式创建子进程默认是5。如果不 是非常繁忙的服务器,不建议修改此值,因为开启过多的子进程会占用系统资源,反而会影响性能 MaxSpareServers 10 # [最多空闲进程数],如果空闲子进程超过这个数,则父进程会管理终止多余的子进程。如果您尝试将值 设置为等于或低于 MinSpareServers,Apache HTTP Server将自动将其调整为MinSpareServers + 1。 默认值为10 MaxRequestWorkers 256 # MaxClients,[并发请求最大数],设置同时请求数的限制,即可用于响应请求的最大子进程数如果超过这个值, 则通过尝试将请求放入队列等待。默认值256。MaxRequestWorkers was called [MaxClients] before version 2.3.13. The old name is still supported. 对于非线程服务器(即,prefork), MaxRequestWorkers转换成将要推出的服务请求的子进程的最大数量。 增加它,你也必须提高 ServerLimit 的值 ServerLimit 256 # [当前最大活动进程数]。ServerLimit一般要大于MaxRequestWorkers。20000是最大值,如果需要更大值, 则需要重新编译进行定制。 MaxConnectionsPerChild 0 # [限制单个子进程的生命周期],即处理多少个连接后,这个进程被杀死,如果值为0表示子进程永远不会过 期,默认为 0。Available Apache HTTP Server 2.3.9 and later.The old name [MaxRequestsPerChild] is still supported. 设置为非0值的优点: 1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。 2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量 2、MPM/Worker配置 StartServers 4 # 始启动httpd时,[默认启动几个工作子进程],默认值是3 MaxRequestWorkers 256 # [并发请求最大数]。ServerLimit乘以ThreadsPerChild的结果。因此要增加MaxRequestWorkers的时 候,你必须同时增加ServerLimit的值 MinSpareThreads 75 # [最小空闲线程数],默认75 MaxSpareThreads 254 # [最大空闲线程数],默认250 ThreadsPerChild 64 # [每个子进程创建的线程数],默认值是64 MaxConnectionsPerChild 0 # [限制单个线程的生命周期]默认为 0 ServerLimit 254 # [当前最大活动进程数] Note: 1. ServerLimit(最大活动进程数) 通常要大于 MaxRequestWorkers(并发请求最大数){MaxClients} 2. StartServer(预启动进程数) X ThreadsPerChild(子进程创建的线程数) 要小于等于 ServerLimit(最大活动进程数) 3、MPM/Event配置 StartServers 3 # MaxRequestWorkers 1024 ServerLimit 16 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 64 MaxConnectionsPerChild 0 7、DSO动态模块 LoadModule MOD_NAME MOD_PATH Note: 可以使用相对路径,也可以使用绝对路径,相对路径的相对于ServerRoot指定的路径而言的。 8、站点页面资源访问控制 1、两种类型资源控制方式: 文件系统路径: # ... # ... # 支持通配符 示例: # ... # 正则表达式匹配 示例: 或者 # ... URL路径: # ... 示例: SetHandler server-status Require host example.com # ... 2、访问控制的配置 # ... Options CHAR CHAR CHAR ... AllowOverride None Require all granted Order Allow,Deny Allow from all|IP|network address|MAC address Deny from IP 1、Options CHAR CHAR CHAR ... Indexes # 缺少默认页面时,允许将站点目录中的所有文件以列表形式列出来 可以使用 "-Indexes" 关闭indexes功能 如果开启了此功能且定义了DirectoryIndex index.html,则对应目录下一定不能有index.html格式的文件 否则目录将不能显示目录索引 FollowSymLinks # 允许目录下的链接文件也予以显示,默认开启 None # 所有都不允许 All # 所有都启用 ExecCGI # 允许mod_cgi模块执行目录下的CGI脚本 Includes # 允许mod_include模块实现服务器端包含(SSI) MultiViews # 允许使用mod_negotiation实现内容协商 SymLinksIfOwnerMatch # 允许目录下的链接文件也予以显示,但链接文件属主属组与原始文件属主属组相同时才显示 2、AllowOverride None 对每个目录进行控制,更加灵活,但对性能影响很大。在被控制的目录下创建.htaccess文件,然后在此文件中定义控制属性 此配置含义是是否允许要控制的目录下的.htaccess文件中的配置覆盖当前的配置 AlloWOverride All # 允许对应目录下.htaccess文件中的控制生效。 AllowOverride None # .htaccess 文件无效 AllowOverride AuthConfig Indexes # 除了AuthConfig 和 Indexes ,在.htaccess文件中的其它所有指令都无法生效 在主配置文件中定义: AllowOverride All 3、访问控制 (适应于httpd-2.4) Require all granted # 接受所有访问 Require all denied # 拒绝所有访问 Require method http-method [http-method] ... # 指定允许请求的方法 Require user userid [userid] ... # 设置指定的用户可以访问 Require group group-name [group-name] ... # 这只指定用户组访问 Require valid-user # 配置的所有用户都可以访问 Require ip 10 172.20 192.168.2 # 指定IP地址范围可以访问 Require not ip 10 172.20 192.168.2 # 指定IP地址范围可以访问 4、基于IP控制 Order Allow,Deny Allow from all|IP|network address/32|MAC address Deny from all|IP|network address/16|MAC address Note: Order Allow,Deny是定义生效顺序,后面的为默认法则,如果Allow和Deny都匹配,则后面的生效 5、基于用户的访问控制 Note:现在大多数站点都是通过表单认证,此种方法是基于HTTP协议进行认证的。 虚拟用户:为了访问特定资源而设立的用户账号密码,这些账号密码可以存放到文件或者数据库中。 认证过程:1.认证质询(WWW-Authenticate) 响应码为401,先拒绝客户端的请求,然后要求提供账号和密码 2.认证(Authorization) 客户端输入账号和密码再次发送报文 认证类型: basic:基本认证,账号和密码是明文发送 digest:摘要认证,哈希编码后发送 安全域:需要用户认证后才能访问的路径 配置示例(基于用户认证,文件存储账号密码,基于basic方法认证): # 配置 Options None AllowOverride None AuthType Basic AuthName "输入账号密码" AuthUserFile "/etc/httpd/conf/.htpasswd" Require valid-user # 表示所有用户都可以登录,也可以罗列用户名,指定允许登录的用户名 # 提供账号和密码 htpasswd -c -m /etc/httpd/conf/.htpasswd USERNAME # 创建账号密码信息文件及用户 -c 表示创建用户账号且自动创建保存账号密码的文件 htpasswd -m /etc/httpd/conf/.htpasswd USERNAME # 创建用户 -m 表示将密码使用 md5 加密的方式存放 -s sha加密算法 htpasswd -D passwdfile username passwd # 删除用户 配置示例(基于组进行认证): Options None AllowOverride AuthConfig AuthType Basic AuthName "输入账号密码" AuthUserFile "/etc/httpd/conf/.htpasswd" AuthGroupFile "/etc/httpd/conf/.htgroup" Require group GroupName 创建组文件:组文件的每一行包含一个组名称,后跟冒号,后跟成员用户名,以空格分隔。 例:mygroup: bob joe anne 9、定义默认主页面 DirectoryIndex index.html index.html.var. . . Note: 默认主页面可有多个,如果第一个格式的文件没有,则按顺序查找第二个格式的文件 10、日志功能 日志文件默认在/var/log/httpd/目录下 错误日志: ErrorLog "logs/error_log" # 错误日志的保存位置 LogLevel warn # 错误日志等级,日志级别有:debug,info,notice,warn,error,crit,alert,emerg 访问日志: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined # 定义了日志的格式 LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio CustomLog "logs/access_log" combined # 定义访问日志的路径及格式combined是日志格式的名称 日志格式: 官方文档:http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats %h # 客户端地址 %l # 远程登录名,通常日志显示为"-"符号,启用mod_ident才有效,通常为减号“-” %u # 认证时的远程用户名,没有时为"-"符号 %t # 服务器收到请求时的时间 %r # First line of request,即表示请求报文的首行;记录了此次请求的"方法","URL"以及协议版本 %>s # 响应状态码 %m # 访问的方法 %U # 访问的URL %b # 响应报文的长度,单位是字节,不包括响应报文http首部 %{head—name}i # 记录指定请求报文首部的内容(value) %{Referer}i # 请求报文中首部"referer"的值;即从哪个页面中的超链接跳转至当前页面的 %{User-Agent}i # 请求报文中首部"User-Agent"的值;即 发出请求的应用程序 11、路径别名 例如站点文件资源路径在/var/www/html/images/目录,我们试图通过此路径访问这个路径之外的资源,就需要定义路径别名。 alias "/images" "/data/images_1" Require all granted Note: In particular, if you are creating an Alias to a directory outside of your DocumentRoot, you may need to explicitly permit access to the target directory. "/images" 为URL路径,"/data/images_1" 为别名的路径 12、设定默认字符集 AddDefaultCharset On|Off|charset Note: AddDefaultCharset On启用默认字符集是iso-8859-1,中文字符集还有utf-8,GBK, GB2312, GB18030 AddDefaultCharset的状态默认的off 13、指定主机名 ServerName [scheme://]fully-qualified-domain-name[:port] 14、虚拟主机的配置 一个物理服务器提供多个站点,中心主机和虚拟主机不能同时存在。使用虚拟主机前,需要关闭默认中心主机。DocumentRoot "/var/www/html"关闭中心主机 1.基于不用的IP实现 ServerAdmin webmaster@www1.example.com # ServerAdmin email-address|URL DocumentRoot "/www/vhosts/www1" ServerName www1.example.com # ServerName [scheme://]fully-qualified-domain-name[:port] ErrorLog "/www/logs/www1/error_log" CustomLog "/www/logs/www1/access_log" combined ServerAdmin webmaster@www2.example.org DocumentRoot "/www/vhosts/www2" ServerName www2.example.org ErrorLog "/www/logs/www2/error_log" CustomLog "/www/logs/www2/access_log" combined 2.基于不同主机名(FQDN)实现 (最常用的) Note:httpd-2.2 需要开启配置指令 NameVirtualHost addr[:port] ServerName host.example.com DocumentRoot "/www/docs/host.example.com" ServerAdmin webmaster@host.example.com ServerAlias server server2.example.com server2 ErrorLog "logs/host.example.com-error_log" TransferLog "logs/host.example.com-access_log" ServerName haha.example.com DocumentRoot "/www/docs/host.example.com" ServerAdmin webmaster@host.example.com ServerAlias server server2.example.com server2 ErrorLog "logs/host.example.com-error_log" TransferLog "logs/host.example.com-access_log" 3.基于不同的port实现 ServerAdmin webmaster@www2.example.org DocumentRoot "/www/vhosts/www2" ServerName www2.example.org ErrorLog "/www/logs/www2/error_log" CustomLog "/www/logs/www2/access_log" combined ServerAdmin webmaster@www2.example.org DocumentRoot "/www/vhosts/www2" ServerName www2.example.org ErrorLog "/www/logs/www2/error_log" CustomLog "/www/logs/www2/access_log" combined 15、用户目录。http://Server_IP/~Username/访问 UserDir disabled # 禁用 UserDir enabled user1 user2 user3 UserDir "public_html" "/usr/web" "http://www.example.com/" "public_html"是用户家目录的目录名称。所有位于此目录中的文件都可以使用,用户的家目录需要给用户赋予执行权限 16、服务器status页面 内生的status信息,且可以通过web页面显示。 《参见博客xuejinwei.com》 启用服务器状态。mod_status.so模块支持。通过/server-status路径访问 SetHandler server-status Require user status AuthName "enter passwd:" AuthType Basic AuthUserFile "/etc/httpd/conf/.htpasswd" mod_status模块可以让管理员查看服务器的执行状态,它通过一个HTML页面展示了当前服务器的统计数据。这些数据通常包括但不限于: (1) 处于工作状态的worker进程数; (2) 空闲状态的worker进程数; (3) 每个worker的状态,包括此worker已经响应的请求数,及由此worker发送的内容的字节数; (4) 当前服务器总共发送的字节数; (5) 服务器自上次启动或重启以来至当前的时长; (6) 平均每秒钟响应的请求数、平均每秒钟发送的字节数、平均每个请求所请求内容的字节数; 17、使用压缩模块 使用压缩模块压缩页面优化传输速度:在传输之前对资源进行压缩,节约带宽资源 1、前提:启用过滤器;指定压缩文件类型;定义压缩比; 2、实现压缩功能的模块:deflate_module 3、配置 # ··· LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so 打开httpd.conf后,先将上面两行配置前面的#号去掉,这样apache就会启用这两个模块,其中mod_deflate是压缩模块,就是对要传输到客户 端的代码进行gzip压缩;mod_headers模块的作用是告诉浏览器页面使用了gzip压缩,如果不开启mod_headers那么浏览器就会对gzip压缩过的 页面进行下载,而无法正常显示。 # httpd-2.4 DeflateCompressionLevel 9 # 压缩级别,数值约大压缩效率越高,越消耗CPU资源,值为1-9 SetOutputFilter DEFLATE # 启用过滤器功能 # 过滤文件格式,对此类型文件压缩 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary # 设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩 SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary # 同上,就是设置不对exe,tgz,gz。。。的文件进行压缩 SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary # 设置对pdf|mov|avi|mp3|mp4|rm为后缀的文件不压缩 BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.x 有一些问题,所以只压缩文件类型是text/html的 BrowserMatch ^Mozilla/4.0[678] no-gzip # Netscape 4.06-4.08 有更多的问题,所以不开启压缩 BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # IE浏览器会伪装成 Netscape ,但是事实上它没有问题 4、测试压缩效果 curl -o test.gz -H "Accept-Encoding:gzip,deflat" http://192.168.56.10/index.php?content=ERP&submit=ok zcat test.gz > test 比较 test 和 test.gz的大小区别,体验压缩效果。 5、示例 # 针对URL进行选择匹配压缩 # Insert filter SetOutputFilter DEFLATE # 启用压缩 # 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 \bMSIE !no-gzip !gzip-only-text/html # Don't compress images SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary # 对URL进行匹配 # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary 18、HTTPS 《参见博客xuejinwei.com》 《Linux Network/网络通信安全、openSSL、openssH》 Note: 1、网页数据加密发送。基于SSL/TLS、HTTPS一起实现的。 2、SSL:Secure Socker Layer SSLv3 4、https是加密以后是二进制格式 5、SSL会话是基于IP地址进行的,不支持基于FQDN的虚拟主机上实现 6、基于mod_ssl模块实现对ssl的支持,安装mod_ssl模块,yum install mod_ssl 测试工具: openssl s_client -connect www.xuejinwei.com 443 19、apache反向代理 ProxyPass "/" "http://172.18.26.1" ProxyPassReverse "/" "http://172.18.26.1" ProxyPassReverse "/wordpress" "http://172.18.26.1/ABC" # 可以对特定URL进行反向代理 ProxyPassReverse "/wordpress" "http://172.18.26.1/ABC:8080" # 可以对特定URL进行反向代理 文档示例: ProxyPass http://backend.example.com/ ProxyPass ! ProxyPass /mirror/foo/i ! ProxyPass /mirror/foo http://backend.example.com 20、SetHandler 解释:强制所有匹配的文件被一个指定的处理器处理 示例: 如果您想当http://servername/status被请求时,服务器显示一个状态报告,您可以将下面的语句放入httpd.conf里面 SetHandler server-status 使用此指令为具有特定文件扩展名的文件配置特定处理程序 SetHandler application/x-httpd-php ================================================================================================================================================ sendfile机制 1、传统网络传输过程 (硬盘) >> (kernel buffer) >> (user buffer) >> (kernel socket buffer) >> (协议栈) 1.系统进行read()系统调用,同时产生一个上下文切换,从用户空间切换到内核空间,然后拷贝数据到内核缓冲区(kernel buffer) 2.数据从内核缓冲区拷贝到用户空间缓冲区,然后系统调用 read() 返回,这时 又产生一个上下文切换:从kernel mode 切换到 user mode 3.user buffer 的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer和 socket 相关联 4. 4 系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 user mode(第4次切换),然后DMA从 kernel buffer 拷贝数据到协议栈 (第4次拷贝) 上面4个步骤有4次上下文切换,有4次拷贝,如果能减少切换次数和拷贝次数将会 有效提升性能 2、sendfine机制 1. 系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关 的 kernel buffer。 这里没有 user mode 和 kernel mode 之间的 切换,在 kernel 中直接完成了从一个 buffer 到另一个 buffer 的拷贝。 2. DMA 把数据从 kernel buffer 直接拷贝给协议栈,没有切换, 也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里 ================================================================================================================================================ 其他工具 1、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服务器等。 1、使用 格式: curl options URL 选项: -A/--user-agent # 设置用户代理发送给服务器 -e/--referer # 来源网址 --cacert # CA证书 (SSL) --compressed # 要求返回是压缩的格式 -H/--header # 自定义首部信息传递给服务器 -I/--head # 只显示响应报文首部信息 -i # 显示响应报文首部信息及响应实体 -D/--dump-header # 将url的header信息存放在指定文件中 --limit-rate # 设置传输速度 示例:curl -o /tmp/file ftp://172.18.0.1/pub/ISOs/CentOS-6.9-x86_64-bin-DVD2.iso --limit-rate 5M --basic # 使用HTTP基本认证 -u/--user # 设置服务器的用户和密码 -o # 将网络文件保存为指定的文件中 -O # 使用URL中默认的文件名保存文件到本地 -0/--http1.0 # 使用HTTP 1.0 -L # 选项进行强制重定向 -C - # 选项可对文件使用断点续传功能 -c/--cookie-jar # 将url中cookie存放在指定文件中 curl -c cookies.file www.xuejinwei.com -x/--proxy # 指定代理服务器地址 -U/--proxy-user # 代理服务器用户和密码 -T # 选项可将指定的本地文件上传到FTP服务器上 --data/-d # 方式指定使用POST方式传递数据 2、示例 # 仅传回响应首部 curl -I www.xuejinwei.com # 指定传递给服务器的头信息 curl -H GET www.xuejinwei.com # 指定用户代理发送给服务器 curl -A User-agent www.xuejinwei.com # 指定来源网址 curl -e www.google.com www.xuejinwei.com # 保存指定文件 curl -o index.html www.xuejinwei.com # 显示一次完整的http通信过程 curl -v www.xuejinwei.me 2、压力测试工具 1、ab(ApacheBench)工具是apache自带的一个性能压力测试程序。如果没有安装apache时,可以安装yum -y install httpd-tools工具测试。 其他压力测试工具:http_load、webbench、seige、tcpcopy ab工具的使用: 命令格式: ab -option http://www.xuejinwei.me/index.html 示例: ab -k -c 200 -n 200000 http://www.xuejinwei.me/index.html 选项: -k # 启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认是没有KeepAlive -c # (concurrency)模拟并发数,即模拟同时有多少人同时访问,一次执行多少个请求。默认一次一个请求。同时访问服务器站点的连接数 -n # 总共的请求数,请求数要大于并发数 -s # 响应超时时长,默认为30秒 -w # 打印HTML格式结果 -t # 测试所进行的的最大时间,单位为秒,默认为5000。 -T # content-type 指定content-type,默认是"text/plain" -m method # 制定http请求方法,apache2.4版本支持 Server Software: Apache/2.4.6 #Web服务器软件名称及版本 Server Hostname: www.xuejinwei.me #表示请求的URL中的主机部分名称 Server Port: 80 #被测试的Web服务器的监听端口 Document Path: /index.html #请求的页面路径 Document Length: 220 bytes #请求页面大小 Concurrency Level: 200 #并发数 Time taken for tests: 790.292 seconds #测试总共花费的时间 Complete requests: 129704 #完成的请求数 Failed requests: 0 #失败的请求数 Write errors: 0 #写入错误 Non-2xx responses: 129710 #数据的头信息中含有2xx以外的状态码,则会在测试结果显示另一个名为“Non-2xx responses”这些请求并不算是失败的请求 Total transferred: 60055730 bytes #总共传输字节数,包含http的头信息等 HTML transferred: 28536200 bytes #html字节数,实际的页面传递字节数。也就是减去了Total transferred中http响应数据中头信息的长度 Requests per second: 164.12 [#/sec] (mean) #每秒处理的请求数,服务器的吞吐量,等于:Complete requests / Time taken for tests Time per request: 1218.609 [ms] (mean) #平均数,用户平均请求等待时间 Time per request: 6.093 [ms] (mean, across all concurrent requests) #服务器平均处理每个请求的时间 Transfer rate: 74.21 [Kbytes/sec] received #平均传输速率(每秒收到的速率)。可以很好的说明服务器在处理能力达到限制时,其出口带宽的需求量 Connection Times (ms) #压力测试时的连接处理时间。 min mean[+/-sd] median max Connect: 24 62 197.3 30 5593 Processing: 24 517 2733.2 57 101441 Waiting: 16 470 2722.3 36 101441 Total: 48 579 2747.2 83 101477 Percentage of the requests served within a certain time (ms) #每个请求都有一个响应时间,其中50%的用户响应时间小于83毫秒,66%的用户响应时间小于118毫秒,最大的响应时间小于101477毫秒 50% 83 66% 118 75% 345 80% 410 90% 907 95% 1824 98% 4018 99% 7736 100% 101477 (longest request) 3、apache服务器控制工具命令使用 apachectl stop apachectl restart apachectl status apachectl graceful-stop #apache优雅停止 apachectl configtest #检测配置文件语法。相当于apachectl -t ================================================================================================================================================ 编译安装最新版本apache2.4.25 1、apache2.4新特性 (1) MPM支持运行为DSO机制;以模块形式按需加载  (2) event MPM生产环境可用  (3) 异步读写机制  (4) 支持每模块及每目录的单独日志级别定义  (5) 每请求相关的专用配置  (6) 增强版的表达式分析式  (7) 毫秒级持久连接时长定义  (8) 基于FQDN的虚拟主机不需要NameVirutalHost指令  (9) 新指令,AllowOverrideList  (10) 支持用户自定义变量  (11) 更低的内存消耗 2、下载 $ wget http://mirrors.hust.edu.cn/apache//httpd/httpd-2.4.25.tar.gz $ tar -xf httpd-2.4.25.tar.gz $ cd httpd-2.4.25 参考configure配置源代码树文档:http://httpd.apache.org/docs/2.4/programs/configure.html Optional Features选项中,--disable的选项默认是开启的,添加此选项关闭。--enable的选项默认是关闭的,添加--enable选项开启。 apache2.4版本支持将MPM模块构建为可动态加载的DSO模块 --enable-mpms-shared=MPM-LIST 表示将MPM模块编译为可动态加载的模块,MPM-LIST可以是MPM模块名称例如--enable-mpms-shared="worker event prefork" 或者--enable-mods-shared=all --enable-mods-shared=MODULE-LIST 定义要[启用]并[构建]为动态共享模块的模块列表。MODULE-LIST可以是模块名称,也可以是"all" | "most" | "few" | "reallyall" 这几个值。 3、编译 方案1编译配置: 分别编译apr、和apr-util ,在编译时,使用--with-apr=/path/to/apr --with-apr-util=/path/to/apr-util 指定apr和apr-util路径。 # 编译apr $ tar xf apr-1.5.0.tar.gz $ cd apr-1.5.0 $ ./configure --prefix=/usr/local/apr $ make && make install # 编译apr-util $ tar xf apr-util-1.5.3.tar.gz $ cd apr-util-1.5.3 $ ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ $ make && make install # 配置编译参数 ./configure \ --prefix=/usr/local/apache24 \ # 指定安装路径 --enable-so \ # 开启DSO功能,默认将自动开启 --enable-mods-shared=most \ # 将编译大多数模块并构建为DSO模块 --enable-mpms-shared=all \ # 支持当前平台上动态加载的所有MPM,并将其构建为DSO模块 --with-mpm=event \ # 选择服务器的默认MPM模块 --enable-rewrite \ # 开启URL的重写 --enable-cgi \ # 支持CGI --enable-ssl \ # 支持SSL/TLS --enable-deflate \ # 压缩压缩模块 --with-pcre \ # 支持正则表达式 --with-apr=/usr/local/apr \ # 指定apr路径 -with-apr-util=/usr/local/apr-util # 指定apr-util路径 方案2编译配置: # yum install -y pcre-devel # wget http://mirror.bit.edu.cn/apache/apr/apr-1.5.2.tar.gz # tar -xf apr-1.5.2.tar.gz # mv apr-1.5.2 httpd-2.4.25/srclib/apr # wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.5.4.tar.gz # tar -xf apr-util-1.5.4.tar.gz # mv apr-util-1.5.4 httpd-2.4.25/srclib/apr-util ./configure \ --prefix=/usr/local/apache24 \ --enable-so \ --enable-mods-shared=most \ --enable-mpms-shared=all \ --with-mpm=event \ --enable-rewrite \ --enable-cgi \ --enable-ssl \ --enable-deflate \ yum groupinstall "Development Tools" yum install pcre-devel yum install zlib zlib-devel yum update openssl yum install openssl-devel 成功的配置: ./configure \ --prefix=/usr/local/apache24 \ --enable-so \ --enable-mods-shared=most \ --enable-mpms-shared=all \ --with-mpm=event \ --enable-rewrite \ --enable-cgi \ --enable-ssl \ --enable-deflate \ --with-pcre make && make install 4、后续工作 输出二进制程序 # vim /etc/profile.d/httpd.sh export PATH=/usr/local/apache/bin:$PATH 导出头文件 ln -sv /usr/local/apache24/include /usr/include/httpd 导出库文件 echo "/usr/local/apache2/lib" > /etc/ld.so.conf.d/httpd.conf ldconfig -v #重新加载库文件 ldconfig -p #显示加载的库文件 导出man文档 可以添加路径查看: man -M /path/to/ Common 例如: man -M /usr/local/apache24/man httpd 或者 MANDATORY_MANPATH /usr/local/apache24/man 创建apache用户和组 useradd -s /sbin/nologin -M apache 5、添加服务脚本 [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target Documentation=man:httpd(8) Documentation=man:apachectl(8) [Service] Type=simple ExecStartPre=/usr/local/apache24/bin/httpd -t ExecStart=/usr/local/apache24/bin/httpd $OPTIONS -DFOREGROUND ExecStartPost=/home/status.sh ExecReload=/usr/local/apache24/bin/httpd $OPTIONS -k graceful ExecStop=/bin/kill -WINCH ${MAINPID} KillSignal=SIGCONT PrivateTmp=true [Install] WantedBy=multi-user.target (注:手动编写服务脚本时,注意服务类型Type的选择,否则可能会无法启动。修改完服务脚本后要重新加载systemctl daemon-reload) 编写自定义的 service 文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。 Type=simple:(默认值)systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动, 除非该服务是socket 激活型。 Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动 方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程。 Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务 进程退出之后仍然认为服务处于激活状态。 Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。 Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。 Type=idle:systemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似 6、apr、apr-util介绍 APR(Apache Portable Runtime)。Apache可移植运行库,APR提供了一组API,映射到底层操作系统。如果底层OS不支持某个特别的函数, APR自己会提供一个替代品。,APR可以确保程序的跨平台可移植性。apr-util在apr的基础上提供了更多的数据结构和操作系统封装接口。 APR(Apache portable Run-time libraries,Apache可移植运行库) 主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层 支持接口库。在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数 随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来, Apache仅仅是使用 APR而已。目前APR主要还是由Apache使用,由于APR的较好的移植性,因此一些需要进行移植的C程序也开始使用APR,开源 项目比如用于服务器压力测试的Flood loader tester,该项目不仅仅适用于Apache,http://httpd.apache.org/test/flood ================================================================================================================================================ HTTP协议 1、HTTP方法:请求方式 安全的方法;GET、HEAD、PUT、POST、DELETE、OPTIONS、TRACE 扩展的方法:LOCK、MKCOL、COPY、MOVE GET:请求获取一个资源,需要服务器发送 HEAD:和GET相似,但不需要服务器发送资源,仅传回响应首部 POST:支持HTML表单提交,表单中有用户填入数据,数据发送到服务器,有服务器存储 PUT:向服务器写入文档 DELETE:请求删除url指向的文件 OPTIONS:探测服务器端对某资源支持的请求方法 TRACE:跟踪请求经过的防火墙、代理或者网关 2、请求报文格式 ......... 3、响应报文格式 ......... 4、HTTP报文头部 通用首部:请求和响应都可以使用 Connection:定义C/S之间关于请求/响应的有关选项 Via:显示报文经过的中间节点 Cache-Control:缓存指示 请求首部: Client-IP:客户端IP Host:请求的主机号和端口号,虚拟主机环境下用于不同的主机 Referer:指明请求当前资源的文档的url User-Agent:用户代理 Accept:用户标明客户自己更倾向于使用方式 Accept-charset:支持使用的字符集 Accept-Encoding:支持的编码方式 Accept-Language:支持使用的语言 条件请求首部: Expect: If-Modified-Since:是否在指定的时间以来是否修改过资源 If-None-Match: 安全相关的首部: Authorization:客户端提交给服务器的认证数据,如账号密码 Cookie:客户端发给服务器端的身份标识 响应首部: Age:响应持续时间 Server:向客户端标明服务器程序名称和版本 协商首部: Accept-Ranges:对当前资源来说,服务器所能接受的范围类型 Vary:首部列表,服务器会根据列表中的内容挑选出最适合的版本发送给客户端 和安全相关的: Set-cookie:服务器在某客户端第一次请求时发给其他的令牌 www-Authorization:质询,要求客户端提供账号密码 实体首部:用于指定实体属性 Location:资源的新位置 Allow:允许对此资源使用的请求方法 内容首部: Content-Encoding: Content-Language: Content-Length: Content-Location:资源所处实际位置 Content--Range:类型的范围 CONtent-Type:内容类型 缓存首部: ETag:实体标签 Expires:过期时间 Last-Modified:上一次修改时间 扩展首部:非标准首部 5、httpd相关原理 http协议是一种无状态的协议 1、优化机制 1、mmap:可以让进程直接访问内核Cache空间读取数据 2、sedfile:让内核直接构建响应报文,然后发给请求方。 3、写入缓冲 HTTP原理 1、http协议:http协议及响应、请求报文详解、web请求的具体过程 2、httpd 安装、介绍、MPM三种模块及其配置 3、httpd 详细配置指令 4、https的实现。私有CA、SSL协议 % telnet www.joes-hardware.com 80 Trying 161.58.228.45... Connected to joes-hardware.com. Escape character is '^]'. GET /tools.html HTTP/1.1 Host: www.joes-hardware.com HTTP 头部: Accept 告诉 WEB 服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type Accept-Charset 浏览器申明自己接收的字符集 Accept-Encoding 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate) Accept-Language 浏览器申明自己接收的语言语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。 Accept-Ranges WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。 Age 当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。 WWW-Authenticate 来自服务器的对客户端的质询列表 Authorization 当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。 Cache-Control 请求:no-cache:(不要缓存的实体,要求现在从WEB服务器去取) max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象) max-stale:(可以接受过去的对象,但是过期时间必须小于 max-stale 值) min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象) 响应:public:(可以用 Cached 内容回应任何用户) private:(只能用缓存内容回应先前请求该内容的那个用户) no-cache:(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端) max-age:(本响应包含的对象的过期时间) ALL:(no-store不允许缓存) Connection: 请求:close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。 keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。 响应:close(连接已经关闭)。 keepalive(连接保持着,在等待本次连接的后续请求)。 Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。例如:Keep-Alive:300 Content-Encoding WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip Content-Language WEB 服务器告诉浏览器自己响应的对象的语言。 Content-Length WEB 服务器告诉浏览器自己响应的对象的长度。例如:Content-Length: 26012 Content-Range WEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。例如:Content-Range: bytes 21010-47021/47022 Content-Type WEB 服务器告诉浏览器自己响应的对象的类型。例如:Content-Type:application/xml ETag 就是一个对象比如URL的标志值,就一个对象而言,比如一个 html 文件,如果被修改了,其 Etag 也会别修改,所以ETag 的作用跟 Last-Modified 的作用差不多,主要供 WEB 服务器判断一个对象是否改变了。比如前一次请求某个 html 文件时,获得了其ETag,当 这次又请求这个文件时,浏览器就会把先前获得的 ETag 值发送给 WEB 服务器,然后 WEB 服务器会把这个 ETag 跟该文件的当前 ETag 进行对比,然后就知道这个文件有没有改变了。 Expired WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。是 HTTP/1.0的头部。例如:Expires:Sat, 23 May 2009 10:02:12 GMT Expect 允许客户端列出某请求所要求的服务器行为 Client-IP 客户端IP Cookie 客户端向服务器发送cookie Cookie2 用于说明请求端支持的cookie版本 Set-Cookie 向客户端设置cookie Set-Cookie2 以上面相似 Host 客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。例如:Host:rss.sina.com.cn If-Match 如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。 If-None-Match 如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。 If-Modified-Since 如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。 例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT If-Unmodified-Since 如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。 If-Range 浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请 求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。 Last-Modified WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。 例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT Location WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。 例如:Location:http://i0.sinaimg.cn/dy/deco/2008/0528/sinahome_0803_ws_005_text_0.gif Pramga 主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。例如:Pragma:no-cache Proxy-Authenticate 代理服务器响应浏览器,要求其提供代理身份验证信息。Proxy-Authorization:浏览器响应代理服务器的身份验证请求,提供自己的身份信息。 Range 浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546- Referer 浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL。例如:Referer:http://www.sina.com/ Server WEB 服务器表明自己是什么软件及版本等信息。例如:Server:Apache/2.0.61 (Unix) User-Agent 浏览器表明自己的身份(是哪种浏览器) 例如:User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2、0、0、14 Transfer-Encoding WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked) 例如:Transfer-Encoding: chunked Vary WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。假如源WEB服务器在接到第一 个请求消息时,其响应消息的头部为:Content- Encoding: gzip; Vary: Content-Encoding那么 Cache 服务器会分析后续请求消息的头部 ,检查其 Accept-Encoding,是否跟先前响应的 Vary 头部值一致,即是否使用相同的内容编码方法,这样就可以防止 Cache 服务器用自己 Cache里面压缩后的实体响应给不具备解压能力的浏览器。例如:Vary:Accept-Encoding Via 列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。当客户端请 求到达第一个代理服务器时,该服务器会在自己发出的请求里面添 加 Via 头部,并填上自己的相关信息,当下一个代理服务 器收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via 头部,并把自己的相关信息 加到后面,以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部,就知道该请求所经过的路由。 例如:Via:1.0 236.D0707195.sina.com.cn:80 (squid/2.6.STABLE13) ================================================================================================================================================ 资源限定 ulimit -[S|H]a #显示当前系统的资源限定,默认显示的是软限定 core file size (blocks, -c) 0 #最大的转储文件大小,(KB),默认是0,代表不产生转储文件 data seg size (kbytes, -d) unlimited #进程数据段大小,(KB) scheduling priority (-e) 0 #优先级[-20-19] file size (blocks, -f) unlimited #进程可以创建的文件最大值(blocks) pending signals (-i) 3828 # 进程最大挂起/阻塞的信号量数量 max locked memory (kbytes, -l) 64 #最大可加锁的内存的大小(KB)。 max memory size (kbytes, -m) unlimited #使用最大的内存值(KB) open files (-n) 1024 #单个进程文件打开数 pipe size (512 bytes, -p) 8 #指定管道缓冲区大小(KB) POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 #进程的栈的最大值(KB) cpu time (seconds, -t) unlimited #进程使用CPU的时间,(秒) max user processes (-u) 3828 #单一用户可以使用的最大进程/线程(process)数量 virtual memory (kbytes, -v) unlimited #进程最大可用的虚拟内存,以 Kbytes 为单位 file locks (-x) unlimited 建议设置unlimited: 数据段长度:ulimit -d unlimited 最大内存大小:ulimit -m unlimited 堆栈大小:ulimit -s unlimited CPU 时间:ulimit -t unlimited 虚拟内存:ulimit -v unlimited 使用命令的限定最对当前用户使用的环境起作用,可以指定限定的是软限定还是硬限定用户重新登录或者重启系统都会失效。 需要限定永久生效,必须修改配置文件/etc/security/ulimit.conf或者重新创建配置文件放入/etc/security/ulimit.d目录下。 指定修改任何值:ulimit -[S|H][c|d|e|....] value [S|H] #指定修改的是软限定还是硬限定 [c|d|e|....] #制定限定项 # # #Where: # can be: # - a user name # - a group name, with @group syntax # - the wildcard *, for default entry # - the wildcard %, can be also used with %group syntax, # for maxlogin limit # # can have the two values: # - "soft" for enforcing the soft limits # - "hard" for enforcing hard limits # # can be one of the following: # - core - limits the core file size (KB) # - data - max data size (KB) # - fsize - maximum filesize (KB) # - memlock - max locked-in-memory address space (KB) # - nofile - max number of open file descriptors # - rss - max resident set size (KB) # - stack - max stack size (KB) # - cpu - max CPU time (MIN) # - nproc - max number of processes # - as - address space limit (KB) # - maxlogins - max number of logins for this user # - maxsyslogins - max number of logins on the system # - priority - the priority to run user process with # - locks - max number of file locks the user can hold # - sigpending - max number of pending signals # - msgqueue - max memory used by POSIX message queues (bytes) # - nice - max nice priority allowed to raise to values: [-20, 19] # - rtprio - max realtime priority 参考: 核心转储:https://zh.wikipedia.org/wiki/%E6%A0%B8%E5%BF%83%E8%BD%AC%E5%82%A8 数据段:http://www.developersite.org/903-359957-bss%E6%AE%B5 ulimit 文件系统及程序限制 -a 后面不接任何选项与参数,可列出所有的限制额度 -n [N] 显示或限定能打开的最大的文件数 -u 单一用户可以使用的最大进程(process)数量。 -H hard limit ,硬限制。严格的设置,必定不能超过这个设置的数值; -S soft limit ,软限制。警告的设置,可以超过这个设置值,但是若超过则有警告讯息。在设置上,通常 soft 会比 hard 小, 举例来说,soft 可设置为 80 hard设置为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时, 系统会有警告讯息通知你! -c 当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),这种文件就被称为核心文件(core file)。 此为限制每个核心文件的最大容量。 -f 此 shell 可以创建的最大文件大小(一般可能设置为 2GB)单位为 KBytes ========================================================================================================================================== ./configure \ --enable-exception-hook \