HTTPD入门和常见配置

HTTPD入门和常见配置

  • 一.HTTPD 介绍
    • 1.1 常见 http 服务器
    • 1.2 apache 介绍和 httpd 特点
      • 1.2.1 apache 介绍
      • 1.2.2 apache 特点
      • 1.2.3 apache 的特性 MPM
  • 二.HTTPD 安装及重要文件
    • 2.1 使用包管理器直接 rpm 包安装 httpd
    • 2.2 htpd-2.4 版本重要文件
    • 2.3 httpd 配置文件介绍
    • 2.4 编译安装 httpd-2.4 版本
      • 2.4.1 编译准备
      • 2.4.2 编译安装法一
        • 2.4.2.1 编译安装 apr
        • 2.4.2.2 编译安装 apr-util
        • 2.4.2.3 编译安装 httpd-2.4
      • 2.4.3 编译安装法二
        • 2.4.3.1 将 apr 和 apr-util 源码与 httpd 源码合并
        • 2.4.3.1 将三者一并编译并安装
      • 2.4.4 编译安装后配置
  • 三.HTTPD 常见配置
    • :pushpin:
      • 3.1 显示服务器版本信息
      • 3.2 设置监听的 IP 和 PORT 端口
      • 3.3 持久连接
      • 3.4 DSO(Dymanic Shared Object)配置
      • 3.5 MPM(Multi-Processing Module)模块配置
      • 3.6 prefork 模式的相关配置
      • 3.7 worker 和 event 模式相关的配置
      • 3.8 自定义 Main server 的文档页面路径
      • 3.9 自定义站点主页面
    • :pushpin:
      • 3.10 配置实现对站点资源访问的控制
      • 3.11 针对目录实现访问控制
      • 3.12 基于客户端 IP 地址实现访问控制
      • 3.13 日志配置
      • 3.14 配置默认字符集
      • 3.15 定义路径别名
      • 3.17 基于用户的访问控制
      • 3.18 远程客户端 IP 和用户身份验证控制
    • :pushpin:
      • 3.19 配置实现用户家目录共享
      • 3.20 配置避免错误网页包含的信息泄露
      • 3.21 配置禁止使用 trace 方法
      • 3.22 配置 status 状态页
      • 3.23 配置多虚拟主机
      • 3.24 配置压缩页面优化速度
      • 3.25 配置实现 https
      • 3.26 配置 URL 重定向
      • 3.27 配置实现 HSTS
      • apache 可以配置简单的反向代理
      • 3.29 apache 可以配置支持内核的 Sendfile 机制

一.HTTPD 介绍

1.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)
jboss
oc4j(Oracle)

1.2 apache 介绍和 httpd 特点

  • 注意: 一般 apache 就是指 httpd

1.2.1 apache 介绍

  • 20 世纪 90 年代初,美国国家超级计算机应用中心 NCSA 开发 httpd

WIKI

  • 最初 NCSA HTTPd 服务器是由 Rob McCool 开发出来的,但是它的最初开发者们逐渐对这个软件失去了兴趣,
    并转移到了其他地方,造成了没有人来对这个服务器软件提供更多的技术支持。因为这个服务器的功能又如此
    强大,而代码可以自由下载修改与发布,当时这个服务器软件的一些爱好者与用户开始自发起来,互相交流并分发
    自己修正後的软件版本,并不断改善其功能。为了更好进行沟通,brian behlendorf 自己建立了一个邮件列表,
    把它作为这个群体(或者社区)交流技术、维护软件的一个媒介,把代码重写与维护的工作有效组织起来。这些
    开发者们逐渐地把他们这个群体称为“Apache 组织”,把这个经过不断修正并改善的服务器软件命名为 Apache
    服务器(Apache Server)。
  • 这个命名是根据北美当地的一支印第安部落而来,这支部落以高超的军事素养和超人的忍耐力着称,19 世纪
    后半期对侵占他们领土的入侵者进行了反抗。为了对这支印第安部落表示敬仰之意,取该部落名称(Apache)
    作为服务器名。但一提到这个命名,这里还有流传着一段有意思的故事。因为这个服务器是在 NCSA HTTPd
    服务器的基础之上,通过众人努力,不断地修正、打补丁(Patchy)的产物,被戏称为“A Patchy Server”
    (一个补丁服务器)。在这里,因为“Patchy”与“Apache”是谐音,故最後正式命名为“Apache Server”。
  • 后来由于商业需求的不断扩大,以 Apache HTTP 服务器为中心,启动了更多的与 Apache 项目并行的项目,
    比如 mod_ perl、PHP、Java Apache 等等。随着时间的推移、形势的变化,Apache 软件基金会的项目列表
    也不断更新变化中--不断的有新项目启动,项目的中止以及项目的拆分与合并。比如一开始,Jakarta 就是
    为了发展 JAVA 容器而启动的 Java Apache 项目,後来由于太阳公司(SUN)的建议,项目名称变为 Jakarta 。
    但当时该项目的管理者也没有想到 Jakarta 项目因为 JAVA 的火爆而发展到如今一个囊括了众多基于 JAVA 语言
    开源软件子项目的项目。以至后来,不得不把个别项目从 Jakarta 中独立出来,成为 Apache 软件基金会的顶级
    项目,Struts 项目就是其中之一。

