Apache详解(二)Httpd安装和组成

成功不易,加倍努力!

    • Apache详解总目录
      • 2 httpd 安装和组成
        • 2.1 常见http服务器程序
        • 2.2 apache介绍和特点
          • 2.2.1 apache 介绍
          • 2.2.2 MPM multi-processing module 工作模式
        • 2.3 Httpd 安装和相关文件
          • 2.3.1 rpm包安装httpd并启动httpd服务
          • 2.3.2 httpd-2.4 相关文件
          • 2.3.3 httpd 配置文件的组成
          • 2.3.4 编译安装httpd 2.4

Apache详解总目录

  1. Internet 和 http协议
  2. Httpd介绍和安装
  3. Httpd配置
  4. http报文格式
  5. WEB相关工具

2 httpd 安装和组成

http 服务基于 C/S 结构

2.1 常见http服务器程序

  • httpd apache,存在C10K(10K connections)问题
  • nginx 解决C10K问题
  • lighttpd
  • IIS .asp 应用程序服务器
  • tomcat .jsp 应用程序服务器
  • jetty 开源的servlet容器,基于Java的web容器
  • Resin CAUCHO公司,支持servlets和jsp的引擎
  • webshpere:IBM公司
  • weblogic:BEA,Oracle
  • jboss:RedHat,IBM
  • oc4j:Oracle

HTTP服务器市场占有率统计: http://www.netcraft.com

2.2 apache介绍和特点

2.2.1 apache 介绍

20世纪90年代初,国家超级计算机应用中心NCSA开发,1995年开源社区发布apache

apache 名字来源,流传最广的解释是(也是最显而易见的):这个名字来自于一个事实:当Apache在1995年初开发的时候,它是由当时最流行的HTTP服务器NCSA HTTPd 1.3的代码修改而成的,因此是“一个修补的(a patchy)”服务器。然而,在Apache服务器官方网站的FAQ中是这么解释的:“Apache 这个名字是为了纪念名为Apache的美洲原住民印第安人的一支,众所周知他们拥有高超的作战策略和无穷的耐性。”贝伦多夫说:“我选择阿帕奇这个名字是取其积极含义。阿帕奇族是最后一个屈服于美国政府的民族。当时我们担心大公司迟早会参与竞争并‘教化’这块最早的网络之地,所以在我看来,阿帕奇是个很好的名称,也有人说这个词一语双关-因为正如Apache(与"a patchy"谐音)的名字所表明的那样,他们确实是在给服务器打补丁。”

软件基金会

  • ASF:apache software foundation
  • FSF:Free Software Foundation

apache特性

  • 高度模块化:core + modules
  • DSO:Dynamic Shared Object 动态加载/卸载
  • MPM:multi-processing module 多路处理模块

apache 功能

  • 虚拟主机:IP、Port、FQDN
  • CGI:Common Gateway Interface,通用网关接口
  • 反向代理
  • 负载均衡
  • 路径别名
  • 丰富的用户认证机制:basic,digest
  • 支持第三方模块

httpd-2.4 新特性

  • MPM支持运行为DSO机制;以模块形式按需加载
  • event MPM生产环境可用
  • 异步读写机制
  • 支持每模块及每目录的单独日志级别定义
  • 每请求相关的专用配置
  • 增强版的表达式分析式
  • 毫秒级持久连接时长定义
  • 基于FQDN的虚拟主机不需要NameVirutalHost指令
  • 新指令
  • 支持用户自定义变量
  • .更低的内存消耗
2.2.2 MPM multi-processing module 工作模式
  • prefork:多进程I/O模型,每个进程响应一个请求,CentOS 7 默认模型
    一个主进程:生成和回收n个子进程,创建套接字,不响应请求
    多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求
    Apache详解(二)Httpd安装和组成_第1张图片
    Prefork MPM: 预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景

    优点:稳定

    缺点:慢,占用资源,不适用于高并发场景

  • worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
    一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

Apache详解(二)Httpd安装和组成_第2张图片

worker MPM:是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。

优点:相比prefork 占用的内存较少,可以同时处理更多的请求

缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

  • event:事件驱动模型(worker模型的变种),CentOS8 默认模型
    Apache详解(二)Httpd安装和组成_第3张图片
    一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力

    uevent MPM:Apache中最新的模式,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力

    event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)

    优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放

    缺点:没有线程安全控制
    httpd-2.4:event 稳定版,centos7 以后默认
    httpd-2.2:event 测试版,centos6 默认

2.3 Httpd 安装和相关文件

2.3.1 rpm包安装httpd并启动httpd服务

版本说明:CentOS 7 以上,默认系统是httpd 2.4,CentOS 6 版默认为httpd 2.2

安装方式

  • rpm:centos发行版,稳定,建议使用
  • 编译:定制或特殊需求

范例:安装httpd 2.4

[root@centos8 ~]#yum install -y httpd
Last metadata expiration check: 0:21:54 ago on Tue 23 Jun 2020 09:25:23 AM CST.
Dependencies resolved.
===========================================================================================================
 Package                  Architecture Version                                       Repository       Size
===========================================================================================================
Installing:
 httpd                    x86_64       2.4.37-16.module_el8.1.0+256+ae790463         AppStream       1.7 M
Installing dependencies:
 mailcap                  noarch       2.1.48-3.el8                                  base             39 k
 apr                      x86_64       1.6.3-9.el8                                   AppStream       125 k
 apr-util                 x86_64       1.6.1-6.el8                                   AppStream       105 k
 centos-logos-httpd       noarch       80.5-2.el8                                    AppStream        24 k
...省略...
Install  10 Packages

Total download size: 2.3 M
Installed size: 6.6 M
Downloading Packages: 
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing :
1/1
Installing : apr-1.6.3-9.el8.x86_64
1/9
Running scriptlet: apr-1.6.3-9.el8.x86_64
1/9
...省略...
Complete!

[root@centos8 ~]#systemctl start httpd
[root@centos8 ~]#ss -ntl |grep :80
State        Recv-Q        Send-Q                Local Address:Port               Peer Address:Port   
LISTEN       0             128                         0.0.0.0:80                      0.0.0.0:*               
[root@centos8 ~]#lsof -i :80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   4666   root    3u  IPv4  42696      0t0  TCP *:http (LISTEN)
httpd   4669 apache    3u  IPv4  42696      0t0  TCP *:http (LISTEN)
httpd   4670 apache    3u  IPv4  42696      0t0  TCP *:http (LISTEN)
httpd   4671 apache    3u  IPv4  42696      0t0  TCP *:http (LISTEN)
httpd   4884 apache    3u  IPv4  42696      0t0  TCP *:http (LISTEN)

[root@centos8 ~]#rpm -qf /var/www/html/
httpd-filesystem-2.4.37-16.module_el8.1.0+256+ae790463.noarch
2.3.2 httpd-2.4 相关文件

配置文件:

  • /etc/httpd/conf/httpd.conf 主配置文件
  • /etc/httpd/conf.d/*.conf 子配置文件
  • /etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件

检查配置语法:httpd –t

服务单元文件:

  • /usr/lib/systemd/system/httpd.service
  • 配置文件:/etc/sysconfig/httpd

服务控制和启动

  • systemctl enable|disable httpd.service
  • systemctl {start|stop|restart|status|reload} httpd.service
  • apachectl start|stop|restart|configtest

站点网页文档根目录:/var/www/html

模块文件路径:

  • /etc/httpd/modules
  • /usr/lib64/httpd/modules

主服务器程序文件: /usr/sbin/httpd
主进程文件: /etc/httpd/run/httpd.pid

日志文件目录:/var/log/httpd

  • access_log: 访问日志
  • error_log:错误日志

帮助文档包:httpd-manual

http://10.0.0.8/manual/
2.3.3 httpd 配置文件的组成

主要组成

  • Global Environment
  • Main server configuration
  • virtual host

配置文件格式:

directive value

格式说明:

  • directive 不区分字符大小写
  • value 为路径时,是否区分大小写,取决于文件系统

配置文件语法检查:

apachectl configtest
httpd -t

配置官方帮助: http://httpd.apache.org/docs/2.4/

范例:CentOS 8.0 默认配置文件

[root@centos8 ~]#cp /etc/httpd/conf/httpd.conf{,.bak}  #先做备份,免得重装系统
[root@centos8 ~]#grep -Ev '^ *#|^$' /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex haha.html index.html    #网站主页面,可以有备用的,修改后建议用systemctl reload httpd ,不会停止进程 
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
2.3.4 编译安装httpd 2.4

2.3.4.1 编译说明和准备

Apache详解(二)Httpd安装和组成_第4张图片

APR:Apache portable Run-time libraries,Apache可移植运行库,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache 中独立出来,Apache仅仅是使用 APR而已。目前APR主要还是由Apache使用,由于APR的较好的移植性,因此一些需要进行移植的C程序也开始使用APR,开源项目:比如用于服务器压力测试的Flood loader tester,项目站点:http://httpd.apache.org/test/flood

APR官网:http://apr.apache.org

说明:安装httpd-2.4,依赖于apr-1.4+, apr-util-1.4+

编译安装httpd-2.4准备

#安装相关包:
[root@centos7 ~]#yum -y install gcc make pcre-devel openssl-devel expat-devel
#下载源代码并解压缩:
[root@centos7 ~]#wget https://downloads.apache.org//apr/apr-1.7.0.tar.bz2
[root@centos7 ~]#wget https://downloads.apache.org//apr/apr-util-1.6.1.tar.bz2
[root@centos7 ~]#wget https://downloads.apache.org//httpd/httpd-2.4.43.tar.bz2
[root@centos7 ~]#ls
httpd-2.4.43.tar.bz2,apr-1.7.0.tar.bz2,apr-util-1.6.1.tar.bz2
[root@centos7 ~]#tar xvf apr-1.7.0.tar.bz2
[root@centos7 ~]#tar xvf apr-util-1.6.1.tar.bz2
[root@centos7 ~]#tar xvf httpd-2.4.43.tar.bz2

2.3.4.2 编译安装httpd-2.4 方法一

  1. 编译安装apr

    cd apr-1.7.0
    ./configure --prefix=/app/apr
    make && make install
    
  2. 编译安装apr-util

    cd ./apr-util-1.6.1
    ./configure --prefix=/app/apr-util --with-apr=/app/apr/
    make -j 2 && make install
    
  3. 编译安装 httpd-2.4

    cd ../httpd-2.4.41
    ./configure --prefix=/app/httpd24 \
    --enable-so \
    --enable-ssl \
    --enable-cgi \
    --enable-rewrite \
    --with-zlib \
    --with-pcre \
    --with-apr=/app/apr/ \
    --with-apr-util=/app/apr-util/ \
    --enable-modules=most \    
    --enable-mpms-shared=all \  
    --with-mpm=prefork          #当前mpm设置为prefork模型
    make -j 4 && make install
    

2.3.4.3 编译安装httpd-2.4方法二

  1. 将apr 和apr-util源码与httpd 源码合并

    mv apr-1.7.0 httpd-2.4.41/srclib/apr
    mv apr-util-1.6.1 httpd-2.4.41/srclib/apr-util
    ls httpd-2.4.41/srclib/
    apr apr-util Makefile.in
    
  2. 将三者一并编译并安装

    cd httpd-2.4.41/
    ./configure \
    --prefix=/app/httpd24 \
    --enable-so \
    --enable-ssl \
    --enable-cgi \
    --enable-rewrite \
    --with-zlib \
    --with-pcre \
    --with-included-apr \
    --enable-modules=most \     #大部分模块都加进去
    --enable-mpms-shared=all \  #启用mpms多功能处理模块
    --with-mpm=prefork          #当前mpm设置为prefork模型
    make -j 4 && make install
    

2.3.4.4 编译安装后配置

Httpd编译过程:/app/httpd24/build/config.nice
自带的服务控制脚本:/app/httpd24/bin/apachectl

创建专用用户

useradd -s /sbin/nologin -r apache

指定运行httpd的用户

vim /app/httpd24/conf/httpd.conf
user apache
group apache

配置环境变量

方法一:
vim /etc/profile.d/httpd24.sh
PATH=/app/httpd24/bin:$PATH

方法二:
ln -s /app/httpd24/bin/* /usr/bin/

配置帮助

vim /etc/man_db.conf
MANDATORY_MANPATH /app/httpd24/man

#默认没有man帮助
[root@Centos7 ~]#man httpd
No manual entry for httpd

#下面是httpd的man路径
[root@Centos7 ~]#ls /app/httpd24/
bin  build  cgi-bin  conf  error  htdocs  icons  include  lib  logs  man  manual  modules
[root@Centos7 ~]#ls /app/httpd24/man
man1  man8

#修改man帮助配置文件
[root@Centos7 ~]#vim /etc/man_db.conf 
MANDATORY_MANPATH           /app/httpd24/man     #加入这一行

#重新加载
[root@Centos7 ~]#mandb

设置开机自动启动

vim /etc/rc.d/rc.local
/app/httpd24/bin/apachectl start
chmod +x /etc/rc.d/rc.local

创建service unit文件(CentOS 7 以上版本)

vim /usr/lib/systemd/system/httpd24.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
[Service]
Type=forking
#EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/app/httpd24/bin/apachectl start
#ExecStart=/app/httpd24/bin/httpd $OPTIONS -k start
ExecReload=/app/httpd24/bin/apachectl graceful
#ExecReload=/app/httpd24/bin/httpd $OPTIONS -k graceful
ExecStop=/app/httpd24/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target

#重新加载
[root@Centos7 ~]#systemctl daemon-reload
[root@Centos7 ~]#systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)

实验:设置页面

[root@Centos7 ~]#cd /app/httpd24/htdocs/
[root@Centos7 htdocs]#ls
index.html
[root@Centos7 htdocs]#cat index.html 
<html><body><h1>It works!</h1></body></html>
[root@Centos7 htdocs]#mkdir /data/www/

[root@Centos7 htdocs]#vim /app/httpd24/conf/httpd.conf
DocumentRoot "/data/www"
<directory /data/www>
require all granted
</directory>

[root@Centos7 htdocs]#httpd -t
Syntax OK

[root@Centos7 htdocs]#systemctl reload httpd
[root@Centos7 htdocs]#echo /data/www/ > /data/www/index.html

效果如下图:

在这里插入图片描述

创建启动脚本(CentOS 6 以前版本)

#自定义启动脚本(参考httpd-2.2的服务脚本)
cp /etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd24
vim /etc/rc.d/init.d/httpd24
apachectl=/app/httpd24/bin/apachectl
httpd=${HTTPD-/app/httpd24/bin/httpd}
pidfile=${PIDFILE-/app/httpd24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

chkconfig –add httpd24
chkconfig –list httpd24

你可能感兴趣的:(Apache)