阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Apache Httpd服务器之基础教程

119次阅读
没有评论

共计 6469 个字符,预计需要花费 17 分钟才能阅读完成。

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 服务基础设施贡献了许多力量。

CentOS 6.5 编译安装 httpd-2.4.7 http://www.linuxidc.com/Linux/2014-02/97265.htm

httpd 中工作模型的比较  http://www.linuxidc.com/Linux/2014-03/99093.htm

源码编译安装 httpd2.4 及虚拟主机 http://www.linuxidc.com/Linux/2014-08/105384.htm

编译安装最新版 httpd-2.4 http://www.linuxidc.com/Linux/2014-03/98761.htm

httpd2.4 基本功能的实现 … http://www.linuxidc.com/Linux/2014-03/98762.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计6469字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中