HTTPD入门和常见配置
一.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
- 最初 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 默认
- 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管 keep-alive 类型
二.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 testerAPR 官网: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
-
安装后配置
- 创建专用用户
useradd -s /sbin/nologin -r apache
- 指定运行 httpd 的用户
vim /app/httpd24/conf/httpd
user apache
group apache
- 配置环境变量
vim /etc/profile.d/httpd24.sh
PATH=/app/httpd24/bin:$PATH
- 配置帮助文档
vim /etc/man_db.conf
MANDATORY_MANPATH /app/httpd24/man
- 设置开机自动启动
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/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
- 创建启动脚本(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 常见配置
📌
3.1 显示服务器版本信息
指令:ServerTokens Major|Minor|Min[imal]|Prod|OS|Full
ServerTokens Major
在响应头中显示服务器的主版本号
ServerTokens Minor
在响应头中显示服务器的主版本号和次版本号
ServerTokens Min[imal]
在响应头中显示服务器的完整版本号
ServerTokens Prod
只显示服务器类型----生产建议使用该值
ServerTokens OS
显示完整版本号和操作系统类型
ServerTokens Full
都显示,不配置时默认使用 full 值

3.2 设置监听的 IP 和 PORT 端口
指令:Listen [IP:]PORT
- 1 省略 IP 表示为本机所有 IP
- 2 Listen 指令至少一个,可重复出现多次
Listen 192.168.1.100:8080
Listen 80
3.3 持久连接
-
持久连接:Persistent Connection,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,不配置时
默认关闭持久连接 -
连接断开的条件:
时间限制:以秒为单位, 默认 5s,httpd-2.4 支持毫秒级
副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应
折衷:使用较短的持久连接时间 -
配置持久连接的指令
KeepAlive On|Off
KeepAliveTimeOut 15 # 连接持续15s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 500 # 持久连接最大接收的请求数,默认值100
- 通过 telnet 使用 GET 方法测试
[root@webhost ~]# telnet 172.20.1.67 80
Trying 172.20.1.67...
Connected to 172.20.1.67.
Escape character is '^]'.
GET /index.html HTTP/1.1 # 使用GET方法
HOST:2.2.2.2
HTTP/1.1 200 OK
Date: Tue, 10 Dec 2019 13:01:05 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Fri, 06 Dec 2019 01:34:30 GMT
ETag: "5e-598ff0c1ecbee"
Accept-Ranges: bytes
Content-Length: 94
Content-Type: text/html; charset=UTF-8
<DOCTYPE html>
<head>
<p1>Hello There!</p1>
</head>
<body>
<a>A test message!!</a>
</body>
# 返回html响应体后并没有立即断开连接...
Connection closed by foreign host. # 15秒后无请求,断开连接
- 通过浏览器看响应头部信息
3.4 DSO(Dymanic Shared Object)配置
-
Dynamic Shared Object
加载动态模块配置,不需重启即生效
动态模块所在路径为/usr/lib64/httpd/modules/
-
先在主配置文件中
/etc/httpd/conf/httpd.conf
指定加载模块配置文件
ServerRoot "/etc/httpd"
Include conf.modules.d/*.conf
- 再到
/etc/httpd/conf.modules.d/
文件夹下添加特定模块的配置文件和指令
模块文件路径可使用相对路径:相对于 ServerRoot(默认/etc/httpd)
LoadModule <mod_name> <mod_path