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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。