设为首页 收藏本站
查看: 1967|回复: 0

[经验分享] Apache Httpd服务器之基础

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-1-22 08:20:24 | 显示全部楼层 |阅读模式
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安装过程:
1
2
3
    cd /usr/local/apr-1.5.1
        ./configure —prefix=/usr/local/apr
        make && make install



        apr-util安装过程:

1
2
    cd /usr/local/apr-util-1.5.4
        ./configure —prefix=/usr/local/apr-util —with-apr=/usr/local/apr



        pcre安装过程:

1
2
3
    cd /usr/local/pcre-8.36
        ./configure —prefix=/usr/local/pcre
        make && make install



    zlib安装过程:

1
2
3
        cd /usr/local/zlib-1.2.8
        ./configure —prefix=/usr/local/zlib
        make && make install



    安装完以上三个前置软件,就可以安装apache httpd服务器了。
    httpd安装过程:

1
2
3
4
5
6
7
8
        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>容器。下面是一段目录设置代码:

1
2
3
4
5
    <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的配置代码:
1
2
3
4
5
6
7
8
    <IfModule mpm_prefork_module> #这个判断可以不加,除非你非常确定自己启动了prefork的模式
        StartsServers    5    #服务器启动时创建的进程数
        MinSpareServers    5    #最小空闲进程数
        MaxSpareServers    10    #最大空闲进程数
        MaxRequestWorkers    250    #最高并发量
        MaxConnectionsPerChild    0    #单个进程能处理的连接数,如果设置为正整数值,则在超过此连接数后,
                                        该子进程会被Kill掉。当设置为0时,表示无限制                              
    </IfModule>



    worker为多线程多进程的服务器,可以处理海量请求,前提是你的服务器能抗的住。如下是一段worker的配置代码:

1
2
3
4
5
6
7
8
    <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脚本如下:
   

1
2
3
    #!/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文件,参考如下配置代码:

1
2
3
4
5
6
7
8
9
10
    <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服务基础设施贡献了许多力量。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-41255-1-1.html 上篇帖子: Apache启动提示 httpd: apr_sockaddr_info_get() failed for xxx 下篇帖子: Apache配置实现cgi 服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表