目录
[1、 Apache HTTP Server 介绍](#1、 Apache HTTP Server 介绍)
[1.1 apache 概念](#1.1 apache 概念)
[1.2 apache 功能](#1.2 apache 功能)
[1.3 apache 特性](#1.3 apache 特性)
[2、MPM(multi-processing module)工作模式](#2、MPM(multi-processing module)工作模式)
[2.1 prefork](#2.1 prefork)
[2.2 worker](#2.2 worker)
[2.3 event](#2.3 event)
[二、Apache HTTP Server安装和相关文件](#二、Apache HTTP Server安装和相关文件)
[1.1 yum安装](#1.1 yum安装)
[1.2 编译安装](#1.2 编译安装)
[2、 httpd-2.4 相关文件](#2、 httpd-2.4 相关文件)
[三、Apache HTTP Server常用的配置](#三、Apache HTTP Server常用的配置)
[7、 MPM (Multi-Processing Module)多路处理模块](#7、 MPM (Multi-Processing Module)多路处理模块)
[7.1 MPM模块的工作类型](#7.1 MPM模块的工作类型)
[7.2 Prefork模块相关配置](#7.2 Prefork模块相关配置)
[7.3 Worker与event模块相关配置](#7.3 Worker与event模块相关配置)
[8、定义Main server的文档页面路径](#8、定义Main server的文档页面路径)
[8.1 修改文档页面的默认路径](#8.1 修改文档页面的默认路径)
[8.2 设置文档页面路径的别名alias](#8.2 设置文档页面路径的别名alias)
[11.1 基于IP地址](#11.1 基于IP地址)
[11.2 基于端口号](#11.2 基于端口号)
[11.3 基于域名](#11.3 基于域名)
[12.1 设置黑名单](#12.1 设置黑名单)
[12.2 设置白名单](#12.2 设置白名单)
一、常见的http服务程序
-
Apache HTTP Server:也称为Apache,是一个开源的HTTP服务器,目前是全球使用最广泛的Web服务器
-
Nginx:Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器
-
Microsoft Internet Information Services (IIS):IIS是由微软开发的一种Web服务器软件,用于在Windows操作系统上提供服务
-
Lighttpd:Lighttpd是一个开源的Web服务器,具有低内存占用和高并发处理能力
-
Node.js:Node.js本身并不是一个HTTP服务器,但它可以通过HTTP模块创建一个HTTP服务器,因此也可以用作HTTP服务程序
-
Tomcat:Tomcat是一个开源的Java Servlet容器,用于在Java平台上提供HTTP服务
-
Jetty:Jetty是一个开源的Java HTTP服务器和Servlet容器,具有高性能和低内存占用的特点
-
Caddy:Caddy是一个现代的,易于使用的HTTP/2服务器,具有自动HTTPS功能
1、 Apache HTTP Server 介绍
1.1 apache 概念
Apache HTTP Server,通常简称为Apache,是一个开源的HTTP服务器软件,由Apache软件基金会开发和维护。它是全球使用最广泛的Web服务器,其市场份额最高
bash
apache官网: www.apache.org
1.2 apache 功能
-
提供http协议服务
-
多个虚拟主机:IP、Port、FQDN
-
CGI:Common Gateway Interface,通用网关接口,支持动态程序
-
反向代理
-
负载均衡
-
路径别名
-
丰富的用户认证机制:basic,digest
-
支持第三方模块
1.3 apache 特性
-
高度模块化:core + modules
-
DSO:Dynamic Shared Object 动态加载/卸载
-
MPM:multi-processing module 多路处理模块
2、MPM(multi-processing module) 工作模式
2.1 prefork
多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求
Prefork MPM预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
- 优点 :
- 稳定性高,即使某个请求出现问题也不会影响其他请求
- 适合处理非常稳定的工作负载,因为每个请求都有独立的进程
- 缺点 :
- 消耗更多的内存,因为每个进程都需要一定量的内存
- 处理高并发请求时效率稍低
2.2 worker
复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n
worker MPM是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发
- 优点 :
- 相比Prefork,内存消耗更低,因为线程共享同一进程的资源
- 能够更高效地处理并发请求
- 缺点 :
- 稳定性较差,如果某个线程崩溃,可能会影响整个进程,导致其他请求受到影响
- 使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用
2.3 event
Event模式是在Worker模式的基础上改进而来,它引入了异步事件处理机制,可以更有效地处理大量并发连接
事件驱动模型(worker模型的变种),CentOS8 默认模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
- 优点 :
- 单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
- 在高并发情况下表现更出色,因为采用了异步事件处理
- 内存消耗更低
- 缺点 :
- 可能会引入一些复杂性,需要更仔细地处理事件驱动的编程模型
- 没有线程安全控制
二、Apache HTTP Server安装和相关文件
bash
#版本说明:
CentOS 7 以上,默认系统是httpd 2.4,CentOS 6 版默认为httpd 2.2
Ubuntu 18.04 默认 Apache/2.4.29
1、安装方式
1.1 yum安装
centos发行版,稳定,建议使用
bash
[root@localhost ~]#yum install -y httpd
1.2 编译安装
有定制或特殊需求
前提:安装httpd-2.4,依赖于apr-1.4+, apr-util-1.4+
bash
#安装相关包:
[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.46.tar.bz2
[root@centos7 ~]#ls
httpd-2.4.46.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.46.tar.bz2
[root@centos7 ~]#mv apr-1.7.0 httpd-2.4.46/srclib/apr
[root@centos7 ~]#mv apr-util-1.6.1 httpd-2.4.46/srclib/apr-util
[root@centos7 ~]#ls httpd-2.4.46/srclib/
[root@centos7 ~]#apr apr-util Makefile.in
bash
#脚本运行编译安装
[root@localhost ~]#vim apaz.sh
#!/bin/bash
#Description: httpd source code install
#下载源码包
target_dir=/usr/local/src
install_dir=/usr/local/httpd
download_url=https://mirror.bit.edu.cn/apache/httpd/httpd-2.4.46.tar.bz2
file_name=${download_url##*/}
uncompress_dir=${file_name%.tar*}
rpm -q wget || yum install -y wget
wget -O $target_dir/$file_name $download_url
#安装依赖包
yum install -y gcc make apr-devel apr-util-devel pcre-devel openssl-devel
redhat-rpm-config
#添加apache用户
id apache &> /dev/null || useradd -r -u 80 -d /var/www -s /sbin/nologin apache
#解压源码包
tar xf $target_dir/$file_name -C $target_dir
cd $target_dir/$uncompress_dir
#编译安装
./configure --prefix=$install_dir --sysconfdir=/etc/httpd --enable-ssl
make -j`lscpu | grep "^CPU(s)" | awk '{print $NF}'` && make install
#设置环境变量
echo 'PATH='$install_dir'/bin:$PATH' > /etc/profile.d/httpd.sh
source /etc/profile.d/httpd.sh
#修改配置文件
sed -ri 's#(User )daemon#\1apache#' /etc/httpd/httpd.conf
sed -ri 's#(Group )daemon#\1apache#' /etc/httpd/httpd.conf
#启动httpd服务
cat > /lib/systemd/system/httpd.service << EOF
[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
ExecStart=/usr/local/httpd/bin/apachectl start
ExecReload=/usr/local/httpd/bin/apachectl graceful
ExecStop=/usr/local/httpd/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable httpd.service
systemctl start httpd.service
2、 httpd-2.4 相关文件
| 主要配置文件 ||
| /etc/httpd/conf/httpd.conf | 主配置文件 |
| /etc/httpd/conf.d/*.conf | 子配置文件 |
/etc/httpd/conf.d/conf.modules.d/ | 模块加载的配置文件 |
---|
/usr/lib/systemd/system/httpd.service | 服务单元文件 |
---|
/etc/sysconfig/httpd | 服务器的配置文件,包含了一些环境变量和选项 |
---|
|--------------------|--------------------------|--------|
| /etc/httpd/modules | /usr/lib64/httpd/modules | 模块文件路径 |
/usr/sbin/httpd | 主服务器程序文件 |
---|
/var/www/html | 站点网页文档根目录 |
---|
3、httpd服务控制
-
systemctl enable|disable httpd.service
-
systemctl {start|stop|restart|status|reload} httpd.service
-
apachectl start|stop|restart|configtest
-
service httpd start|stop|restart|configtest
4、httpd命令使用
bash
#检查配置语法
httpd -t
bash
#查看当前系统httpd版本信息
httpd -v
三、Apache HTTP Server常用的配置
前提:下面将修改httpd的主配置文件:/etc/httpd/conf/httpd.conf,可能在修改的过程中会出现很多错误,为避免错误无法挽回,先备份一下配置文件
bash
[root@localhost ~]#cd /etc/httpd/conf
[root@localhost conf]#cp httpd.conf httpd.bak
1、指定服务器名
bash
[root@localhost ~]#httpd -t #查看httpd配置文件是否出错
[root@localhost ~]#vim /etc/httpd/conf/httpd.conf
ServerName www.example.com:80 #开启ServerName配置
[root@localhost ~]#httpd -t
2、包含其他配置文件
bash
#指令
Include file-path|directory-path|wildcard
IncludeOptional file-path|directory-path|wildcard
注:
Include和IncludeOptional功能相同,都可以包括其它配置文件
但是当无匹配文件时,include会报错,IncludeOptional会忽略错误
include子配置文件:
总目录:
3、隐藏服务器版本信息
bash
#相关语法
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
#相关指令
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2 此为默认值
bash
#在服务器上修改主配置文件或者子配置文件
[root@localhost ~]#vim /etc/httpd/conf/httpd.conf
servertokens prod
#或者
[root@localhost ~]#vim /etc/httpd/conf.d/dh.conf
servertokens prod
[root@localhost ~]#systemctl restart httpd
4、监听地址
bash
#省略IP表示监听本机所有IP地址的特定端口
Listen PORT
#指定IP地址表示监听该IP地址的特点端口
Listen IP:PORT
#主:Listen指令至少一个,可重复出现多次
bash
#服务器httpd配置
[root@localhost ~]#vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 9527
[root@localhost ~]#systemctl restart httpd
[root@localhost ~]#ifconfig ens33:0 172.16.12.100
#客户端测试操作
[root@localhost ~]#curl 172.16.12.10
[root@localhost ~]#curl 172.16.12.100
[root@localhost ~]#curl 172.16.12.10:9527
[root@localhost ~]#curl 172.16.12.10:9527
httpd服务器配置:
客户端测试:
bash
#服务器httpd配置
[root@localhost ~]#vim /etc/httpd/conf/httpd.conf
Listen 172.16.12.10:80
Listen 172.16.12.10:9527
[root@localhost ~]#systemctl restart httpd
[root@localhost ~]#ifconfig ens33:0 172.16.12.100
#客户端测试操作
[root@localhost ~]#curl 172.16.12.10
[root@localhost ~]#curl 172.16.12.10:9527
[root@localhost ~]#curl 172.16.12.100
[root@localhost ~]#curl 172.16.12.100:9527
5、持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认开启持久连接
断开条件:
- 时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
- 请求数量: 请求数达到指定值,也会断开
副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应
折衷:使用较短的持久连接时间
bash
#持久连接相关配置语句
KeepAlive On|Off #开启或关闭持久连接
KeepAliveTimeout 300 #连接持续300s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 2 #持久连接最大接收的请求数,默认值100
6、DSO (Dynamic Shared Object)
Dynamic Shared Object,一种在运行时加载并链接到应用程序的库。这种库在Linux系统中通常以.so文件扩展名结尾,可加载动态模块配置,无需重启即生效动态模块所在路径
bash
#查看静态编译的模块
[root@localhost ~]#httpd -l
bash
#查看静态编译及动态装载的模块
[root@localhost ~]#httpd -M
7、 MPM (Multi-Processing Module)多路处理模块
7.1 MPM模块的工作类型
Prefork MPM:这是Apache的默认MPM。它使用多个独立的进程来处理请求,每个进程都有自己的内存空间,这样可以确保一个进程的崩溃不会影响到其他进程。然而,由于进程之间的切换开销较大,Prefork MPM的性能相对较低。
Worker MPM:这种MPM使用多个线程来处理请求,每个线程都可以处理一个请求。由于线程之间的切换开销较小,Worker MPM的性能相对较高。然而,由于线程共享同一内存空间,一个线程的崩溃可能会影响到其他线程。
Event MPM:这种MPM是Worker MPM的改进版本。它使用了更高效的事件驱动模型,可以进一步提高服务器的性能。Event MPM在处理长连接(如HTTP Keep-Alive)时特别有效,因为它可以在一个连接上处理多个请求
7.2 Prefork模块相关配置
bash
#httpd关于prefork模式相关配置语句
StartServers 100
MinSpareServers 50
MaxSpareServers 80
ServerLimit 2560 #最多进程数,最大值 20000
MaxRequestWorkers 2560 #最大的并发连接数,默认256
MaxConnectionsPerChild 4000 #子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个
请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
MaxRequestsPerChild 4000 #从httpd.2.3.9开始被MaxConnectionsPerChild代替
bash
[root@localhost ~]#cd /etc/httpd/conf.modules.d/
[root@localhost conf.modules.d]#vim 00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
startservers 10
[root@localhost ~]#pstree -p | grep httpd
[root@localhost ~]#systemctl restart httpd
[root@localhost ~]#pstree -p | grep httpd
7.3 Worker与event模块相关配置
bash
#httpd关于Worker和event模式相关配置语句
ServerLimit 16 #最多worker进程数 Upper limit on configurable number of
processes
StartServers 10 #Number of child server processes created at startup
MaxRequestWorkers 150 #Maximum number of connections that will be processed
simultaneously
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25 #Number of threads created by each child process
8、定义Main server的文档页面路径
8.1 修改文档页面的默认路径
bash
#说明:DocumentRoot指向的路径为URL路径的起始位置,/path必须显式授权后才可以访问
DocumentRoot "/path"
<directory /path>
Require all granted
</directory>
bash
#httpd服务器配置
[root@localhost ~]#vim /etc/httpd/conf/httpd.conf
DocumentRoot "/opt/html"
<Directory "/opt/html">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
[root@localhost ~]#mkdir /opt/html
[root@localhost ~]#cd /opt/html
[root@localhost html]#echo "nihao"> index.html
[root@localhost html]#echo "hello">/var/www/html/index.html
[root@localhost html]#systemctl restart httpd
#客户端检测
[root@localhost ~]#curl 172.16.12.10
httpd服务器配置:
客户端测试:
8.2 设置文档页面路径的别名alias
bash
#httpd服务器配置
[root@localhost ~]#vim /etc/httpd/conf.d/dh.conf
DocumentRoot "/opt/html"
<Directory "/opt/html">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
alias /mnt /opt/html
[root@localhost html]#systemctl restart httpd
#客户端检测
[root@localhost ~]#curl 172.16.12.10/mnt/
httpd服务器配置:
客户端测试:
9、定义站点默认主页面文件
bash
#httpd服务器配置
[root@localhost html]#vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex xzf.txt index.html
</IfModule>
[root@localhost html]#systemctl restart httpd
[root@localhost ~]#cd /opt/html
[root@localhost html]#echo "yyyyy"> xzf.txt
[root@localhost html]#cat index.html
#客户端测试
[root@localhost ~]#curl 172.16.12.10
httpd服务器配置:
客户端测试:
10、针对目录和URL实现访问控制
Options 指令
后跟1个或多个以空白字符分隔的选项列表,在选项前的+,-表示增加或删除指定选项
| 常用选项 | 说明 |
| Indexes | 指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户 |
| FollowSymLinks | 允许访问符号链接文件所指向的源文件 |
| None | 全部禁用 |
AIl | 全部允许 |
---|
bash
Options 可以写在 目录里<> 也可以写在外面
bash
#指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
options Indexes
httpd服务器配置:
客户端测试:
bash
#允许访问符号链接文件所指向的源文件
options Indexes FollowSymLinks
httpd服务器配置:
客户端测试:
11、配置虚拟主机
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
网站的唯一标识:
- IP相同,但端口不同
- IP不同,但端口均为默认端口
- FQDN不同, IP和端口都相同
多虚拟主机有三种实现方案:
- 基于ip:为每个虚拟主机准备至少一个ip地址
- 基于port:为每个虚拟主机使用至少一个独立的port
- 基于FQDN:为每个虚拟主机使用至少一个FQDN,请求报文中首部
基于ip地址:
172.16.12.10 ---------> jd
172.16.12.100 ---------> taobao
基于端口:
172.16.12.10:80 ---------> jd
172.16.12.10:9527 ---------> taobao
基于域名:
www.lucky.com --------> ji
www.cloud.com ---------> taobao
11.1 基于IP地址
bash
#httpd服务器配置
[root@localhost html]#vim /etc/httpd/conf.d/dh.conf
DocumentRoot "/opt/html"
<Directory "/opt/html">
AllowOverride None
# Allow open access:
Require all granted
options Indexes FollowSymLinks
</Directory>
alias /mnt /opt/html
<VirtualHost 172.16.12.10>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/10"
ServerName www.accp.com
ErrorLog "logs/10_error_log"
CustomLog "logs/10_access_log" common
</VirtualHost>
<VirtualHost 172.16.12.100>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/100"
ServerName www.accp.com
ErrorLog "logs/100_error_log"
CustomLog "logs/100_access_log" common
</VirtualHost>
[root@localhost html]#systemctl restart httpd
[root@localhost html]#ifconfig ens33:0 172.16.12.100
[root@localhost html]#rm -rf *
[root@localhost html]#mkdir 10 100
[root@localhost html]#echo jd > 10/index.html
[root@localhost html]#echo taobao > 100/index.html
#客户端测试
[root@localhost ~]#curl 172.16.12.10
[root@localhost ~]#curl 172.16.12.100
测试:
11.2 基于端口号
bash
[root@localhost html]#vim /etc/httpd/conf.d/dh.conf
Listen 9527
DocumentRoot "/opt/html"
<Directory "/opt/html">
AllowOverride None
# Allow open access:
Require all granted
options Indexes FollowSymLinks
</Directory>
alias /mnt /opt/html
<VirtualHost 172.16.12.10:80>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/10"
ServerName www.accp.com
</VirtualHost>
<VirtualHost 172.16.12.10:9527>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/100"
ServerName www.accp.com
</VirtualHost>
[root@localhost html]#systemctl restart httpd
httpd服务器配置:
客户端测试:
11.3 基于域名
bash
[root@localhost html]#vim /etc/httpd/conf.d/dh.conf
Listen 80
DocumentRoot "/opt/html"
<Directory "/opt/html">
AllowOverride None
# Allow open access:
Require all granted
options Indexes FollowSymLinks
</Directory>
alias /mnt /opt/html
<VirtualHost 172.16.12.10>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/10"
ServerName www.lucky.com
</VirtualHost>
<VirtualHost 172.16.12.10>
ServerAdmin support@jfedu.net
DocumentRoot "/opt/html/100"
ServerName www.cloud.com
</VirtualHost>
[root@localhost html]#vim /etc/httpd/conf.d/dh.conf
httpd服务器操作:
客户端测试:
12、基于客户端IP地址实现控制访问
12.1 设置黑名单
拒绝黑名单内的IP地址访问服务器
bash
[root@localhost html]#vim /etc/httpd/conf.d/mingdan.conf
DocumentRoot "/opt/html"
<Directory "/opt/html">
<RequireAll>
Require all granted
Require not ip 172.16.12.12 #拒绝特定ip
</RequireAll>
</directory>
[root@localhost html]#systemctl restart httpd
httpd服务器配置:
客户端测试:
12.2 设置白名单
只允许白名单内的ip访问服务器
bash
[root@localhost html]#vim /etc/httpd/conf.d/mingdan.conf
DocumentRoot "/opt/html"
<Directory "/opt/html">
<RequireAny>
Require all denied
Require ip 172.16.12.12 #只允许特定ip访问
</RequireAny>
</directory>
[root@localhost html]#systemctl restart httpd
客户端测试: