apache工作模式及虚拟主机的配置

apache的工作模式

MPM

名词解释MPM   Multipath Process Module 多道处理模块。Linux中常使用prefork

worker event三种MPM 即apache常用的三种工作模式。

prefork

prefork为多进程模型,每个进程响应一个请求。其工作过程简单说来就是一个主进程:负责生成n个
子进程(子进程也称为工作进程),每个子进程处理一个用户请求;即使没有用户请求,也会预先生成
多个空闲进程,随时等待请求到达;子进程最大不会超过1024个;
prefork有以下几个特点:
主进程只负责接收,不负责处理和响应
主进程为监听套接字;子进程为连接套接字
主进程使用80端口,子进程使用非80端口
prefork模式极为稳定,任何一个进程崩溃了都不会影响其他进程

worker

worker为多线程模型,每个线程响应一个请求;其工作过程简单说来就是一个主进程,生成多个子进
程,每个子进程负责生成多个线程,每个线程响应一个请求;因此如果有m个进程,n个线程:则最大并
发响应数为m*n
worker有以下的特点:
无论有没有请求到达,子进程都会预先生成几个空闲线程。当用户请求到达时,它会用预先生成的线程
去响应,而不是临时生成进程,以便达到快速响应的目的。
注:线程不比进程轻量级,内部调度进程和线程是一样的,worker比起prefork并没有显著的提升,
只是可以作为另一种方案

event

event为事件驱动模型,每个线程响应n个请求;一个主进程:生成m个子进程,每个进程直接响应n个
请求;
需要注意的是在httpd-2.2中, event为测试使用;而在httpd-2.4中,event可直接用于生产环境

httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制

1.查看当前的工作模式

root 15000 0.0 0.3 177804 3924 ? Ss 00:48 0:00 /usr/sbin/htt
pd
apache 15002 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15003 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15004 0.0 0.2 177804 2528 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15005 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15006 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15007 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15008 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
pd
apache 15009 0.0 0.2 177804 2512 ? S 00:49 0:00 /usr/sbin/htt
名词解释MPM MultipathP rocessModule 多道处理模块。Linux中常使用prefork
worker event三种MPM 即apache常用的三种工作模式。
pd
root 15033 0.0 0.0 103244 872 pts/0 S+ 00:51 0:00 grep httpd
[root@local ~]# httpd -l
#查看核心中编译的静态模块,默认为prefork模块
compiled in modules:
core.c #httpd的核心模块
prefork.c #prefork模块
http_core.c #http功能的核心模块
mod_so.c #支持模块动态装卸
[root@local ~]# httpd.event –l
#如果当前加载的是event模块,需要这样查
Compiled in modules:
core.c
event.c
http_core.c
mod_so.c
[root@local ~]# httpd -M #查看静态编译及动态装载的所有模块
#因这些模块不是本次博文的重点,因此这里不做赘述

2.更改当前的工作模式为worker模式

[root@local ~]# vim /etc/sysconfig/httpd #编辑配置文件
HTTPD=/usr/sbin/httpd.worker #将前面的注释去掉,保存退出
[root@local ~]# service httpd restart #重启服务
[root@local ~]# ps aux | grep httpd
root 15090 0.0 0.4 178012 4104 ? Ss 01:01 0:00 /usr/sbin/htt
pd.worker
apache 15093 0.0 0.5 522272 5368 ? Sl 01:01 0:00 /usr/sbin/htt
pd.worker
apache 15094 0.0 0.5 587808 5384 ? Sl 01:01 0:00 /usr/sbin/htt
pd.worker
apache 15095 0.0 0.5 522272 5372 ? Sl 01:01 0:00 /usr/sbin/htt
pd.worker
root 15205 0.0 0.0 103244 876 pts/0 S+ 01:01 0:00 grep httpd
此时工作模式已更改为worker模式

3.工作模式的配置

prefork的配置:
<IfModule prefork.c>
StartServers 8 #服务启动时启动的进程数
MinSpareServers 5 #最小空闲进程数
MaxSpareServers 20 #最大空闲进程数
ServerLimit 256
#服务器端进程数上限,通常与下面的值相等
MaxClients 256
#服务器端所允许启动的最多进程数(最多允许多少个客户端同时请求响应)
MaxRequestsPerChild 4000
#服务器的一个子进程最多响应多少次请求
</IfModule>
worker的配置:
<IfModule worker.c>
StartServers 4
MaxClients 300 #服务器最大启动的线程数
MinSpareThreads 25 #最小空闲线程数
MaxSpareThreads 75 #最大空闲线程数
ThreadsPerChild 25 #每个进程启动的线程数
MaxRequestsPerChild 0 #0表示不做限制
</IfModule>

虚拟主机

有三种实现方案:
基于ip:
为每个虚拟主机准备至少一个ip地址;
基于port:
为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:
为每个虚拟主机准备至少一个专用hostname;最有用
可混合使用上述三种方式中任意方式;

