grep -v "#" /etc/httpd/conf/httpd.conf



ServerTokens OS    返回Server :Apache/2.0.41(unix)

servertokens 指令 

说明:配置HTTP服务器回应头,此指令控制了server回送给客户端的回应头域是否包含关于服务器OS类型和编译的模块描述信息

语法:

servertokens  major|minor|minimal|productonly|os|full


apache 启动后有9个进程,一个主进程 8个子进程主进程以root身份运行 进程ID在httpd.pid里  子进程以Apache进程运行,子进程是主进程产生的,


Apache  DSO

Apache是一个模块化设计的服务,核心只包含主要功能,扩展能通过模块实现,不同模块可以被静态编译进程序,也可以动态加载


查看模块 httpd -M

查看静态编译的程序的模块  httpd -l

如果加新的功能就需要重新编译,但是DSO不需要,可以通过Apache自带的apxs


apache MPM(multi process modules)


mpm负责实现网络监听,请求处理等功能,mpm有很多种,目的是为了在不同平台环境实现最优化的性能及稳性。

通过以下命令可以看出Apache所使用的MPM

httpd -l

httpd  -V   m默认是prefork



线程与进程的区别:

线程是指进程内的一个执行单元,也是进程内的可调度实体.

与进程的区别:

(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

(3)线程是处理器调度的基本单位,但进程不是.

4)二者均可并发执行.


进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

进程和线程的区别在于:


简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 

线程的划分尺度小于进程,使得多线程程序的并发性高。 

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点


在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.




prefork 与worker


prefork: prefork是非线程的,预生成进程型的MPM,使用多子进程,每个子进程只有一个线程,每个进程在某个时间只能维持一个连接,效率高,但内存占用量较大。。它适合于没有线程安全库,需要避免线程兼容性问题的系统


worker:是线程化多进程的MPM,每个子进程可以生成多个线程,每个线程处理一个请求。内存占用率小,适用于流量搞得http服务器。缺点,假如一个线程崩溃,整个进程连同其他任何其中线程一起死掉



Apache 中prefork的最大进程数是 在prefork的配置中

 

Apache三个配置

1 global 1 environment

2 main configuration

3 virtual host


first one class  1  

全局配置影响整个Apache


ServerTokens OS    返回Server的信息 :Apache/2.0.41(unix)

ServerRoot         "/etc/httpd"   服务的主目录   不能更改,也即是安装目录

pidfile  run/httpd.pid    主进程id的号

timeout   连接时间。


keepalived  off 是否开启TCP连接请求(是否开启持久连接功能,即客户端练到服务器下载数据完成后任然保持连接状态)   开启效率较好,默认关闭

MaxKeepAliveRequests 100          一个连接服务的最多请求次数        

KeepAliveTimeout 15   一个TCP连接两次请求时间的间,即连续连接多长时间



LISTEN 80  监听端口号,以及在那个ip上监听80端口

DSO


