Apache-配置、测试和调试

首先执行下面的指令列出有用的Apache配置信息php

grep -v '#' /usr/local/apache2/etc/httpd.conf |grep -v '^$'
复制代码
ServerRoot "/usr/local/apache2/" #指定守护进程httpd的运行目录, 服务器的根目录, 不要在目录结尾加'/', 配置文件内使用的目录都是以此目录为根节点, 好比modules/mod_rewrite.so就存储在/usr/local/apache2/modules
  文件夹下 Listen 8000 #服务器监听的端口
BindAddress * #绑定监听IP地址
Listen 12.34.56.78:80 #Listen参数能够指定服务器除了监视标准的80端口以外, 还监视其余端口的HTTP请求, 因为FreeBSD系统能够同时拥有多个IP地址, 所以也能够指定服务器只听取对某个BindAddress</B>的IP地址的HTTP请求,
  若是没有配置这一项, 则服务器会回应对全部IP的请求, 即便使用了BindAddress参数, 使得服务器只回应对一个IP地址的请求, 可是经过使用扩展的Listen参数, 仍然可让HTTP守护进程回应对其余IP地址的请求, 此时Listen参数
  的用法与上面的第二个例子相同, 这种比较复杂的用法主要用于设置虚拟主机, 此后能够用 VirtualHost参数定义对不一样IP的虚拟主机, 然而这种用法是较早的HTTP 1.0标准中设置虚拟主机的方法, 每针对一个虚拟主机就须要一个IP
  地址, 实际上用处并不大, 在HTTP/1.1中, 增长了对单IP地址多域名的虚拟主机的支持, 使得虚拟主机的设置具有更大的意义
PidFile logs/httpd.pid #指定的文件将记录httpd守护进程的进程号, 因为httpd能自动复制其自身, 所以系统中有多个httpd进程, 但只有一个进程为最初启动的进程, 它为其余进程的父进程, 对这个进程发送信号将影响全部的httpd进程
  PidFile定义的文件中就记录httpd父进程的进程号
Timeout 300 #定义客户程序和服务器链接的超时间隔,超过这个时间间隔(秒)后服务器将断开与客户机的链接。
KeepAlive On #在HTTP/1.0中, 一次链接只能做传输一次HTTP请求, 而KeepAlive参数用于支持HTTP1.1版本的一次链接、屡次传输功能, 这样就能够在一次链接中传递多个HTTP请求, 只有较新的浏览器才支持, 但仍是打开使用这个选项
MaxKeepAliveRequests 100 #为一次链接能够进行的HTTP请求的最大请求次数, 将其值设为0将支持在一次链接内进行无限次的传输请求, 事实上没有客户程序在一次链接中请求太多的页面, 一般达不到这个上限就完成链接了
KeepAliveTimeout 15 #测试一次链接中的屡次请求传输之间的时间, 若是服务器已经完成了一次请求, 但一直没有接收到客户程序的下一次请求, 在间隔超过了这个参数设置的值以后, 服务器就断开链接, 注意与Timeout的区别
  #一次请求后, 保持链接须要占用资源, 因此此值不能过大
ThreadsPerChild 50 #设置服务器使用进程的数目 这是以服务器的响应速度为准的, 数目太大则会变慢
MaxRequestsPerChild 30 #使用子进程的方式提供服务的Web服务, 经常使用的方式是一个子进程为一次链接服务, 这样形成的问题就是每次链接都须要生成、退出子进程的系统操做, 使得这些额外的处理过程
  占据了计算机的大量处理能力, 所以最好的方式是一个子进程能够为屡次链接请求服务, 这样就不须要这些生成、退出进程的系统消耗, Apache就采用了这样的方式, 一次链接结束
  后, 子进程并不退出, 而是停留在系统中等待下一次服务请求, 这样就极大的提升了性能,  但因为在处理过程当中子进程要不断的申请和释放内存, 次数多了就会形成一些内存垃圾,
  就会影响系统的稳定性, 而且影响系统资源的有效利用, 所以在一个副本处理过必定次数的请求以后, 就可让这个子进程副本退出, 再从原始的httpd进程中从新复制一个干净的
  副本, 这样就能提升系统的稳定性, 这样, 每一个子进程处理服务请求次数由MaxRequestPerChild定义, 缺省的设置值为30, 这个值对于具有高稳定性特色的FreeBSD系统来说是过于
  保守的设置, 能够设置为1000甚至更高, 设置为0支持每一个副本进行无限次的服务处理,  为了安全,设置为零
ExtendedStatus On #Apache服务器能够经过特殊的HTTP请求, 来报告自身的运行状态, 打开这个ExtendedStatus参数可让服务器报告更全面的运行状态信息
ServerAdmin suiyong_jie@163.com #这将在HTTP服务出现错误的条件下返回给浏览器, 以便让Web使用者和管理员联系, 报告错误
ServerName localhost #缺省状况下, 并不须要指定这个ServerName参数, 服务器将自动经过名字解析过程来得到本身的名字, 但若是服务器的名字解析有问题(一般为反向解析不正确), 或者没有正式的DNS名字, 也能够在这里指定IP
  地址, 当ServerName设置不正确的时候, 服务器不能正常启动, 一般一个Web服务器能够具备多个名字, 客户浏览器可使用全部这些名字或IP地址来访问这台服务器, 但在没有定义虚拟主机的状况下, 服务器老是以本身的正式名字回应
  浏览器, ServerName就定义了Web服务器本身认可的正式名字, 例如一台服务器名字(在DNS中定义了A类型)为 freebsd.exmaple.org.cn, 同时为了方便记忆还定义了一个别名(CNAME记录)为www.exmaple.org.cn, 那么Apache
  自动解析获得的名字就为freebsd.example.org.cn, 这样无论客户浏览器使用哪一个名字发送请求, 服务器老是告诉客户程序本身为freebsd.example.org.cn, 虽然这通常并不会形成什么问题, 可是考虑到某一天服务器可能迁移到其余
  计算机上, 而只想经过更改 DNS中的www别名配置就完成迁移任务, 因此不想让客户在其书签中使用 freebsd记录下这个服务器的地址, 就必须使用ServerName来从新指定服务器的正式名字
TypesConfig /usr/local/apache2/etc/mime.types #用于设置保存有不一样的MIME类型数据的文件名 能够用命令查看下其内容
MIMEMagicFile /usr/local/apache2/etc/magic #除了从文件的后缀出发来判断文件的MIME类型以外, Apache还能够进一步分析文件的一些特征, 来判断文件的真实MIME类型, 这个功能是由mod_mime_magic模块实现的, 它须要一个
  记录各类MIME类型特征的文件, 以进行分析判断, 上面的设置是一个条件语句, 若是载入了这个模块, 就必须指定相应的标志文件magic的位置
HostnameLookups Off #通常访问日志只会记录客户机IP, 此选项配置是否记录客户机的主机名以进行日志记录和提供给CGI程序使用 每次请求使用DNS反查询 增长系统开销
ServerSignature On #一些状况下, 例如当客户请求的网页并不存在时, 服务器将产生错误文档, 缺省状况下因为打开了ServerSignature选项, 错误文档的最后一行将包含服务器的名字、Apache的版本等信息, 有的管理员更倾向于
  不对外显示这些信息, 就能够将这个参数设置为Off, 或者设置为Email, 最后一行将替换为对ServerAdmin 的Email提示 LoadModule deflate_module modules/mod_deflate.so #要使用基于DSO的功能模块, 加载对应的模块 模块载入的顺序很重要 运行"apche -l"将列表显示Apache内建的模块 LoadModule expires_module modules/mod_expires.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule php5_module modules/libphp5.so <IfModule !mpm_netware_module> #IfModule就是若是加载了某个模块就执行其内的配置代码 <IfModule !mpm_winnt_module> User daemon #Apache进程的执行者是daemon Group daemon #Apache进程的执行者所属组为daemon </IfModule> </IfModule>
