Apache Httpd服务器之基础
Httpd服务器是Apache产品线下的一款web服务器,常与PHP或Python等CGI脚本一起配合使用,为用户提供动态Web服务。httpd,从名字就可以看出,它提供的主要是基于http协议的Web服务。本篇为介绍Httpd服务器的第一篇,主要介绍下Httpd服务器的安装,运行模式,容器配置,以及CGI的配置,目的是使大家能通过阅读此篇文章来从零建立起一个可运行的Web服务器。
Httpd从哪下载?请访问http://httpd.apache.org/download.cgi,这里就有最新的httpd服务器的源码。如果想把你的服务器部署在生产环境,又或者不想在使用过程中出现一些意想不到的问题的话,还是下载Stable Release版比较好。目前的稳定版本为2.4.10。
如果我们的操作系统是Linux,下载好httpd-2.4.10.tar.gz后,我们就可以通过tar zxvf httpd-2.4.10.tar.gz命令释出所有的源代码。但此时不见得能够成功的对源代码进行编译安装,因为要安装httpd服务器,首先得安装好几个其它的软件,他们分别是APR,APR-Util,PCRE,ZLIB。请确保APR,APR-Util,PCRE以及ZLIB都是最新的版本,尽量不要用yum库里的版本,因为如果你的操作系统不是最新的版本,比如你的操作系统为CentOS 5,那么当你使用yum安装APR时,就会安装到老版本的APR,从而导致2.4.10的httpd服务器编译失败(当然还是推荐使用新版本的操作系统,否则可能会出其它问题,如C编译器版本,autoconf版本问题等,会带来一些麻烦)。所以为了不区分与平台,我们还是麻烦下,通过官方发布的最新版本的源代码来编译安装这些前置软件。APR及APR-Util的下载地址在http://apr.apache.org上,在这里你可以下载到APR 1.5.1及APR-Util 1.5.4。PCRE下载地址在http://sourceforge.net/projects/pcre/files/pcre/。在这里下载PCRE 8.36。ZLIB下载地址在http://zlib.net,下载后,我们有apr-1.5.1.tar.gz,apr-util-1.5.4.tar.gz,pcre-8.36.tar.gz,zlib-1.2.8.tar.gz这三个文件。我以人格担保,它们与httpd 2.4.10是100%匹配的。
在安装httpd之前,我们应先安装好apr,apr-util,pcre及zlib。下面就给出安装它们的具体过程,值得注意的是apr应在apr-util之前安装好,因为apr-util依赖于apr。下面假如你所有的文件都在/usr/local下。
apr安装过程:
cd /usr/local/apr-1.5.1 ./configure —prefix=/usr/local/apr make && make install
apr-util安装过程:
cd /usr/local/apr-util-1.5.4 ./configure —prefix=/usr/local/apr-util —with-apr=/usr/local/apr
pcre安装过程:
cd /usr/local/pcre-8.36 ./configure —prefix=/usr/local/pcre make && make install
zlib安装过程:
cd /usr/local/zlib-1.2.8 ./configure —prefix=/usr/local/zlib make && make install
安装完以上三个前置软件,就可以安装apache httpd服务器了。
httpd安装过程:
cd /usr/local/httpd-2.4.10 ./configure —prefix=/usr/local/httpd —with-apr=/usr/local/apr —with-apr-util=/usr/local/apr-util \ —with-pcre=/usr/local/pcre \ —with-z=/usr/local/zlib —with-mpm=worker —enable-modules=all —enable-so make && make install
其中 —with-mpm为多路处理模块的设置,如设置为worker,则系统将以多进程多线程模型运行,这种设置适合于配合php-fpm管理php cgi进程,但不适合通过libphp.so模块进行php内容的解析。—enable-modules代表启动httpd内所有模块.—enable-so代表启动动态库加载功能(这个是默认就开启的)。前面的—with-xxx是所需要的前置软件的安装路径。
这样,我们就完成了httpd的安装工作。在启动httpd前,我们应对httpd进行必要的配置。httpd的配置文件名为httpd.conf,位置在/usr/local/httpd/conf/httpd.conf。下面就简单的介绍下我们的httpd配置文件。
httpd的配置文件分为全局和容器两个部分,在容器外的配置指令即为全局指令,在整个配置文件范围内均有效,而容器内的指令,则只在容器范围内有效。那么什么是容器呢?简单点说,大部分以尖括号<xxx>开头,以</xxx>结尾的就是容器。比如<Directory></Directory>,又比如<Location></Location>等。首先讨论下常用的全局指令,基础的常用的全局指令有ServerRoot,Listen,LoadModule,User,Group,ServerName,DocumentRoot等。因为此篇是基础,所以也就只简单介绍下比较基础的^_^。
ServerRoot,为服务器所在根目录,一般为服务器的安装目录,配置文件里的相对路径一般以它作为参照。
Listen,服务器的监听端口,可以以IP:端口的形式设置,也可以只设置端口。如果设置了IP,则服务器只会监听此IP对应的网络接口。
LoadModule,加载动态库,比如你要开启代理功能,那么应该利用LoadModule加载proxy.so模块。
User,服务器运行时使用的用户名,此用户为Linux系统用户。
Group,服务器运行时使用的用户组,此用户组为Linux系统用户组。
ServerName,服务器名可用你申请的域名或IP表示,不设置这个在启动时会有一个警告,但也不会报错。设不设置无所谓啦。
DocumentRoot,服务器检索内容的根目录,比如用户在浏览器输入url为http://ip/index.html,那么这个index.html在哪呢?就在DocumentRoot设置的值下。
这些指令,一般默认的配置文件已经帮你设置好了,除非你的80端口被某项进程所占,否则服务器应该能正常启动。可以通过linux命令netstat -ant查看tcp端口的情况。如果在Local Address这一列没看到80端口被占用的话,恭喜你,启动服务器吧。否则,请更改Listen的值。
如果你不需要建立虚拟主机,也许<Directory>容器会是你主要的设置点。Directory按字面意义就是设置目录,设置服务器检索内容的目录。如果你的DocumentRoot的值为/usr/local/httpd/htdocs。那么当用户的uri为index.html时,服务器将在/usr/local/httpd/htdocs下寻找index.html文件,当uri为test/index.php时,服务器将在/usr/local/httpd/htdocs/test下寻找index.php文件。那么如果我想在/usr/local/httpd/htdocs自定义一些设置,比如想显示目录下的文件列表,就应该利用<Directory>容器。下面是一段目录设置代码:
<Directory “/usr/local/httpd/htdocs”> Options Indexes AllowOverride None Require all granted </Directory>
这段代码很简单,主要达成三个目的。一是允许显示目录列表,二是禁止.htaccess文件覆盖配置,三是允许所有用户访问该目录,也就是说只要uri映射到此目录,则就可以将内容返回给用户。Options是目录的一些设置选项,如允许显示列表,允许目录内有软链接等。AllowOverride是是否允许其它的配置文件覆盖此配置。Require是授权。
我们用/usr/local/httpd/bin/httpd -k start命令来启动服务器。如果没有任何回显,则表示服务器启动成功。进一步可以用ps aux | grep httpd来确定以下,如果有很多/usr/local/httpd/bin/httpd -k start进程,则表明服务器启动成功。利用浏览器访问下服务器,如服务器IP为192.168.1.6,则在浏览器内输入http://192.168.1.6/,如果页面显示”It works!”,则表示服务器一切OK。至此,服务器的安装到此结束,下面介绍以下服务器的运行模式。
Httpd服务器的运行模式主要分为prefork和worker,它们属于多路处理模块MPM,由—with-mpm参数在./configure时设置。prefork为非线程型,预派生的多路处理模块,而worker属于线程型的。也就是说prefork使用进程处理请求,而worker可以使用线程处理请求。它们各有优缺点,对于非线程安全的脚本处理系统,适合与使用prefork模块,如php-cli。对于线程安全的脚本处理系统,如果你的机器是多核并且配置足够高,选择worker模块也许是更好的选择。
prefork使用一个单独的控制进程负责产生子进程,这些子进程用于监听请求并给出应答。Apache总是试图保持一些备用的子进程用于迎接即将到来的请求,这样客户端就不用在得到服务前等待子进程的产生。配置mpm模块可以在配置文件的全局部分进行设置。当然,一般来说我们在设置mpm时会加上<IfModule></IfModule>先判断下该模式是否正应用在服务器中。如下是一段prefork的配置代码:
<IfModule mpm_prefork_module> #这个判断可以不加,除非你非常确定自己启动了prefork的模式 StartsServers 5 #服务器启动时创建的进程数 MinSpareServers 5 #最小空闲进程数 MaxSpareServers 10 #最大空闲进程数 MaxRequestWorkers 250 #最高并发量 MaxConnectionsPerChild 0 #单个进程能处理的连接数,如果设置为正整数值,则在超过此连接数后, 该子进程会被Kill掉。当设置为0时,表示无限制 </IfModule>
worker为多线程多进程的服务器,可以处理海量请求,前提是你的服务器能抗的住。如下是一段worker的配置代码:
<IfModule mpm_worker_module> StartServers 3 #同prefork下的StartServers指令 MinSpareThreads 75 #最小空闲线程数 MaxSpareThreads 250 #最大空闲线程数 ThreadsPerChild 25 #每个子进程的线程数 MaxRequestWorkers 400 #同prefork下的MaxRequestWorkers指令 MaxConnectionsPerChild 0 #同prefork下的MaxConnectionsPerChild指令 </IfModule>
最后,我们来探讨下httpd如何与CGI脚本进行交互,实现动态内容。以普通的bash脚本为例。我们创建一个bash脚本如下:
#!/bin/bash echo Content-type: text/html echo Hello, World.
脚本文件命名为hello.cgi。
我们将此脚本放到/usr/local/httpd/cgi-bin目录中,目的是使用户在浏览器上访问http://192.168.1.6/cgi-bin/hello.cgi,就能在网页上显示”Hello, World.”。那么该如何设置呢?打开httpd.conf文件,参考如下配置代码:
<IfModule alias_module> ScriptAlias /cgi-bin/ “/usr/local/httpd/cgi-bin/" </IfModule> <IfModule mime_module> AddHandler cgi-script .cgi </IfModule> <Directory “/usr/local/httpd/cgi-bin”> Options ExecCGI Require all granted </Directory>
下面依次解释下以上指令的意义。大家可以看到命令分别包含在alias和mime的模块判断中,所以先在LoadModule中找到alias和mime两个模块并取消注释,同时确认你的/usr/local/httpd/modules中真有这两个模块(应该都有,这属于httpd的核心模块)。ScriptAlias的意义是将uri为/cgi-bin/的路径映射到物理目录/usr/local/httpd/cgi-bin中,也就是你放cgi脚本的那个目录。AddHandler命令表示添加一个cgi的脚本处理器,使httpd能处理cgi脚本,这个cgi脚本处理器名为cgi-script,它处理以.cgi后缀结尾的文件。Options下的ExecCGI选项表示,该目录下可以执行CGI脚本。配置完后重启服务器,然后就可以愉快的进行动态内容的访问了。
此篇文章仅仅介绍了httpd服务器的9牛之1毛,使大家对httpd服务器有个基础的认识。当然httpd服务器还有很多功能,如日志、重写、认证、授权、与php模块进行结合使用、与php-fpm管理器进行结合使用。它是web服务架构中重要的一环,为web服务基础设施贡献了许多力量。
本文出自 “架构师之路” 博客,请务必保留此出处http://wangweiak47.blog.51cto.com/2337362/1606578
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。