include   conf.d/*.conf  模块加载路径

user

group  Apache  指定Apache是以什么身份运行子进程

second   class  2 


Apache缺省服务目录主配置

serveradmin  管理员邮件地址

servername 服务器域名,也就是网站的域名

UseCanonicalName Off   是否严格使用合格域名   如果使用虚拟主机,一定要关闭

DocumentRoot "/var/www/html"  根目录  主站点目录


<Directory  /var/www/html>   主站点目录访问控制  ,缺省配置

    Options FollowSymLinks

    AllowOverride None

    Order?allow,deny

    ?Allow?from?all

</Directory>


Options:配置在特定目录使用哪些特性,常用的值和基本含义如下:

ExecCGI:?在该目录下允许执行CGI脚本。

FollowSymLinks:?在该目录下允许文件系统使用符号连接。

Indexes:?当用户访问该目录时,如果用户找不到DirectoryIndex指定的主页文件(例如index.html),则返回该目录下的文件列表给用户。 一般不建议使用 

SymLinksIfOwnerMatch: 当使用符号连接时,只有当符号连接的文件拥有者与实际文件的拥有者相同时才可以访问。

AllowOverride  None:允许存在于.htaccess文件中的指令类型(.htaccess文件名是可以改变的,其文件名由AccessFileName指令决定)

None:?当AllowOverride被设置为None时。不搜索该目录下的.htaccess文件(可以减小服务器开销)

Allow:允许访问的主机列表(可用域名或子网,例如:Allow?from?192.168.0.0/16)

Deny:拒绝访问的主机列表


Apache的MPM优化


# prefork MPM

 

<IfModule prefork.c>

StartServers       8     启动Apache时候启动的httpd进程个数

MinSpareServers    5     最小空闲的进程数

MaxSpareServers   20     最大空闲的进程数

ServerLimit      256     

MaxClients       256    最大允许连接数,即最大并发数,最大限值由serverlimit 控制

MaxRequestsPerChild  4000 子进程最大请求数,0表示不限制,推荐位1000

</IfModule>


#worker MPM

 

<IfModule worker.c>

StartServers         4   启动Apache时候启动的httpd的个数

MaxClients         300   最大并发连接数

MinSpareThreads     25   最小空闲线程数

MaxSpareThreads     75   最大空闲线程数

ThreadsPerChild     25   每个子进程产生的线程数

MaxRequestsPerChild  0   每个子进程被请求的最大次数

</IfModule>



别名设置

对于不在DocumentRoot指定的目录内的页面,既可以使用符号连接,也可以使用别名。 

Alias /error/ "/var/www/error/"    访问时候可以输入  、HTTP://www.node.com/error


<IfModule mod_negotiation.c>

<IfModule mod_include.c>

    <Directory "/var/www/error">

        AllowOverride None

        Options IncludesNoExec 

        AddOutputFilter Includes html

        AddHandler type-map var

        Order allow,deny

        Allow from all

        LanguagePriority en es de fr

        ForceLanguagePriority Prefer Fallback

    </Directory>



对Apache服务器的根访问不生成目录列表,同时指定错误页面

<locationmatch "^/$>

options-indexes

errordocument 403 /error/noindex.html

<locationmatch>

当访问服务器时候依次访问页面 index.html  index.html.var

directoryindex   index.html  index.html.var

DirectoryIndex index.html index.html.var  不指定任何首页时候,默认读取的首页


指定保护目录配置文件的名称

AccessFileName .htaccess                   分布式访问控制文件 


//指定负责处理MIME 对应格式的配置文件的存放位置 

TypesConfig /etc/mime.types 


//指定默认的MIME 文件类型为纯文本或HTML 文件 

DefaultType text/plain 

//只记录连接Apache 服务器的IP 地址,而不记录主机名

 HostnameLookups Off 


访问日志设置


ErrorLog logs/error_log     错误日志的位置

 

#LogLevel:   debug, info, notice, warn, error, crit,

 

LogLevel warn


自定义访问日志


LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%r\" %>s %b" common  #common为日志格式名称

LogFormat "%{Referer}i -> %U" referer

LogFormat "%{User-agent}i" agent 


# "combinedio" includes actual counts of actual bytes received (%I) and sent (%O); this

# requires the mod_logio module to be loaded.

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combined:io

CustomLog logs/access_log common


格式中各个参数如下

%h -客户端的IP地址或主机名

%l –The 这是由客户端 identd 判断的RFC 1413身份,输出中的符号 "-" 表示此处信息无效。

%u –由HTTP认证系统得到的访问该网页的客户名。有认证时才有效,输出中的符号 "-" 表示此处信息无效。

%t –服务器完成对请求的处理时的时间。

"%r" –引号中是客户发出的包含了许多有用信息的请求内容。

%>s –这个是服务器返回给客户端的状态码。

%b –最后这项是返回给客户端的不包括响应头的字节数。

"%{Referer}i" –此项指明了该请求是从被哪个网页提交过来的

"%{User-Agent}i" –此项是客户浏览器提供的浏览器识别信息。


用户认证的配置




<IfModule mod_userdir.c>   条件化模块判断


如果有这个模块,默认将使用这个功能

UserDir disabled

#UserDir public_html

</IfModule>





<Files ~ "^\.ht">            文件访问控制

    Order allow,deny

    Deny from all

    Satisfy All

</Files>



ServerSignature on   表示在错误页面中不显示Apache的版本

servertokens prod     在错误页面中不显示操作系统的名称


+==========================================================================================

虚拟主机

===========================================================================================

虚拟主机(VirtualHost).通常分为这样3种:

基于域名,基于端口,基于IP,以及它们的混合


下面是每种虚拟主机的配置过程


1.基于域名

这是一种最通用的情况,已经给服务器设置了多个域名,然后希望访问不同的域名来访问不同的网站文件.

修改httpd.conf的配置


 Use name-based virtual hosting.

#

NameVirtualHost *  表示在apache监听的所有IP和所有端口(此时只有80)上做多域名虚拟主机

<VirtualHost *>

    ServerAdmin xxx@xxx.com

    DocumentRoot /var/www/html/s1

    ServerName s1.domain1.com

    ErrorLog logs/ error_log

    TransferLog logs/ access_log

</VirtualHost>

 

<VirtualHost *>

    ServerAdmin xxx@ixxx.com

    DocumentRoot /var/www/html/s2

    ServerName  s2.domain1.com

    ErrorLog logs/error_log

    TransferLog logs/access_log

</VirtualHost>




2.基于端口

通过访问同一个IP(或者域名)的不同端口来访问到不同的文件

对httpd.conf做如下修改

增加监听口

Listen 80

Listen 81

将之前做的多域名虚拟主机去掉(因为此时是用IP加端口来访问的),即

# Use name-based virtual hosting.

#

# NameVirtualHost *    注释掉这句话

以下是虚拟主机配置(注意下面的配置部分我并没用ServerName字段)

<VirtualHost *:80>

    ServerAdmin xxx@xxx.com

    DocumentRoot /var/www/html/s1

    ErrorLog logs/error_log

    TransferLog logs/ access_log

</VirtualHost>

 

<VirtualHost *:81>

    ServerAdmin xxx@xxx.com

    DocumentRoot /var/www/html/s2

    ErrorLog logs/ error_log

    TransferLog logs/ access_log

</VirtualHost>

 



混合实验

看到这里我们就可以做一个稍微复杂的实验,在不同的端口上做不同域名的访问.例如

在80上访问s1.domain1.com和s2.domain1.com

在81上访问s3.domain2.com和s4.domain2.com当然这样访问是要带端口号的,上面因为是80默认端口所以不需要写端口号

访问这四个域名+端口分别访问到不同的页面.

配置过程

首先在bind上增加两个域名指向服务器. s3.domain2.com,s4.domain2.com,增加之后记得要重启bind.

然后修改httpd.conf文件

增加监听口

Listen 80

Listen 81

虚拟主机设置

# Use name-based virtual hosting.

#

NameVirtualHost *:80

NameVirtualHost *:81

表示要在本机的所有IP的80和81上面做多域名(NameVirtualHost:即为名称虚拟主机的意思)

<VirtualHost *:80>

    ServerAdmin xxx@xxx.com

    DocumentRoot /var/www/html/s1

    ServerName s1.domain1.com

    ErrorLog logs/ error_log

    TransferLog logs/ access_log

</VirtualHost>

 

<VirtualHost *:80>

    ServerAdmin xxx@xxx.com

    DocumentRoot /var/www/html/s2

    ServerName  s2.domain1.com

    ErrorLog logs/ error_log

    TransferLog logs/access_log

</VirtualHost>

 

 

<VirtualHost *:81>

    ServerAdmin xxx@xxx.com

    DocumentRoot /var/www/html/s3

    ServerName  s3.domain2.com

    ErrorLog logs/error_log

    TransferLog logs/access_log

</VirtualHost>

 

<VirtualHost *:81>

    ServerAdmin xxx@xxx.com

    DocumentRoot /var/www/html/s4

    ServerName  s4.domain2.com

    ErrorLog logs/error_log

    TransferLog logs/access_log

</VirtualHost>

 

检查虚拟主机设置


 

3.基于IP的虚拟主机

将不同的网站挂在不同的IP上,访问不同的IP,所看到的是不同网站.因为一般服务器没那么多公网IP,而且大家一般都是用域名访问的.所以这


个基本没用.但是可以用来测试和学习.

适用环境:server上没有配置域名,只能用IP访问.

为了实验效果,我们先来停掉DNS服务.

首先为服务器增加一个IP,192.168.0.112

[root@server1 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0

[root@server1 network-scripts]# vi ifcfg-eth0:0

DEVICE=eth0:0     //设备名称

ONBOOT=yes       //随系统启动

BOOTPROTO=static

IPADDR=192.168.0.112 //新设的IP

NETMASK=255.255.255.0

GATEWAY=192.168.0.1

激活这个设备

[root@server1 network-scripts]# ifdown eth0;ifup eth0

查看当前ip设置

[root@server1 network-scripts]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0A:EB:XX:XX:XX 

          inet addr:192.168.0.111  Bcast:192.168.0.255  Mask:255.255.255.0

         

eth0:0    Link encap:Ethernet  HWaddr 00:0A:EB:XX:XX:XX 

          inet addr:192.168.0.112  Bcast:192.168.0.255  Mask:255.255.255.0

         

ping这个112确实启用成功.

这样增加IP的工作就完成了,下面对httpd.conf做修改

# Use name-based virtual hosting.

#

#NameVirtualHost *   去掉基于多域名的主机

 

<VirtualHost 192.168.0.111>

    ServerAdmin xxx@xxx.com

    DocumentRoot /var/www/html/s1

#    ServerName s1.domain1.com

    ErrorLog logs/ error_log

    TransferLog logs/ access_log

</VirtualHost>

 

<VirtualHost 192.168.0.112>

    ServerAdmin xxx@xxx.com

    DocumentRoot /var/www/html/s2

#    ServerName  ss2.domain1.com

    ErrorLog logs/ error_log

    TransferLog logs/ access_log

</VirtualHost>

 

注意上面红色的部分,由于此时没用多域名所以我将ServerName字段去掉了(在多端口的时候这样做是可以的).但是出现了下面的错误,可以看


到它是把IP作为域名给解析了.

"httpd.conf" 1157L, 38072C written                                                                        

[root@server1 conf]# ../bin/httpd -S

[Mon Jul 30 14:09:06 2007] [error] (EAI 2)Name or service not known: Failed to resolve server name for 192.168.0.112 (check 


DNS) -- or specify an explicit ServerName

[Mon Jul 30 14:09:06 2007] [error] (EAI 2)Name or service not known: Failed to resolve server name for 192.168.0.111 (check 


DNS) -- or specify an explicit ServerName

VirtualHost configuration:

192.168.0.111:*        bogus_host_without_reverse_dns (/usr/local/apache2/conf/httpd.conf:1065)

192.168.0.112:*        bogus_host_without_reverse_dns (/usr/local/apache2/conf/httpd.conf:1074)

Syntax OK

 

下面我们将ServerName字段加上去,后面的名称我们随意写

<VirtualHost 192.168.0.111>

    ServerAdmin hong.yao@infonaligy.com

    DocumentRoot /var/www/html/s1

    ServerName s1

    ErrorLog logs/dbpi_web-error_log

    TransferLog logs/dbpi_web-access_log

</VirtualHost>

 

<VirtualHost 192.168.0.112>

    ServerAdmin hong.yao@infonaligy.com

    DocumentRoot /var/www/html/s2

    ServerName s2

    ErrorLog logs/dbpi_web-error_log

    TransferLog logs/dbpi_web-access_log

</VirtualHost>

 

然后再来检查虚拟主机配置

[root@server1 conf]# ../bin/httpd -S

VirtualHost configuration:

192.168.0.111:*        s1 (/usr/local/apache2/conf/httpd.conf:1065)

192.168.0.112:*        s2 (/usr/local/apache2/conf/httpd.conf:1075)

Syntax OK

在客户机上测试访问192.168.0.111和192.168.0.112成功.

 

个人觉得这应该是一处bug,因为在这种情况下并不需要域名访问,采用的是完全以实际IP进行访问.相应的ServerName这个字段应该是没有意义


的(正如多端口时我们这样做,完全没问题).事实也表明了我们任意起名字也是可以通过的.

 

 

最后说一个Apache常常会碰到的问题

启动apache时会有警告

httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

还是能够正常的启动和访问,只是有这个问题.

解决:

#ServerName [url]www.example.com:80[/url] 将这句话修改如下

ServerName 192.168.0.111 当然根据你的实际情况修改为本机的IP或者域名