ServerName localhost ServerAdmin suiyong_jie@163.com #管理员邮箱 DocumentRoot "/htdocs" #网站的根目录, 默认状态下,全部的请求都以这个目录为基础
<Directory /> #设置服务器自己根目录(Linux的/)及其子目录具备基本权限 Options FollowSymLinks #Options指定在此目录中将使用哪些服务器特性, 里面指令均可以在前面加上"+"或者"-"来增长或者删除, None, All, Includes(容许服务器页面内嵌套页面, 好比在一个静态页面中嵌套
    <!--#include file="public/header.html"-->), Indexes(若是一个映射到目录的URL被请求, 而此目录中又没有DirectoryIndex(例如: index.html), 那么服务器会返回一个格式化后的目录列表, 若是去掉Indexes
    就不会显示目录结构), ExecCGI(容许此目录下执行CGI脚本), MultiViews(服务器执行一个隐含的文件名模式匹配, 并在其结果中选择, 好比在地址栏内输入index.php能够显示页面, 在地址栏内输入index一样能够显示
    index.php页面),FollowSymLinks不检查文件是不是符号连接(快捷方式), 若是是符号连接就解析符号连接指向真正的目录或文件(可使程序访问根目录之外的目录), 开启后会对请求的每一个目录或者文件都会进行检查, 速度变慢 AllowOverride None #当为None时.htaccess文件里的指令无效, 即不用查看这个目录下的相应访问控制文件 Order deny,allow #设定拒绝和容许的前后顺序, 若是"deny, allow"表示拒绝全部的访问, 除去明确容许的; "allow, deny"表示容许全部的, 除去明确拒绝的 Deny from all #Deny from、Allow from后能够跟IP地址, 域名, All(全部) </Directory> <Directory "/htdocs"> #/htdocs目录的权限选项设置 Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>

#以上ServerName, ServerAdmin和, ocumentRoot和Directory为一个域名下访问的状况, 如下介绍多个域名对应一台服务器(虚拟主机)的状况, 只要在hosts文件里把www.a.com和www.b.com与192.168.209.128绑定就OK了
NameVirtualHost 192.168.209.128 <VirtualHost 192.168.209.128> DocumentRoot /htdocs/win ServerName www.a.com </VirtualHost> <VirtualHost 192.168.209.128> DocumentRoot /htdocs/manager CustomLog /htdocs/manager/home-access_log common ServerName www.b.com </VirtualHost>
<Directory "/htdocs/win"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> <Directory "/htdocs/manager"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
#虚拟主机配置结束
<IfModule dir_module> DirectoryIndex index.shtml index.php index.html #设置目录默认首页 </IfModule> <FilesMatch "^\.ht"> #若是请求的文件名符合"^\.ht", 则设置如下权限, 也能够应用为"jpg|gif|png|js|css|swf", 若是要匹配文件夹则须要用DirectoryMatch Order allow,deny Deny from all Satisfy All #暂时不知道 </FilesMatch> ErrorLog "logs/error_log" #指定错误日志存放的文件 也能够经过CustomLog /var/log/httpd-access.log [common|referer|agent|combined]来配置详细的各类日志存放位置 即普通访问|引用页面|客户端记录|联合记录 LogLevel warn #用于调整记于错误日志中的信息的详细程度 <IfModule log_config_module> # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common <IfModule logio_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> CustomLog "logs/access_log" common </IfModule>
<IfModule mpm_prefork_module> #Apache有两种工做模式, prefork, worker
ServerLimit 1000 #在Apache1.3的时候加入想增长MaxClients超过256则须要在configure以前修改src/include/httpd.h中的#define HARD_SERVER_LIMIT 256, 将256改成想要的大值, 而后从新编译安装Apache, 而
    在Apache2.0中只须要添加ServerLimit列, 无须从新编译就能够增长MaxClients的值超过256 ServerLimit和MaxClients在配置文件中出现的前后顺序是不能够颠倒的
