首页 > 代码库 > CentOS6.5 web-http协议之httpd篇之一

CentOS6.5 web-http协议之httpd篇之一

 

web服务在网络通信中很重要,而我们这里要展示的就是web服务中的重中之重-http协议

在CentOS6.5下,http协议的实现工具叫httpd,我们可以使用命令来查看当前httpd的版本,以及是否在本机上装了httpd服务了。

例如:

[root@www conf]# rpm -q httpd
httpd-2.2.15-29.el6.centos.x86_64

这是httpd的2.2.15版本。这个版本的httpd有很多特性,下面用示例陈述:假设我们的环境:一台vmware虚拟主机当做服务器端提供web服务,而我们的客户端模拟使用的是win7

再启动httpd之间,先说下httpd有个主配置文件,定义了httpd很多新特性。由于我们httpd2.2版本,默认定义了两个工作模式,一个是prefork,另一个是worker。

我们可以通过rpm –ql httpd查看httpd程序都生成了什么文件。

[root@www conf]# rpm -ql httpd

……

/usr/sbin/httpd(其实它是prefork啦)
/usr/sbin/httpd.event
/usr/sbin/httpd.worker

由于httpd是有工作模式的,必须要知道它以哪种模式工作的,它默认是prefork模式,它还有个worker模式。让我们分别看看配置文件里面它们两个的特性:

(服务器在响应客户端请求之前会预先生成一个类似“进程池 (server-pool)的东西,生成很多子进程,客户端来响应了,我们就从池中调子进程予以响应)

对于prefork模式:该工作模式下,服务器的主进程会fork自身从而产生多个子进程,每个子进程响应一个客户请求。

<IfModule prefork.c>
StartServers       8  服务在开启时,就生成了8个空闲进程
MinSpareServers    5 最少的空闲进程数
MaxSpareServers   20 最大的空闲进程数
ServerLimit      256 最多请求的进程数量

MaxClients       256 服务器同时间可允许的最大客户请求数量
MaxRequestsPerChild  4000  每一个子进程最多处理多少个请求

</IfModule>

对于这个worker模式:在worker工作模式下,每个子进程会生成很多个线程,每个线程请求一个客户请求。

<IfModule worker.c>
StartServers         4 服务器再启动时开启了4个空闲的进程等待客户连接
MaxClients         300 表明允许的同一时刻最大并发用户请求数
MinSpareThreads     25 最小空闲线程数
MaxSpareThreads     75最大空闲线程数
ThreadsPerChild     25 每个子进程可以开启的线程个数

MaxRequestsPerChild  0每个子进程最多响应可以处理多少个请求

 

由此我们有个大致了解,我们做实验实验下两个工作模式。

实现方式:通过对配置文件重命名的方法来开启工作模式,如:

[root@www sbin]# ll /usr/sbin/httpd*
-rwxr-xr-x. 1 root root 354816 Aug 14  2013 /usr/sbin/httpd
-rwxr-xr-x. 1 root root 368168 Aug 14  2013 /usr/sbin/httpd.event
-rwxr-xr-x. 1 root root 367240 Aug 14  2013 /usr/sbin/httpd.worker

现在我们开启httpd服务,查看空闲的进程数:

[root@www sbin]# ps aux | grep "httpd*"
root      2843  0.0  1.6 241748  8260 ?        Ss   11:04   0:00 /usr/sbin/httpd
apache    2846  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2847  0.0  0.9 241748  4776 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2848  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2849  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2850  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2851  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2852  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd
apache    2853  0.0  0.9 241748  4772 ?        S    11:04   0:00 /usr/sbin/httpd

root      3550  0.0  0.1 103252   828 pts/1    S+   13:41   0:00 grep httpd*

标记红色斜体的进程正好为8个,对应配置文件默认的开启了8个空闲的进程数。

现在我们切换到httpd.worker工作模式:

先查看下:

[root@www sbin]# !ll
ll /usr/sbin/httpd*
-rwxr-xr-x. 1 root root 354816 Aug 14  2013 /usr/sbin/httpd
-rwxr-xr-x. 1 root root 368168 Aug 14  2013 /usr/sbin/httpd.event
-rwxr-xr-x. 1 root root 367240 Aug 14  2013 /usr/sbin/httpd.worker

---------------------------------------------------------------------------------------------

再次重命名文件

[root@www sbin]# mv /usr/sbin/httpd  /usr/sbin/httpd.prefork
[root@www sbin]# mv /usr/sbin/httpd.event  /usr/sbin/httpd

 

重启服务

[root@www sbin]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

现在我们查看空闲的进程数:

[root@www sbin]# !ps
ps aux | grep "httpd*"
root      3578  0.0  0.8 184488  4032 ?        Ss   13:46   0:00 /usr/sbin/httpd
apache    3581  0.0  0.6 528748  3276 ?        Sl   13:46   0:00 /usr/sbin/httpd
apache    3582  0.0  0.6 528748  3284 ?        Sl   13:46   0:00 /usr/sbin/httpd
apache    3583  0.0  0.6 528748  3280 ?        Sl   13:46   0:00 /usr/sbin/httpd

root      3668  0.0  0.1 103252   832 pts/1    S+   13:48   0:00 grep httpd*

加上root用户在80端口开启的监听套接字这个空闲进程,正好4个。

因为httpd服务需要基于套接字文件通信,所以需要ip和端口格式,所以主配置文件也定义了端口的概念,这样可以不通过公认的80端口。

Listen 80
Listen 38080

我这里就定义了一个38080的端口同样给web服务使用,让我们看看实际效果:

[root@www sbin]# ss -tnlp | grep "httpd*"
LISTEN     0      128                     :::80                      :::*      users:(("httpd",3805,4),("httpd",3808,4),("httpd",3809,4),("httpd",3810,4),("httpd",3811,4),("httpd",3812,4),("httpd",3813,4),("httpd",3814,4),("httpd",3815,4))
LISTEN     0      128                      :::38080                   :::*      users:(("httpd",3805,6),("httpd",3808,6),("httpd",3809,6),("httpd",3810,6),("httpd",3811,6),("httpd",3812,6),("httpd",3813,6),("httpd",3814,6),("httpd",3815,6))

由于我们的httpd是高度模块化的,能动态加载程序,非常好用!比如:我们想禁掉一个模块的功能,以auth_digest为例,我们来禁掉它。

LoadModule auth_basic_module modules/mod_auth_basic.so

#LoadModule auth_digest_module modules/mod_auth_digest.so

保存并直接查看

[root@www ~]# httpd -D DUMP_MODULES | grep "digest"
Syntax OK
[root@www ~]# echo $?
1

说明digest模块被我们禁掉了,这里直接注释掉就可以成功,并不需要再次重启服务或重读配置文件。

其实我们的web服务最好不要以root身份直接开启服务,所以配置文件里定义了启动http服务的用户,如下

User apache
Group apache

对应到主机上,看!

apache    3808  0.0  1.1 241880  5564 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3809  0.0  1.1 241880  5564 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3810  0.0  1.1 241748  5444 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3811  0.0  1.1 241748  5444 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3812  0.0  1.1 241748  5444 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3813  0.0  1.1 241880  5564 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3814  0.0  1.1 241748  5440 ?        S    14:00   0:00 /usr/sbin/httpd
apache    3815  0.0  1.1 241748  5444 ?        S    14:00   0:00 /usr/sbin/httpd

 

我们再次说说web主页的主页地址在哪里,因为我们的环境CentOS6.5这台linux系统主机是提供httpd服务的,所以主页很可能定义到linux下某个目录作为web服务的入口,在配置文件里面写到

DocumentRoot /var/www/html

它定义了web服务的“入口”,假设它在linux主机下有个1.html文件,如果编辑好了该文件,用我们的客户端(win7)访问一定能访问到1.html,对吧,让我们试试:

[root@www ~]# ll /var/www/html/1.html
-rw-r--r-- 1 root root 18 Aug  9 14:22 /var/www/html/1.html

[root@www ~]# cat /var/www/html/1.html
hellooooooooooooo

让我们的客户请求这个网页

1 

没错吧!

先说下,httpd目录下通常有个index.html,这个页面通常是定义的主页面,如果没有它,服务器会变成一个类似“下载”的页面,让我们看看

[root@www ~]# ll /var/www/html/
1.html      c6/         ct6.cfg     hello.html  hi.html     ks.cfg      repodata/   test.html   zabbix/ 

并没有index.html是吧。让我们的客户端访问它试试:

2

这个是为什么呢?

其实这个是配置文件里定义了访问机制造成的,在配置文件中有一项规定了默认的DocumentRoot下的页面参数,注意在配置文件的这里,

<Directory "/var/www/html"> 
    Options Indexes FollowSymLinks

主要看Indexes这个参数,如果带上它就会显示上图那样,出现一个下载列表,让你挑选下载,这是不是一个潜在的巨大泄露,通常我们可以去掉这一项,如果去掉,看成什么样子了,如在Indexes前面加一个-字符,这样其实很大程度上保证了安全性。其实我们配置文件在这里就写到了

400 # same purpose, but it is much slower.
401 #
402 DirectoryIndex index.html index.html.var

从这里找index.html作为主页

<Directory "/var/www/html"> 
    Options -Indexes FollowSymLinks

保存并重读配置文件。

image 哈哈,是不是很神奇!

而这个followSymLinks是什么意思呢,让我们举个例子:

先对根文件目录下的1.html创建一个软链接,格式如下:

[root@www html]# ln -sv /tmp/1.html /var/www/html/2014.html
`/var/www/html/2014.html‘ -> `/tmp/1.html‘

然后配置文件中默认开启了FollowSymLinks,则可以通过输入URL http://192.168.1.184/2014.html找到1.html,看:

 

image

我们的httpd还有日志功能,日志分两种,一种是错误日志,一种是CustomLog访问日志,而且配置文件都定义了路径在哪里,先看CustomLog的位置

CustomLog logs/access_log combined

还有错误日志的:ErrorLog logs/error_log

lrwxrwxrwx. 1 root root   19 Jun 29 17:21 logs -> ../../var/log/httpd这里其实是一个链接,指向了/var/log/httpd/

[root@www logs]# cd /var/log/httpd/
[root@www httpd]# ll
total 1348
-rw-r--r-- 1 root root   34583 Aug  9 23:24 access_log
-rw-r--r-- 1 root root    3874 Jul 26 22:07 access_log-20140727
-rw-r--r-- 1 root root 1280638 Jul 30 19:09 access_log-20140803

-rw-r--r-- 1 root root   22171 Aug  9 23:22 error_log
-rw-r--r-- 1 root root    7697 Jul 27 10:20 error_log-20140727
-rw-r--r-- 1 root root   15110 Aug  3 09:48 error_log-20140803

我们的httpd服务还有一个好的功能,可以定义路径别名,随便建立一个目录,把它当做类似前面的“根文件目录”一样。如下,我现在定义个路径别名

在配置文件里添加Alias /music/  "/tmp/music/",然后再在/tmp/music里面创建一个23.html。

[root@www music]# cd /tmp/music/
[root@www music]# ll
total 4
-rw-r--r-- 1 root root 14 Aug 10 00:10 23.html

[root@www music]# cat 23.html
1111111111111

然后我们客户端在浏览器输入:http://192.168.1.184/music/23.html

image成功,就不在借助根文件目录。

 

下一篇我们来介绍更多的新特性!!!!