1.2.2 apache 特点

  • 特性

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

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

    • MPM 支持运行为 DSO 机制;以模块形式按需加载
    • event MPM 生产环境可用
    • 异步读写机制
    • 支持每模块及每目录的单独日志级别定义
    • 每请求相关的专用配置
    • 增强版的表达式分析式
    • 毫秒级持久连接时长定义
    • 基于 FQDN 的虚拟主机不需要 NameVirutalHost 指令
    • 新的配置指令
    • 支持用户自定义变量
    • 更低的内存消耗

1.2.3 apache 的特性 MPM

  • MPM:Multi-processing module 多处理工作模式

  • prefork:多进程 I/O 模型,每个进程响应一个请求,CentOS7 默认模型 一个主进程:生成和回收 n 个子进程,
    创建套接字,不响应请求 多个子进程:工作 work 进程,每个子进程处理一个请求;系统初始时,预先生成多个
    空 进程,等待请求

  • Prefork MPM: prefork 预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应
    用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定
    的模式,适用于访问量不是很大的场景

    • 优点:稳定
    • 缺点:慢,占用资源,不适用于高并发场景
  • worker:复用的多进程 I/O 模型,多进程多线程,IIS 使用此模型 一个主进程:生成 m 个子进程,每个子进程负责创建
    n 个线程,每个线程响应一个请求,并发响应请求:m*n

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

    • 优点:相比 prefork 占用的内存较少,可以同时处理更多的请求
    • 缺点:使用 keep-alive 的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时
      才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在
      prefork 模式下,同样会发生)
  • event:事件驱动模型(worker 模型的变种),CentOS8 默认模型;一个主进程:生成 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 默认

二.HTTPD 安装及重要文件

2.1 使用包管理器直接 rpm 包安装 httpd

  • 使用包管理器安装:CentOS 7 以上,默认系统是 httpd 2.4,CentOS 6 版默认为 httpd 2.2
    centos7yum install httpd -y
    centos8dnf install httpd -y

2.2 htpd-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
  • 默认站点网页文档根目录:/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

2.3 httpd 配置文件介绍

  • 配置文件主要组成
    Global Environment 全局环境配置
    Main server configuration 服务器配置
    virtual host 虚拟主机配置

  • 配置文件格式:
    指令和值的格式:Directive value
    Directive 指令不区分字符大小写
    value 值为路径时,是否区分大小写,取决于文件系统

配置官方帮助

  • centos8 默认配置
[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 index.html
</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
  • centos7 默认配置
[root@webhost ~]# grep -Ev '^ *#|^$' /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
ServerSignature EMail
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin stevobs@163.com
<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
    AllowOverride Options=Indexes,FollowSymLinks
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html
</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
    LogFormat "%h %l %u %t"  short
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combinedio
</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 off
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf

2.4 编译安装 httpd-2.4 版本

2.4.1 编译准备

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

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

2.4.2 编译安装法一

2.4.2.1 编译安装 apr
cd apr-1.7.0
./configure --prefix=/app/apr
make && make install
2.4.2.2 编译安装 apr-util
cd ../apr-util-1.6.1
./configure --prefix=/app/apr-util --with-apr=/app/apr/
make -j 2 && make install
2.4.2.3 编译安装 httpd-2.4
cd ../httpd-2.4.39
./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
make -j 4 && make install

2.4.3 编译安装法二

2.4.3.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.4.3.1 将三者一并编译并安装
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 \
--with-mpm=prefork  
make && make install

2.4.4 编译安装后配置

  • 查看 httpd 的编译过程:
    less /app/httpd24/build/config.nice

  • 自带的服务控制脚本:
    /app/httpd24/bin/apachectl

  • 安装后配置

  1. 创建专用用户
useradd -s /sbin/nologin -r apache
  1. 指定运行 httpd 的用户
vim /app/httpd24/conf/httpd
user apache
group apache
  1. 配置环境变量
vim /etc/profile.d/httpd24.sh
PATH=/app/httpd24/bin:$PATH
  1. 配置帮助文档
vim /etc/man_db.conf
MANDATORY_MANPATH           /app/httpd24/man
  1. 设置开机自动启动
vim /etc/rc.d/rc.local
/app/httpd24/bin/apachectl start
chmod +x /etc/rc.d/rc.local
  1. 创建 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/httpd $OPTIONS -k start
ExecReload=/app/httpd24/bin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH {
   MAINPID}
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
  1. 创建启动脚本(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

三.HTTPD 常见

你可能感兴趣的:(apache,apache)