StartServers 5 #服务器启动时创建的子进程数量 在该工做模式下, 服务器启动后起动5个httpd进程(加父进程共6个, 在Linux中经过ps -ax|grep httpd命令能够看到)
MinSpareServers 5 #空闲子进程的最小数量 所谓空闲子进程就是没有正在处理请求的子进程 若是当前空闲子进程烧油MinSpareServers, Apache会以每秒一个翻倍型的速度产生新的子进程(第一秒1个, 第二秒2个, 第三秒4个)
    当有用户链接时, apache会使用一个空闲进程为该链接服务, 同时父进程会fork一个子进程, 直到内存中的空闲进程达到MaxSpareServers(那个处理请求的进程处理完后也就变成空闲进程了)
MaxSpareServers 10 #最多空闲子进程, 若是空闲子进程多于此值Apache会kill掉多于的子进程, 且此值比MinSpareServers要大, 若是比MinSpareServers小的话会自动修改成MinSpareServers+1
MaxClients 150 #此项中最重要的一个配置 Apache能够同时处理的请求 这是对Apache性能影响最大的参数 指服务于客户端请求的最大请求数, 即限制同一时间客户端最大接入请求的数量, 默认值为256, 任何超过MaxClients
    限制的请求都将进入等候队列, 一旦一个链接被释放, 队列中的请求将获得服务, 在Apache1.3中最大只能设置为256, 但在Apache2.0中, 能够经过在配置开头(必须在MaxClients以前)增长ServerLimit项目来突破256的
    限制, 此时必须MaxClients ≤ ServerLimit ≤ 20000
MaxRequestsPerChild 1000 #每一个子进程被处理多少次后被kill掉, 设为0泽表示不限制, 与上文的那个MaxRequestsPerChild是相同的, 不要重复, 推荐设为1000
</IfModule>
#上面的工做原理 首先服务启动后会建立以StartServers个数的进程, 而后等待来自客户端的请求, 咱们这里先假设从客户端来了大量的请求, 这时Apache服务器会根据自身的负载状况自动建立新进程, 若是服务器一直没有空闲进程那么它
  就会一直建立新进程, 直到知足MaxClients和ServerLimit设置的最大值, 若是来自客户端的负载没有那么大, Apache服务器将会根据MinSpareServers、MaxSpareServers和MaxRequestsPerChild设置的值来杀掉多余的
  进程, 其中每一个进程在某个肯定的时间只能维持一个链接
#而后, 在访问量高峰期, 常常会出现的状况是忽然之间发生很是多的并发链接, 而后忽然之间减小了不少访问, 若是Apache没有准备足够数量的预备进程, 那访问只能等待Apache每秒1个的新增进程, 随后又要将多余的进程删除, 那Apache
  只能一直忙于新建和销毁进程, 大大地下降了访问速度, 能够 适当增长StartServers、MinSpareServers、MaxSpareServers来使得Apache不须要一直忙于做无用功
#强烈推荐MaxRequestsPerChild不要设置为0, 设置为非0, 能够保护Apache进程免遭内存泄漏的影响, 由于你不知道运行在Apache上的应用程式在何时会出错致使内存泄漏

#能够根据服务器性能进行优化好比
#ServerLimit 1000
#StartServers 30
#MinSpareServers 30
#MaxSpareServers 45
#MaxClients 1000
#MaxRequestsPerChild 4000

#优化
#查看当前链接数
  #pgrep httpd|wc -l
#计算httpd占用内存的平均数
  #ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
  #因为基本都是静态页面, CPU消耗很低, 每进程占用内存也不算多, 大约200K
#服务器内存有2G, 除去常规启动的服务大约须要500M(保守估计), 还剩1.5G可用, 那么理论上能够支持1.5*1024*1024*1024/200000 = 8053.06368
#约8K个进程, 支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快, 其余的可能须要等待一、2秒才能连上, 而一旦连上就会很流畅(能够根据配置细想一下这句话))
#能够配置为以下
#ServerLimit 5500
#MaxClients 5000

