文章目录
概念:
Apache所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给Apache一个单独的主机以免受
到其他应用的干扰。各个硬件指标中,对性能影响最大的是内存,对于静态内容(图片、JavaScript文件、css文件等)
它决定了Apache可以缓存多少内容,它缓存的内容越多,在硬盘上读取内容的机会就会越少,大内存可以极大提高静态站点的速度;
对动态高负载站点来说,每个请求保存的时间更多一些,Apache的mpm模块会为每个请求派生出相应的进程或线程分别处理,
而进程或线程的数量与内存的消耗近似成正比,因此增大内存对提高动态站点的负载和运行速度也极为有利。
其次是硬盘的速度,静态站点尤为突出,Apache不断的在读取文件并发送给相应的请求,硬盘的读写是极其频繁的;动态站点
也要不断的加载web程序(php等),一个请求甚至要读取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高
Apache的性能是有积极意义的。
最后CPU和网络,CPU影响的是web程序执行速度,网络影响流量大小。
一次完整的http请求处理过程:
(1) 建立或处理连接:接收请求或拒绝请求;
(2) 接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程;
(3) 处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
(4) 访问资源:获取请求报文中请求的资源;
(5) 构建响应报文;
(6) 发送响应报文;
(7) 记录日志;
接收请求的模型:
并发访问响应模型:
单进程I/O模型:启动一个进程处理用户请求;这意味着,一次只能处理一个请求,多个请求被串行响应;
多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
复用的I/O结构:一个进程响应n个请求;
多线程模式:一个进程生成n个线程,一个线程处理一个请求;
事件驱动(event-driven):一个进程直接n个请求;
复用的多进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程;
响应的请求的数量:m*n
httpd的特性:
高度模块化: 核心+模块
DSO:动态共享对象
MPM:Multipath processing Modules (多路处理模块)
1. prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
n个子进程:每个子进程处理一个请求;
工作模型:会预先生成n个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
其主要工作方式是:当Apache服务器启动后,mpm_prefork模块会预先创建多个子进程(默认为5个),每个子进程只有一个线程,当接受到客户端的请求后,mpm_prefork模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时,mpm_prefork模块就会创建新的子进程来处理额外的请求。这样客户端的请求就不需要在接受后等候子进程的产生。
由于在mpm_prefork模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。不过mpm_prefork模块的优点在于它的每个子进程都会独立处理对应单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork在效率上要比work要高,但是内存使用大得多,不擅长处理高并发的场景。
2.worker:多进程多线程模型,每线程处理一个用户请求;
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
多个子进程:每个子进程负责生成多个线程;
每个线程:负责响应用户请求;
并发响应数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量;
和prefork模式相比,worker使用了多进程多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑的线程的安全了,在使用keep-alive长连接的时候,某个线程会一被占用,即使中间没有请求,需要等到超时才会被释放(该问题在prefork模式下也存在)
总的来说,prefork方式速度要稍高于worker,然而它需要的CPU和memory资源也稍多于worker。
event:事件驱动模型,多进程模型,每个进程响应多个请求;
一个主进程 :负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
子进程:基于事件驱动机制直接响应多个请求;
这是Apache最新的工作模式,是worker模式的变种,它把服务进程从连接中分离出来,worker模式不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,由允许它释放。这增强了在高并发场景下的请求处理。event模式不能很好的支持https的访问(HTTP认证相关的问题)。
httpd的功能特性:
CGI:Common Gateway Interface(公共网关接口)
虚拟主机:IP,PORT, FQDN
反向代理
负载均衡
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块
…
1、持久连续
HTTPD是属于应用层的面向对象的协议,是基于TCP协议之上的可靠传输,每次在进行HTTPd连接之前,需要先进行TCP连接,在HTTPD连接结束后要对TCP连接进行终止,每个TCP连接都需要进行三次握手与四次断开,HTTPD协议不会对之前发生过的请求和响应进行管理,所以建立与关闭连接对于HTTP而言会消耗更多的内存与CPU资源,能不能允许通过同一个TCP连接发出多个请求,从而减少与多个连接相关的延迟,解决办法就是保持连接。
Persistent Connection:tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行;
如何断开?
数量限制
时间限制
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常 响应;
折衷:使用较短的持久连接时长,以及较少的请求数量;
KeepAlive On|Off
指的是保持连接活跃,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。一般情况下,图片较多的网站应该把KeepAlive设为On
KeepAliveTimeout 15
如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。它的设置一般考虑图片或者JS等文件两次请求间隔,一般设置为3-5秒。
MaxKeepAliveRequests 100
一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。
事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。
HostnameLookupson|off|double
如果是使用on,那么只有进行一次反查,如果用double,那么进行反查之后还要进行一次正向解析,只有两次的结果互相符合
才行,而off就是不进行域名验证。
如果为了安全,建议使用double;为了加快访问速度,建议使用off
域名查找开启这个会增加Apache的负担,减慢访问速度建议关闭。
timeout 60
超时:Apache服务器接收请求或发出响应的时间超过这个时间断开。
注意:(编译安装)以上配置项可在/usr/local/httpd/conf/extra/httpd-default.conf设置并在httpd.conf文件中通过include选项引用。
(yum安装)以上配置项可在/usr/share/doc/httpd-2.4.6/ httpd-default.conf设置并在httpd.conf文件中通过include选项引用。
2.MPM
httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不同的MPM机制的支持;确认现在使用的是哪下程序文件的方法:
默认使用的为/usr/sbin/httpd,其为prefork的MPM模块 ;
查看httpd程序的模块列表:
查看静态编译的模块:
httpd -l
查看静态编译及动态编译的模块:
httpd -M
更换使用httpd程序,以支持其它MPM机制;
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}
注意:重启服务进程方可生效
MPM配置:
prefork的配置
<IfModule prefork.c>
StartServers 5: Apache启动时默认开始的子进程数
MinSpareServers 5 最小的闲置子进程数
MaxSpareServer 10 最大的闲置子进程数
MaxRequestWorkers 250
MaxRequestWorkers设置了允许同时的最大接入请求数量。任何超过MaxRequestWorkers限制的请求将进入等候队列,在Apache2.3.1以前的版本MaxRequestWorkers被称为MaxClients,旧的名字仍旧被支持。
MaxConnectionsPerChild 500
设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxConnectionsPerChild”个请求后将自动销毁。
0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
(1.)可防止意外的内存泄漏
(2.)在服务器负载下降的时候会自动减少子进程数。因此,可根据服务器的负载来调整这个值。在Apache2.3.9之前称之为MaxRequestsPerChild
</IfModule>
注意:
(1.)MaxRequestWorkers是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。如果请求总数已达到这个值(可通过ps -ef | grep httpd | wc -l)来确认,那么后面的请求就要排队,直到某个请求已处理完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,建议将初始值设为(以MB为单位的最大物理内存/2),然后根据负载情况进行动态调整。
比如一台8G内存的机器,那么初始值就是8000/2=4000。
(2.)prefork控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个。。。。如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。
MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
(3.)ServerLimit和MaxClients(MaxRequestWorkers)有什么区别呢?
是因为在Apache1时代,控制最大进程数只有MaxClients这个参数,并且这个参数最大值为256,并且是写死了的,试图设置为超过256是无效的,这是由于Apache1时代的服务器硬件限制的。但是Apache2时代由于服务器硬件的升级,硬件已经不再是限制,所以使用ServerServerLimit这个参数来控制最大进程数,ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前,值要不小于MaxClients。
worker的配置
<IfModule worker.c>
StartServers 4 apache启动时候默认开始的子进程数
MaxClients 300 与prefork模式相同
MinSpareThreads 25 最小空闲数量的工作线程
MaxSpareThreads 75 最大空闲数量的工作线程
ThreadsPerChild 25 每个子进程产生的线程数量
MaxRequestsPerChild 0 与prefork模式相同
MaxConnectionsPerChild 0: 与prefork模式相同
</IfModule>
注意:
(1.)work由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxRequestWorkers设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。
(2.)ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显示使用ThreadLimit指令,它的最大缺省值是20000。
(3.)worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显示声明ServerLimit(系统配置的最大进程数量,最大值是20000)。需要注意的是,如歌显示声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers必须是ThreadsPerChild整倍数,否则Apache将会自动调节到相应的一个相应值。
(4.)进程与线程的区别
线程是指进程内的一个执行单元,也是进程内的可调度实体。
与进程的区别是:
地址空间:进程内的一个执行单元,进程至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间。
资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
线程是处理器调度的基本单位,但进程不是
二者均可并发执行
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
3、DSO
配置指定实现模块加载
LoadModule mod_name mod_path
模块名称 模块路径
模块文件路径可使用相对路径:
相对于ServerRoot(默认/etc/httpd)
4、定义’Main’ server的文档页面路径
DocumentRoot “”
文档路径映射:
DoucmentRoot指向的路径为URL路径的起始位置
其相当于站点URL的根路径;
(FileSystem) /web/host1/index.html --> (URL) /index.html
5、站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制
文件系统路径:
<Directory “”>
…
<File “”>
…
<FileMatch “PATTERN”>
…
URL路径:
<Location “”>
…
<LocationMatch “”>
…
<Directory>中“基于源地址”实现访问控制:
(1) Options
后跟1个或多个以空白字符分隔的“选项”列表;
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
None:
All:
(2) AllowOverride
与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
All:
None:
6、定义路径别名
格式:
Alias /URL/ “/PATH/TO/SOMEDIR/” 源内容 映射内容
实例: DocumentRoot “/www/htdocs” 默认路径
http://www.ityunn.com/images/fish.jpg 源内容
http://www/ityunn.com/web/chess.jpg 映射内容
Alias /images/fish.jpg “/web/chess.jpg”
http://www.ityunn.com/images/fish.jpg
http://www/ityunn.com/web/chess.jpg
<Directory “/web/”>
AllowOverride None
Options Indexes FollowSymLinks
Require all granted
</Directory>
注意:映射内容的文件要写一个允许访问的目录;
7.设置默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
8.日志设置
日志类型:访问日志 和 错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn
Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
访问日志:
LogFormat “%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i”” combined
CustomLog logs/access_log combined
日志访问格式:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h:客户端IP地址;
%l:Remote User, 通常为一个减号(“-”);
%u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;
%t:服务器收到请求时的时间;
%r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
%>s:响应状态码;
%b:响应报文的大小,单位是字节;不包括响应报文的http首部;
%{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
%{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;
9.基于用户的访问控制
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
认证方式有两种:
basic:明文
digest:消息摘要认证
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;
用户的账号和密码存放于何处?
虚拟账号:仅用于访问某服务时用到的认证标识
存储:
文本文件;
SQL数据库;
ldap目录存储;
basic认证配置示例:
(1) 定义安全域
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
Require user username1 username2 …
</Directory>
允许账号文件中的所有用户登录访问:
Require valid-user
(2) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户
另外:基于组账号进行认证;
(1) 定义安全域
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
AuthGroupFile “/PATH/TO/HTTPD_GROUP_FILE”
Require group grpname1 grpname2 …
(2) 创建用户账号和组账号文件;
组文件:每一行定义一个组
GRP_NAME: username1 username2
注意:用户访问授权和主机访问控制同时设置时,访问控制优先生效;则同时设置时,访问控制中所允许的主机可以直接访问网站,不需要用户授权;在访问控制中所禁止的主机不能直接访问网站,需要验证用户授权成功后才能访问。
如果登录验证提示以下错误:检查用户授权文件的权限,other必须有可读的权限,检查主配置文件中authuserfile存放路径是否正确,路径不能以/结尾(以/结尾代表目录)
10.服务访问控制
注意:在httpd2.4版本中用户访问授权和主机访问控制同时设置时,访问控制优先生效;则同时设置时,访问控制中所允许的主机可以直接访问网站,不需要用户授权;在访问控制中所禁止的主机不能直接访问网站,需要验证用户授权成功后才能访问,一定要注意用户授权文件的权限,other必须有可读的权限,否则无法登陆验证;
在httpd2.2版本中,访问控制中允许访问的主机需要用户授权,在访问控制中拒绝的主机直接拒绝不能访问;
在httpd2.2版本中,访问控制的使用方法:
通过配置项 Order ,Deny from ,Allow from ,可以根据客户机的主机名或IP地址来决定是否允许客户端访问,Order用来设置限制顺序,Deny from 和 Allow from用来设置具体限制内容。
- Allow,deny:先【允许】后【拒绝】,默认拒绝所有未明确指定的客户机地址
- Deny,allow:先【拒绝】后【允许】,默认允许所有未明确指定的客户端地址
地址的形式可以是IP地址,网络地址,主机名,域名,使用名称【all】时表示任意地址,
允许所有主机:
Order allow,deny
Allow from all
仅允许:
Order allow,deny
allow from 192.168.10.0/24 192.168.20.0/24
仅拒绝:
Order deny,allow
deny from 192.168.10.0/24 192.168.20.0/24
在httpd2.4版本中,访问控制的使用方法:
客户机地址限制
通过require配置项,可以根据主机的主机名或ip地址来决定是否允许客户端访问,在httpd服务器的主配置文件的<Location>,<Directory>,<Files>,<Limit>配置段中均可以使用require配置项来控制客户端的访问,限制的形式可以是ip地址、网络地址、主机名或域名,使用all表示任意地址常见格式有以下几种:
Require all granted:表示允许所有主机访问
Require all denied:表示拒绝所有主机访问
Require local:表示仅允许本地主机访问
Require [not] host <主机名或域名列表>:表示允许或拒绝指定主机或域名访问
Require [not] ip <ip地址或网段列表>:表示允许或拒绝指定ip地址或网段访问
注意:定义策略时,多个不带not的语句之间是或关系,任意一条require语句满足条件均可以访问;如果既出现了不带not的语句,又出现了带not的语句,则语句之间是与关系,即所有语句都满足条件才可以访问;
- 允许所有客户机访问
Httpd默认情况下使用的 Require all granted配置项,表示允许任何客户机访问
<Directory "/var/www/html">
Require all granted
</Directory>
- 设置仅指定ip可以访问
<Directory "/var/www/html">
Require ip 192.168.10.10
</Directory>
在使用not禁止访问时要将其置于<RequireAll></RequireAll>容器中并在容器中指定相应的限制策略
- 设置192.168.10.0网段不能访问,其他网段都可以访问
<Directory "/var/www/html">
<Requireall>
Require not ip 192.168.10.0/24
Require all granted
</Requireall>
</Directory>
11.虚拟主机配置
站点标识: socket
IP相同,但端口不同;
IP不同,但端口均为默认端口;
FQDN不同;
请求报文中首部
Host: www.magedu.com
有三种实现方案:
基于ip:
为每个虚拟主机准备至少一个ip地址;
基于port:
为每个虚拟主机使用至少一个独立的port;
基于FQDN:
为每个虚拟主机使用至少一个FQDN;
注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用’main’主机;
禁用方法:注释中心主机的DocumentRoot指令即可;(2.2版本)
配置虚拟主机通常配置以下几个方面的内容:
虚拟主机区域:<VirtualHost 监听地址>…</VirtualHost >区域配置,为每个web主机建立独立的配置内容,其中至少要包括虚拟主机网站名称,网页根目录的配置项,其他如(管理员邮箱,访问日志等)根据需要添加。
目录权限:使用<directory 目录位置>…</directory>区域配置,为每个虚拟web主机的网站目录设置访问权限,如允许任何人访问
虚拟主机的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot “”
</VirtualHost>
其它可用指令:
ServerAlias:虚拟主机的别名;可多次使用;
ErrorLog:虚拟主机的错误日志
CustomLog:虚拟主机的日志 后面跟combined
<Directory “”>
…
Alias
…
基于同一ip同一端口不同域名
注意:apache接收所有指向的域名,当配置中没有被访问的域名时,它会默认跳到配置的第一个虚拟主机中去,要想实现只有绑定的域名才可以访问,把第一个虚拟主机配置为拒绝所有就ok了;开启虚拟主机后需要把主配置文件里面的域名注释掉
实例一:
<VirtualHost 192.168.10.100:80> //虚拟主机监听的端口或ip地址
ServerAdmin admin.www.ityunn.com //设置虚拟主机管理员邮箱
DocumentRoot "/www/ityunn1/" //设置虚拟主机根目录
ServerName www.ityunn.com //设置虚拟主机绑定的域名
ServerAlias www.ceshi1.com //设置虚拟主机的别名
ErrorLog "logs/www.ityunn.com-error_log" //错误日志存放的路径
CustomLog "logs/www.ityunn.com-access_log" common //访问日志存放路径
<directory "/www/ityunn1/"> //设置虚拟主机根目录权限
require all granted //允许所有人访问
</directory>
</VirtualHost>
实例二:
<VirtualHost 192.168.10.100:80> //虚拟主机监听的端口或ip地址
ServerAdmin admin.www.ityun.com //设置虚拟主机管理员邮箱
DocumentRoot "/www/ityun2/" //设置虚拟主机根目录
ServerName www.ityun.com //设置虚拟主机绑定的域名
ServerAlias www.ceshi2.com //设置虚拟主机的别名
ErrorLog "logs/www.ityun.com-error_log" //错误日志存放的路径
CustomLog "logs/www.ityun.com-access_log" common //访问日志存放路径
<directory "/www/ityun2/"> //设置虚拟主机根目录权限
require all granted //允许所有人访问
</directory>
</VirtualHost>
基于同一ip同一域名不同端口
实例一:
<VirtualHost 192.168.10.100:8080> //虚拟主机监听的端口或ip地址
ServerAdmin admin.www.ityunn.com //设置虚拟主机管理员邮箱
DocumentRoot "/www/ityunn1/" //设置虚拟主机根目录
ServerName www.ityunn.com //设置虚拟主机绑定的域名
ServerAlias www.ceshi1.com //设置虚拟主机的别名
ErrorLog "logs/www.ityunn.com-error_log" //错误日志存放的路径
CustomLog "logs/www.ityunn.com-access_log" common //访问日志存放路径
<directory "/www/ityunn1/"> //设置虚拟主机根目录权限
require all granted //允许所有人访问
</directory>
</VirtualHost>
listen 8080
实例二:
<VirtualHost 192.168.10.100:8090> //虚拟主机监听的端口或ip地址
ServerAdmin admin.www.ityunn.com //设置虚拟主机管理员邮箱
DocumentRoot "/www/ityunn1/" //设置虚拟主机根目录
ServerName www.ityunn.com //设置虚拟主机绑定的域名
ServerAlias www.ceshi1.com //设置虚拟主机的别名
ErrorLog "logs/www.ityunn.com-error_log" //错误日志存放的路径
CustomLog "logs/www.ityunn.com-access_log" common //访问日志存放路径
<directory "/www/ityunn1/"> //设置虚拟主机根目录权限
require all granted //允许所有人访问
</directory>
</VirtualHost>
listen 8090
基于同一域名同一端口不同ip
实例一:
<VirtualHost 192.168.10.100:80> //虚拟主机监听的端口或ip地址
ServerAdmin admin.www.ityunn.com //设置虚拟主机管理员邮箱
DocumentRoot "/www/ityunn1/" //设置虚拟主机根目录
ServerName www.ityunn.com //设置虚拟主机绑定的域名
ServerAlias www.ceshi1.com //设置虚拟主机的别名
ErrorLog "logs/www.ityunn.com-error_log" //错误日志存放的路径
CustomLog "logs/www.ityunn.com-access_log" common //访问日志存放路径
<directory "/www/ityunn1/"> //设置虚拟主机根目录权限
require all granted //允许所有人访问
</directory>
</VirtualHost>
实例二:
<VirtualHost 192.168.10.99:80> //虚拟主机监听的端口或ip地址
ServerAdmin admin.www.ityunn.com //设置虚拟主机管理员邮箱
DocumentRoot "/www/ityunn1/" //设置虚拟主机根目录
ServerName www.ityunn.com //设置虚拟主机绑定的域名
ServerAlias www.ceshi1.com //设置虚拟主机的别名
ErrorLog "logs/www.ityunn.com-error_log" //错误日志存放的路径
CustomLog "logs/www.ityunn.com-access_log" common //访问日志存放路径
<directory "/www/ityunn1/"> //设置虚拟主机根目录权限
require all granted //允许所有人访问
</directory>
</VirtualHost>
12:status页面
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
<Requireall>
require ip 192.168.10.0/24
</Requireall>
</Location>
<VirtualHost 192.168.10.100:80> //虚拟主机监听的端口或ip地址
ServerAdmin admin.www.ityunn.com //设置虚拟主机管理员邮箱
DocumentRoot "/www/ityunn1/" //设置虚拟主机根目录
ServerName www.ityunn.com //设置虚拟主机绑定的域名
ServerAlias www.ceshi1.com //设置虚拟主机的别名
ErrorLog "logs/www.ityunn.com-error_log" //错误日志存放的路径
CustomLog "logs/www.ityunn.com-access_log" common //访问日志存放路径
<directory "/www/ityunn1/"> //设置虚拟主机根目录权限
require all granted //允许所有人访问
</directory>
</VirtualHost>
<location /server-status>
sethandler server-status
<Requireall>
require ip 192.168.10.0/24
</Requireall>
</location>
到这里有关Apache版本的基本配置演示完毕了!!! 希望对你有所帮助!!!再见!!!