killerxf 发表于 2018-11-22 10:32:06

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    在使用持久连接时,请求资源最多请个数。
  KeepAliveTimeout15    在使用持久连接时,最大请求时间,以秒为单位。与请求资源个数谁先满足谁先生效
  EnableSendfile off
               prefork模型工作的特性
  StartServers 8                         在程序启动时就启动8个响应用户的进程
  MinSpareServers 5               最少空闲进程,无论任何时候都要有这么多空闲进程。
  MaxSpareServers 20               最多空闲进程不应该小于StartServer
  ServerLimit 256                     为MaxClinets最多启动进程个数,不应当大于MaxClient
  MaxClients 256                        最多同时允许多少个客户端连接,
  MaxRequestsPerChild 4000    每个子进程在生命周期内,最多允许处理多少个请求,完成最大数后子进程会被销毁,再创建新进程
                             封装
                 worker工作模式的特性
  StartServers 4                           服务启动时就启动4个进程
  MaxClients 300                        最大用户并发请求
  MinSpareThreads 25               最少空闲线程数
  MaxSpareThreads 75               最多空闲线程数
  ThreadsPerChild 25                  每个子进程最多可以启动多少个线程
  MaxRequestsPerChild 0            每个线程最多可以处理多少个请求,0表示不做限定
  
  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是对请求的URL做访问控制的。把控制的选项写到与标签中,就对/server-status生效了。
  
     用来控制单个文件的
  
  ServerAdminwukui@wukui.net.cn   指定管理员邮箱,在网页请求出错时,页面会显示
  #ServerName   www.wukui.net.cn      指定当前系统的主机名,默认没有启动。它会获取当前主机名,它会反解ip后与当前主机名对比。这时启动服务时会报个错误,主要用来指定系统主机名称的。
  UseCanonicaName      Off
  DocumentRoot "/var/www/html"       指定站点根目录,如果使用虚拟主机。这一项需要注释掉
  DirectoryIndexindex.htmlindex.php      定义页面访问的默认文件,优先级自左而右
  站点路径访问控制
  基于本地文件系统路径做访问控制
     定义一个封装容器,这个容器用来对根做访问控制。
  Options FollowSymLinks
  AllowOverride None
  
  
  
  Options Indexes FollowSymlinks    Options用来定义选项的.
  Indexes 用来定义如果没有默认页面,会把当前目录下所有文件都例出来。
  FollowSymlinks跟踪符号链接文件,如果站点目录下有链接文件,会找到原文件发送给客户端。
  ExecCGI    是否允许执行CGI脚本
  AllowOverride None    是否执行.htaccess文件中的指令,None表示不启用任何指令 All表示执行
  默认httpd2.2版本,在站点的每个目录下可以创建.htaccess文件,在这个文件中可以定义每个目录的访问权限,可以定义每个目录和文件的访问权限。一般不使用,因为比较影响httpd的性能。
  Order allow,deny    做访问控制,allow为白名单,deny为黑名单,这里表示如果白名单没有匹配到,黑名单生效。
  Allowfrom all    白名单为任何为
  使用格式:Allow from 172.16.0.0/16白名单为172.16.0.0网络所有主机
  使用格式:Deny form 192.168.0.1表示拒绝192.168.0.1,黑名单优先级高于白名单。
  
  基于URL访路径做访问控制
  ErrorLog logs/error_log 定义错误日志文件名
  LogLevelwarn    定义记录日志的级别。级别有: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   请求报文的起始行,有三部分组成
  %>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   设置字符集。常用的中文字符集有GB2312GB18030   GBK等
  ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"   定义CGI脚本脚本的URL别名,当请求的URL带有/cgi-bin/时,httpd程序会自动定位到/var/www/cgi-bin/目录下
     定义一个容器,对/var/www/www1目录做特性
  Options none                              没有任何指定开放的功能
  AllowOverride AuthConfig            表示做要做认证相关的配置
  AuthType Basic                               认证类型为Basic
  AuthName "Admin Area."            认证名称,再提示用户输入用户名和密码的时候提示的信息
  AuthUserFile /etc/httpd/conf/.htpasswd      存储用户名和密码的地方,此文件可以用htpasswd命令生成
  AuthBasicProviderfile                                     指定用户认证时使用存储用户名和密码的类型,有文件,和sql数据库和ldap等,如果不写默认使用文件。
  Require valid-user                                          允许指定文件中那些用户登陆,valid-user表示.htpasswd文件中所有用户可以登陆。
  #Require user wukui                                        只允许某些用户登陆的写法,多个用户间用空格隔开。
  AuthGroupFile /etc/httpd/conf/.htgroup       使用组认证时指明组文件的位置。(组文件内容写法。group1: user1 user2)
  Require groupgroup1                                    给指定的组授权,组认证时必须把require user这个选项注释掉。
  
  配置虚拟主机前需要把DocumentRoot注释掉,因为虚拟主机需要自己定义站点根目录。虚拟主机可以基于ip,端口,主机名做。三者可以同时存在,但要理清三者之间占用套接字的关系。
  NameVirtualHost *:80                     设定虚拟主机使用的ip。*为使用全部。如果这里只指定一个ip,那么这个ip是给基于主机名的虚拟主机使用的。基于ip的虚拟主机可以自己定义单独ip,不受这里控制。
                                            定义虚拟主机的容器,并指定此虚拟主要监听的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
  
                          定义url /server-status的访问控制选项
  SetHandler server-status                        开启apache的内核处理器server-status,用来监视httpd程序的运行状态,可以在浏览器访问看到
  Order allow,deny                         定义白名单和黑名单的优先级
  Allow from 172.16.0.0/16          白名单的地址。
  
  ------传输数据压缩配置---------------------------------------
  # 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 no-gzip                  对于Mozilla4.06, 4.07, 4.08启用no-gzip的算法压缩
  # MSIE masquerades as Netscape, but it is fine
  BrowserMatch \bMSI !no-gzip !gzip-only-text/html      对于ie6不使用no-gzip和gzip-only-text/html压缩。ie6不支持。



页: [1]
查看完整版本: apache工作机制,压缩,虚拟主机,用户认证