<IfModule mpm_worker_module> #内存使用比prefork要少的多 但不完善处在于一个线程崩溃, 其余线程全玩完
  ServerLimit 12 #同上
  StartServers 2 #与上同 该模式是由线程来监听客户的链接, 当有新客户链接时, 由其中的一个空闲线程接受链接, 服务器在启动时启动两个进程, 每一个进程产生的线程数是固定的(ThreadsPerChild决定), 所以启动时
    有50个线程(进程数*ThreadsPerChild), 当50个线程不够用时, 服务器自动fork一个进程,再产生25个线程。
  MaxClients 150 #最大并发链接数
  MinSpareThreads 25 #服务器保持的最小空闲线程数 每个线程在某个肯定的时间只能维持一个链接,
  MaxSpareThreads 75 #服务器保持的最大空闲线程数
  ThreadLimit 75 #每一个子进程能够建立的线程数, 即ThreadPerChild的上限
  ThreadsPerChild 25 #每一个子进程的产生的线程数
  MaxRequestsPerChild 0 #与上同
</IfModule>
<IfModule mpm_perchild_module>
  NumServers 5 #服务器启动时启动的子进程数
  StartThreads 5 #每一个子进程启动时启动的线程数
  MinSpareThreads 5 #内存中的最小空闲线程数
  MaxSpareThreads 10 #最大空闲线程数
  MaxThreadsPerChild 2000 #每一个线程最多被请求多少次后退出, 0不受限制
  MaxRequestsPerChild 10000 #每一个子进程服务多少次后被从新fork, 0表示不受限制
</IfModule> <IfModule alias_module> ScriptAlias /cgi-bin/ "/usr/local/apache2//cgi-bin/" #它标明此目标目录下只有CGI脚本 使不在DocumentRoot目录下的内容也能成为文档树的一部分 ScriptAlias也是用于URL路径的映射, 但与Alias的
  不一样在于, ScriptAlias是用于映射CGI程序的路径, 这个路径下的文件都被定义为CGI程序, 经过执行它们来得到结果, 而非由服务器直接返回其内容, 缺省状况下CGI程序使用cgi-bin目录做为虚拟路径 </IfModule> <IfModule cgid_module> </IfModule>
Alias /icons/ "/usr/local/www/icons/" #Alias参数用于将URL与服务器文件系统中的真实位置进行直接映射, 通常的文档将在DocumentRoot 中进行查询, 然而使用Alias定义的路径将直接映射到相应目录下, 而再也不到
  DocumentRoot下面进行查询, 所以Alias能够用来映射一些公用文件的路径, 例如保存了各类经常使用图标的icons路径, 这样使得除了使用符号链接以外, 文档根目录(DocumentRoot)外的目录也能够经过使用了Alias映射,
  提供给浏览器访问, 定义好映射的路径以后, 应该须要使用Directory语句设置访问限制 <Directory "/usr/local/apache2//cgi-bin"> #配置/usr/local/apache2//cgi-bin的目录权限 AllowOverride None Options None Order allow,deny Allow from all </Directory> DefaultType text/plain #若是Web服务器不能决定一个文档的缺省类型, 这一般表示文档使用了非标准的后缀, 那么服务器就使用DefaultType定义的MIME类型将文档发送给客户浏览器, 这里的设置为text/plain, 这样设置的问题是
  若是服务器不能判断出文档的MIME, 那么大部分状况下这个文档为一个二进制文档, 但使用 text/plain格式发送回去, 浏览器将在内部打开它而不会提示保存, 所以建议将这个设置更改成application/octet-stream, 这样浏览器将提示
  用户进行保存 <IfModule mime_module> TypesConfig etc//mime.types AddType application/x-compress .Z AddType application/x-gzip .gz .tgz </IfModule> <IfModule ssl_module> SSLRandomSeed startup builtin SSLRandomSeed connect builtin </IfModule> AddType application/x-httpd-php .php .phps


复制代码
相关文章
相关标签/搜索