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 �Cql 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
让我们的客户请求这个网页
没错吧!
先说下,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是吧。让我们的客户端访问它试试:
这个是为什么呢?
其实这个是配置文件里定义了访问机制造成的,在配置文件中有一项规定了默认的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
保存并重读配置文件。
哈哈,是不是很神奇!
而这个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,看:
。
我们的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
成功,就不在借助根文件目录。
下一篇我们来介绍更多的新特性!!!!