注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;禁用中心主机:注释DocumentRoot

每个虚拟主机都有专用配置:

<VirtualHost "IP:PORT">
SeverName
DocumentRoot ""
</VirtualHost>
#大多数用在中心主机的配置都可在虚拟主机中使用
ServerAlias #虚拟主机的别名
ErrorLog
CustomLog
<Directory "">
</Directory>

下面由三个示例来说明虚拟主机的配置

[root@root ~]# mkdir -pv /vhosts/{web1,web2,web3,web4}/htdocs
mkdir: created directory `/vhosts'
mkdir: created directory `/vhosts/web1'
mkdir: created directory `/vhosts/web1/htdocs'
mkdir: created directory `/vhosts/web2'
mkdir: created directory `/vhosts/web2/htdocs'
mkdir: created directory `/vhosts/web3'
mkdir: created directory `/vhosts/web3/htdocs'
mkdir: created directory `/vhosts/web4'
mkdir: created directory `/vhosts/web4/htdocs'
[root@root ~]# vim /vhosts/web1/htdocs/index.html
page at web1
[root@root ~]# vim /vhosts/web2/htdocs/index.html
page at web2
[root@root ~]# ip addr add 192.168.1.4/24 dev eth0
[root@root ~]# ip addr list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP q
len 1000
link/ether 00:0c:29:01:9c:d0 brd ff:ff:ff:ff:ff:ff
inet `192.168.1.3/24` brd 192.168.1.255 scope global eth0
inet `192.168.1.4/24`scope global secondary eth0
# `` 仅表示强调
inet6 fe80::20c:29ff:fe01:9cd0/64 scope link
valid_lft forever preferred_lft forever

示例1:基于ip

<VirtualHost 192.168.1.3:80> 
ServerName web1.willie.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.4:80> 
ServerName web2.willie.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
[root@root ~]# httpd -t #测试语法是否正确
[root@root ~]# service httpd reload

b2dd95013570a85ebad22a76c4bfb17b.png

726d5b9cc6c807be22706b26fb44f55e.png

示例2:基于port

<VirtualHost 192.168.1.4:80> 
ServerName web2.willie.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.4:8080> 
ServerName web3.willie.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
Listen 8080 #确保监听8080端口
[root@root ~]# service httpd restart #端口改变,重启服务

7f5f8e4336b720ac80935c9f012df5ee.png

16fa1e6c8328c14f2dc149a9e54944e5.png

示例3:基于hostname

<VirtualHost 192.168.1.3:80>
ServerName web1.willie.com 
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.3:80>
ServerName web2.willie.com 
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.3:80>
ServerName web3.willie.com 
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
[root@root ~]# service httpd reload

因为没有配DNS,我们用另外一台虚拟机修改hosts文件做访问

[root@localhost ~]# curl http://web1.willie.com
page at web1
[root@localhost ~]# curl http://web2.willie.com
page at web2
[root@localhost ~]# curl http://web3.willie.com
page at web3

原创文章,作者:Net17_得得,如若转载,请注明出处:http://www.178linux.com/21446

(0)
Net17_得得Net17_得得
上一篇 2016-07-02
下一篇 2016-07-03

相关推荐

  • 考试题目

    1、  简述TCP三次握手四次挥手过程及各过程中客户端和服务器端的状态。 TCP三次握手,四次断开通过以下图示说明: 2、说说进程和线程的区别 (1)一个线程只能输入某一个进程,一个进程可以有多个线程。一个程序至少有一个进程,一个进程至少有一个线程。 (2)进程有独立的地址空间,线程没有独立的地址空间,进程内的多个线程共享进程的地址空间。 (3)线…

    Linux干货 2016-06-19
  • Linux网络属性配置

      如何将linux主机接入到TCP/IP网络中:     第一步:         配置IP/NETMASK(ip地址、子网掩码):本地通信     第二步:   &n…

    Linux干货 2016-12-16
  • Python入门之闭包,匿名函数,过滤器,映射器,折叠

    在学习python函数的过程中,函数的高阶应用包括闭包lambda函数,过滤器等都让我头痛不已.接下来我把课堂中听到的笔记进行整理,再写一遍,希望在提醒自己的同时也能帮助到别人. 首先,我们来看一下什么是闭包,闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见…

    Linux干货 2015-12-19
  • N25-第四周

    一、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。     [root@localhost ~]# cp -r /etc/skel /home/tuser1      [root@localhost ~]# chmo…

    Linux干货 2017-01-09
  • 内核升级和救援模式

    http://www.cnblogs.com/wzhuo/p/6728336.html 

    Linux干货 2017-04-24
  • 文本处理工具作业

    1、找出ifconfig命令结果中本机的所有IPv4地址 root@cenots6.8  ~ #  ifconfig | tr -cs '[0-9]\.' '\n' |sort -u -t&…

    Linux干货 2016-08-07