首页 > 代码库 > apache工作机制,压缩,虚拟主机,用户认证
apache工作机制,压缩,虚拟主机,用户认证
从服务器角度一次web资源请求具体过程
建立连接:tcp三次握手
接收请求
处理请求
访问资源
构建响应报文
发送响应
记录日志
===================================================================
httpd工作模型
阻塞模型,单进程模型。缺点:每次只能响应一个请求,对于现代的高并发无满足
只有一个进程,每次只能响应一个用户的请求 。
多进程模型,缺点:不停的创建和收回进程,进程间切换也耗费时间。
httpd监听在套接字上,每当一个客户端请求,它会生成一个子进程来响应,子进程用连接套接字来标记与客户端的连接,处理客户端的请求。由主进程的监听套接字与客户端通信。
多进程进程池模型, 缺点:进程间切换需要保存现场等,在内核空间耗费大量时间。
httpd启动时会事先启动一批进程,当多个客户端发起请求时,找一个空间进程响应。当响应完成,该进程并不会回收,而是标记为空闲进程,以等待下次响应请求。有了进程池可以控制并发请求量,它可以控制最多可以启动多少个进程。
复用的I/O机制:
用单个线程来响应用户讲求,线程比进程更小的单位,更轻量级,属于进程内部的执行流,可以共享进程内容的资源。线程还是需要不停的切换,不用保护现场。 (linux进程很轻量级,线程和进程区分不是很明显,很多情况下这种机制并不一定会比多进程切换性能好。)
复用的I/O机制:在进程内部使用某种算法,让一个线程可以同响应多个请求,使用事件驱动机制(event),来得出响应完成于否。这样就可以在多核心的cpu上绑定每个线程运行在一个cpu上,从而减少进程切换。所有请求都由这一个线程来响应。(nginx使用这种模型)
=============================================================
httpd的特性
高度模块化:核心程序与模块组成
DSO:Dynamic Shared Object.模块可以动态装卸载
MPM:Multipath Processing Module。多道处理模块,由多个模块组成,
prefork:每个进程响应一个用户请求,提供一个进程池,预先生成多个空闲进程。select():这种机制最稳定,但响应并发数最少,最多只能响应1024个。
worker:启动多个进程,每个进程生成多个线程,线程响应用户请求
event:2.2中为实验性的版本,2.4为正式可用。启动多个线程,每个线程响应多个请求。减少了上下文切换。基于event-driven事件驱动机制,使一个进程响应多个用户请求。
丰富用户认证
基于认证:使用明文认证
摘要认证:使用用户名和密码的特征码认证,应用不多,很多浏览器不支持
支持CGI:原生支持perl CGI
支持虚拟主机:支持ip,端口,主机名的虚拟主机
反向代理:文件代理,二进制代理,负载均衡
用户站点
路径别名
支持第三方模块
====================================================================
rpm安装httpd后,经常需要打交道的文件。
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/*.conf 辅助配置文件
/etc/rc.d/init.d/httpd 服务脚本
/etc/sysconfig/httpd 服务脚本的配置文件
/etc/rc.d/init.d/htcacheclean httpd做为缓存服务器时,用来清理缓存的脚本
/etc/lib64/httpd/modules httpd模块的目录,(/etc/httpd/modules是它的链接)
/usr/sbin/httpd httpd的主程序
/usr/sbin/apachectl 用来控制httpd服务启动关闭,和查看httpd运行状态的程序
/usr/sbin/httpd.worker 启动worker的工作模式,默认启动 prefork模式。切换模式可修改启动脚本实现。
/usr/sbin/httpd.event 启动基于event的工作模式 (2.2处于试验阶段,不推荐使用)
/var/log/httpd/ 日志文件目录,分两个一个是访问日志,一个是错误日志
access_log:访问日志,记录用户访问日志
error_log:错误日志,刻录程序运行时的状态,日志有记录级别。
/var/www/html 站点文档根目录。可以在配置文件中修改。
/var/www/html/cgi-bin cgi执行程序根目录。cgi方式一般很少使用,安全性比较差。
====================================================================
常用命令组合
#httpd -l 查看当前http进程加载的主要模块
#httpd -D DUMP_MODULES #查看http进程都加都了那此模块
#httpd -M #查看http进程都加都了那此模块
htpasswd 用户创建认证用户的
-c 创建用户时顺便把保存用户名和密码的文件也创建好,只在第一次创建用户没有保存用户的文件时使用
-m 密码使用md5加密密码
-s 使用sha加密密码
-p 不加密密码
-D 删除用户
示例: # htpasswd -m /etc/httpd/conf/.htpasswd wukui
==========================================
定义httpd的工作特性的主配置文件,有三段组成,第一段全局配置段,定义httpd进程的工作特性,和各虚拟主机共同的工作特性,第二段,网站主服务器的配置,第三段为虚拟主机的配置,第二段和第三段一般不会同时使用,默认启动主服务器配置段。配置文件不区分大小写,但linux文件系统区分大小写。
-----全局配置-----------------------------------------------------------
ServerTokens OS 如果没有访问到页面,服务器会给客户端发本机是操作系统信息,httpd程序版本信息。不安全,应当注释掉。
ServerRoot "/etc/httpd" 程序的运行目录,定义了此路径后,下面使用的其它相对路径都是相对它的
PidFile "run/httpd.pid" PID保存的文件,相对于上面定义的路径
Timeout 60 等待tcp三次握手超时时间,超过后就直接断开。
KeepAlive {On|off} 是否支持持久连接,服务器繁忙时启动反而降低性能了。
MaxKeepAliveRequests 100 在使用持久连接时,请求资源最多请个数。
KeepAliveTimeout 15 在使用持久连接时,最大请求时间,以秒为单位。与请求资源个数谁先满足谁先生效
EnableSendfile off
<IfModule prefork.c> prefork模型工作的特性
StartServers 8 在程序启动时就启动8个响应用户的进程
MinSpareServers 5 最少空闲进程,无论任何时候都要有这么多空闲进程。
MaxSpareServers 20 最多空闲进程不应该小于StartServer
ServerLimit 256 为MaxClinets最多启动进程个数,不应当大于MaxClient
MaxClients 256 最多同时允许多少个客户端连接,
MaxRequestsPerChild 4000 每个子进程在生命周期内,最多允许处理多少个请求,完成最大数后子进程会被销毁,再创建新进程
</IfModule> 封装
<IfModule worker.c> worker工作模式的特性
StartServers 4 服务启动时就启动4个进程
MaxClients 300 最大用户并发请求
MinSpareThreads 25 最少空闲线程数
MaxSpareThreads 75 最多空闲线程数
ThreadsPerChild 25 每个子进程最多可以启动多少个线程
MaxRequestsPerChild 0 每个线程最多可以处理多少个请求,0表示不做限定
</IfModule>
Listen 80 默认监听的端口,如果这里不写ip表示监听所有ip。Listen可以出现多次。比如下面
Listen 8080 如果修改端口必须重启服务才能生效,重新加载配置无法生效。
LoadModule auth_basic_module modules/mod_auth_basic.so 指定要加载的模块。格式 LoadModule 模块名称 模块文件名。这里使用相对路径,相对ServerRoot指定的路径。
Include conf.d/*.conf 指定主配置文件还有其它文件
User apache 进程以那个用户身份运行
Group apache 进程以那个组身份运行
-----主服务器配置-----------------------------------------
特别说明:
<Directory /> 尽量使用<Directory> 而非<Location>
</Directory> 上面与这个directory是成对出现的,每对为一个容器,每个容器是对某个对像做访问控制的。这个容器就是对/做访问控制的。Directory是对文件系统访问路径做访问控制。可以使用通配符,如<Directory ~ "/">
<Location /server-status> Location是对请求的URL做访问控制的。把控制的选项写到与标签中,就对/server-status生效了。
</Location>
<File /var/www/html/index.html> 用来控制单个文件的
</File>
ServerAdmin wukui@wukui.net.cn 指定管理员邮箱,在网页请求出错时,页面会显示
#ServerName www.wukui.net.cn 指定当前系统的主机名,默认没有启动。它会获取当前主机名,它会反解ip后与当前主机名对比。这时启动服务时会报个错误,主要用来指定系统主机名称的。
UseCanonicaName Off
DocumentRoot "/var/www/html" 指定站点根目录,如果使用虚拟主机。这一项需要注释掉
DirectoryIndex index.html index.php 定义页面访问的默认文件,优先级自左而右
站点路径访问控制
基于本地文件系统路径做访问控制
<Directory /> 定义一个封装容器,这个容器用来对根做访问控制。
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory />
<Directory "/var/www/html">
Options Indexes FollowSymlinks Options用来定义选项的.
Indexes 用来定义如果没有默认页面,会把当前目录下所有文件都例出来。
FollowSymlinks 跟踪符号链接文件,如果站点目录下有链接文件,会找到原文件发送给客户端。
ExecCGI 是否允许执行CGI脚本
AllowOverride None 是否执行.htaccess文件中的指令,None表示不启用任何指令 All表示执行
默认httpd2.2版本,在站点的每个目录下可以创建.htaccess文件,在这个文件中可以定义每个目录的访问权限,可以定义每个目录和文件的访问权限。一般不使用,因为比较影响httpd的性能。
Order allow,deny 做访问控制,allow为白名单,deny为黑名单,这里表示如果白名单没有匹配到,黑名单生效。
Allow from all 白名单为任何为
使用格式:Allow from 172.16.0.0/16 白名单为172.16.0.0网络所有主机
使用格式:Deny form 192.168.0.1表示拒绝192.168.0.1,黑名单优先级高于白名单。
</Directory>
基于URL访路径做访问控制
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 定义的日志格式和名称
%h 客户端主机ip地址
%l 远程登陆名 通常为-
%u 远程认证登陆时的用户名,通常为-
%t 服务器收到用户请求时的时间
\" 表示使用隐号,"有特殊意义\表示转义
%r 请求报文的起始行,有<method><request-URL><version>三部分组成
%>s 响应状态码,如404,503等
%b 响应报文的长度
%{Referer}i 记录请求由那个url链接过来的,如果为空表示直接打开的。
%{User-Agent}i 记录用户使用的浏览器类型
%{HEADER_NAME}i 记录指定首部对应的值
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
customLog logs/access_log combined 自定义访问日志文件位置。和使用的日志格式。格式由上面的LogFormat定义
KeepAlive {Off|On} 定义是否支持持久连接
KeepAliveTimeout 15 如果开启了持久连接,客户端如果没有数据传输最少多少时间内不断开
Alias /URL/ "/path/to/somewhere/" 路径别名,如果请求的url中的 包含了alias定义的/URL/,则会映射到/path/to/somewhere/。它不会局限于DocumentRoot定义的站点根目录。别名的优先级高于站点根目录。
AddDefaultCharset UTF-8 设置字符集。常用的中文字符集有GB2312 GB18030 GBK等
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 定义CGI脚本脚本的URL别名,当请求的URL带有/cgi-bin/时,httpd程序会自动定位到/var/www/cgi-bin/目录下
<Directory "/var/www/www1"> 定义一个容器,对/var/www/www1目录做特性
Options none 没有任何指定开放的功能
AllowOverride AuthConfig 表示做要做认证相关的配置
AuthType Basic 认证类型为Basic
AuthName "Admin Area." 认证名称,再提示用户输入用户名和密码的时候提示的信息
AuthUserFile /etc/httpd/conf/.htpasswd 存储用户名和密码的地方,此文件可以用htpasswd命令生成
AuthBasicProvider file 指定用户认证时使用存储用户名和密码的类型,有文件,和sql数据库和ldap等,如果不写默认使用文件。
Require valid-user 允许指定文件中那些用户登陆,valid-user表示.htpasswd文件中所有用户可以登陆。
#Require user wukui 只允许某些用户登陆的写法,多个用户间用空格隔开。
AuthGroupFile /etc/httpd/conf/.htgroup 使用组认证时指明组文件的位置。(组文件内容写法。group1: user1 user2)
Require group group1 给指定的组授权,组认证时必须把require user这个选项注释掉。
</Directory>
配置虚拟主机前需要把DocumentRoot注释掉,因为虚拟主机需要自己定义站点根目录。虚拟主机可以基于ip,端口,主机名做。三者可以同时存在,但要理清三者之间占用套接字的关系。
NameVirtualHost *:80 设定虚拟主机使用的ip。*为使用全部。如果这里只指定一个ip,那么这个ip是给基于主机名的虚拟主机使用的。基于ip的虚拟主机可以自己定义单独ip,不受这里控制。
<VirtualHost *:80> 定义虚拟主机的容器,并指定此虚拟主要监听的ip和端口
ServerName www2.stu2.com 定义虚拟主机的名称,基于主机名的虚拟主机必须有。
DocumentRoot /var/www/www2 定义虚拟主机的站点根目录
LogLevel warn 定义虚拟主机的错误日志记录级别
ErrorLog /var/log/httpd/www2.err 定义虚拟主机的错误目录名称,每个虚拟主机都就有自己独立的日志文件
CustomLog /var/log/httpd/www2.access combined 虚拟主机的访问日志文件
SetHandler server-status 为此虚拟主机启用apache的内部处理器server-status
</VirtualHost>
<Location /server-status> 定义url /server-status的访问控制选项
SetHandler server-status 开启apache的内核处理器server-status,用来监视httpd程序的运行状态,可以在浏览器访问看到
Order allow,deny 定义白名单和黑名单的优先级
Allow from 172.16.0.0/16 白名单的地址。
</Location>
------传输数据压缩配置---------------------------------------
# LoadModule deflate_module modules/mod_deflate.so 前提要确认此模块是否起用
SetOutputFilter DEFLATE 启用输出的过滤器为DEFLATE
# mod_deflate configuration
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain 对纯文本的内容启动DEFLATE过滤器启动压缩功能
AddOutputFilterByType DEFLATE text/html 对超文本类型启动压缩功能
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9 设定压缩比
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html 对于Mozilla4这样的浏览器只启用gzip算法的压缩
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip 对于Mozilla4.06, 4.07, 4.08启用no-gzip的算法压缩
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html 对于ie6不使用no-gzip和gzip-only-text/html压缩。ie6不支持。