1、概念介绍
a. Web 服务简介
WEB服务器也称为WWW(WORLD WIDE WEB,万维网)服务器,主要功能是提供网上信息浏览服务。
常用web服务器:httpd(apache)、nginx、tomcat、IIS
客户端:IE、firefox、chrome
b. Apache 简介
官网地址:Welcome to The Apache Software Foundation!
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。
c. Apache 特点
① 开放源代码:这是apache服务器的重要特性之一,也是其他特性的基础,任何人都可以自由使用,这充分体现了开源软件的精神。
② 跨平台应用:这个特性得益于apache的源代码开放,apache服务器可以运行在绝大多数软硬件平台,如linux、unix、windows等。
③ 支持各种web编程语言:apache服务器可支持的网页编程语言包括perl、php、python、java等,甚至微软的ASP技术也可以在apache服务器中使用。支持各种常用的web编程语言使apache具有更广泛的应用领域。
④ 模块化设计:apache并没有将所有的功能集中在单一的服务程序内部,而是尽可能地通过标准的模块实现专有的功能,这为apache服务器带来了良好的扩展性,其他软件开发商可以编写标准的模块程序,从而添加apache本身不具有的其他功能。
⑤ 运行非常稳定:apache服务器可用于构建具有大负载访问量的web站点。
⑥ 良好的安全性:apache服务器具有相对较好的安全性,这是开源软件共同具有的特性,并且,apache的维护团队会及时对发现的漏铜提供修补程序。
d. Apache 版本
apache服务器目前包括1.X和2.X两个版本:
1.X系列的最高版本是1.3,该版本继承了apache服务器1.0版本以来的优秀特性和配置管理风格,具有非常好的兼容性、稳定性。
从2.0版本开始,apache服务器加入了许多新的功能,使用的配置语法和管理风格也有所改变。对于新构建的网站服务器,使用2.X版本是一个不错的选择。目前apache的最新版本是httpd-2.4.54
e. Apache 端口
- B/S 架构
- 80: http
- 443:http
f. Apache 基金会
Apache软件基金会是世界上最大的开源基金会
- 300+顶级项目
- 2.71 亿多行代码用于管理
- 350 多个项目和倡议
- 从 Apache 镜像下载约 2 PB 的源代码
- 850 多名个人 ASF 成员
- 8,200 多个 Apache 提交者
- 49,000 多名代码贡献者
- GitHub 流量:前 5 个最活跃的 Apache 资源---克隆:Thrift、Beam、Cordova、Arrow、Geode;
- GitHub 流量:前 5 个最活跃的 Apache 资源---访问量:Spark、Flink、Camel、Kafka、Beam;
- 价值22B 美元以上的 Apache 开源软件产品以 100% 的免费提供给广大公众,使全球数十亿用户受益
2、源码安装 Apache
a. apache 安装
# 下载httpd
wget http://archive.apache.org/dist/httpd/httpd-2.4.54.tar.gz
# 解压至/usr/local/src
tar -zxvf httpd-2.4.54.tar.gz -C /usr/local/src
# 安装编译环境和apache依赖
yum install -y gcc gcc-c++ apr arp-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-devel pcre openssl*
# 进入httpd目录
cd /usr/local/src/httpd-2.4.54/
# 预编译
./configure --prefix=/usr/local/apache --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-ssl --enable-mpms-shared=all --enable-mpm-with=event
# 编译
make -j 2
# 安装
make install
预编译配置参数用途:
- --prefix=:指定安装目录
- --enable-so:支持动态加载模块
- --enable-rewrite :支持网站地址重写
- --enable-cgi:支持CGI程序脚本
- --enable-ssl:支持SSL加密
- --enable-charset-lite:支持多语言编码
- --enable-mpms-shared=all:安装apache所有运行模式模块
b. apache 目录结构
ls /usr/local/apache
|---------|---------------------------------------------------|
| bin | 存放httpd服务的各种执行程序文件,包括主程序httpd,服务控制工具apachectl等 |
| cgi-bin | 存放各种CGI程序文件 |
| logs | 存放httpd服务的日志文件 |
| conf | 存放httpd服务的各种配置文件,包括主配置文件httpd.conf、增强配置子目录extra等。 |
| htdocs | 存放网页文档,包括默认首页文件index.html等。 |
| modules | 存放httpd服务的各种模块文件 |
c. 优化执行路径(2选1)
① 添加软连接:通过源码编译安装的httpd服务,程序路径并不在默认的搜索路径中,为了使该服务在使用时更加方便,可以为相关程序添加符号链接 ln -s /usr/local/apache/bin/* /usr/local/bin
② 修改PATH环境变量:在/etc/profile 中添加PAHT环境变量
vim /etc/profile
PATH=$PATH:/usr/local/apache/bin
source /etc/profile
# 查看apache版本
httpd -v
3、添加httpd系统服务**(2选1)**
a.使用chkconfig添加系统服务
chkconfig命令 主要用来更新(启动或停止)和查询系统服务的运行级信息, 若希望将httpd添加为系统服务,以便通过chkconfig进行管理,需要编写服务管理脚本,把脚本放在/etc/init.d/目录下,并在脚本开头添加chkconfig识别配置。
# 生成服务器管理脚本
cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
# 添加chkconfig识别
vim /etc/init.d/httpd
#!/bin/sh
# chkconfig:2345 11 88 # 运行级别 启动优先级 关闭优先级
# description:apache web server # 服务描述信息
# 设置开机自动启动
chkconfig --add httpd # 添加服务,以便让chkconfig指令管理它
chkconfig httpd on # 设置开机运行该服务,默认是设置2345等级开机运行服务
chkconfig --list httpd
# 删除指定的服务,不再让chkconfig指令管理它
chkconfig --del httpd
# 查看端口和进程信息
netstat -antup | grep httpd
ps -ef | grep httpd
# 客户端测试
cur 192.168.137.5
b 使用 .service 脚本
centos7使用sytemd管理操作系统服务,systemd是Linux系统最新的初始化系统,对应的进程管理命令是systemctl, systemctl命令兼容了service,systemctl实际上将 service 和 chkconfig 这两个命令组合到一起,即systemctl也会去/etc/init.d目录下,查看,执行相关程序。
systemd使用.service脚本管理linux脚本, systemd有系统和用户区分:
- 系统.service文件放在/usr/lib/systemd/system/
- 用户.service文件放在/etc/lib/systemd/user/
一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/目录下面。
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都指向/usr/lib/systemd/system/目录。systemctl enable命令用于在上面两个目录之间,建立符号链接关系。开机时,Systemd只执行/etc/systemd/system目录里面的配置文件。
① 在编写.service 脚本之前,先将chkconfig服务和httpd服务停掉,清除上步操作:
systemctl stop httpd
ps -ef | grep httpd
# chkconfig关闭httpd服务管理
chkconfig --del httpd
chkconfig --list | grep httpd
② 编写.service脚本
cat /usr/lib/systemd/system/httpd.service
[Unit]
Description=httpd
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/apache/bin/apachectl start
ExecReload=/usr/local/apache/bin/apachectl restart
ExecStop=/usr/local/apache/bin/apachectl stop
PrivateTmp=True
[Install]
WantedBy=multi-user.target
③ 添加开机自启动
# 设置服务开机自启动
systemctl enable httpd
# 查看服务是否是开机自启动
systemctl is-enabled httpd
ll /etc/systemd/system/multi-user.target.wants/httpd.service
④ 启动服务并查看
# 启动服务
systemctl start httpd
# 查看服务
systemctl status httpd
⑤ 客户端测试
curl 192.168.137.5
c. .service 脚本详解
Unit字段: 主要给出服务描述、启动顺序和依赖关系
Description字段 给出当前服务的简单描述。
Documentation字段 给出文档位置。
After字段 表示在什么服务之后启动,不涉及依赖关系
Before字段 表示在什么服务之前启动,不涉及依赖关系
Wants字段表示该服务和某服务存在某种弱依赖关系,即某服务停止运行或退出不影响该服务继续运行。
Requires字段 表示强依赖关系,即某服务停止运行或退出,该服务也必须停止运行。
Wants字段与Requires字段 只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。
Server字段 主要给出服务的启动行为,如何启动、重启、停止
Type字段 定义启动类型。它可以设置的值如下:
-
- simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他 服务,不要使用此类型启动
-
- forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
-
- oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
-
- dbus:类似于simple,但会等待 D-Bus 信号后启动
-
- notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
-
- idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。
PIDFile字段: pid文件路径
ExecStart字段: 定义启动进程时执行的命令,就是手动启动时执行的命令。
ExecReload字段: 重启服务时执行的命令。
ExecStop字段: 停止服务时执行的命令。
ExecStartPre字段: 启动服务之前执行的命令。
ExecStartPost字段: 启动服务之后执行的命令。
ExecStopPost字段: 停止服务之后执行的命令。
KillMode字段: 定义 Systemd 如何停止服务。它可以设置的值如下:
-
- control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
-
- process:只杀主进程
-
- mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
-
- none:没有进程会被杀掉,只是执行服务的 stop 命令
Restart字段:定义了Systemd 的重启方式。它可以设置的值如下:对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal。
-
- no(默认值):退出后不会重启
-
- on-success:只有正常退出时(退出状态码为0),才会重启
-
- on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
-
- on-abnormal:只有被信号终止和超时,才会重启
-
- on-abort:只有在收到没有捕捉到的信号终止时,才会重启
-
- on-watchdog:超时退出,才会重启
-
- always:不管是什么退出原因,总是重启
RestartSec字段:表示 Systemd 重启服务之前,需要等待的秒数。
user字段 可以设置服务的用户名
WorkingDirectory字段 指定服务的安装目录
Install字段: 该字段 定义如何安装这个配置文件,即怎样做到开机自启
WantedBy字段 表示该服务所在的 Target。
- Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是服务所在的Target是multi-user.target,Systemd 有默认的启动 Target。就是multi-user.target,在这个组里的所有服务,都将开机启动。
4、Apache 3种运行模式
Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式
- Prefork:进程模式
- worker:线程模式
- Event : 事件模式(2.4版本后开始稳定)
a. prefork 运行模式
Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求, 这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。
优点:因为每个进程使用独立的内存空间,所以比较安全。一个进程坏了,不会影响其他进程。
缺点:占用的内存比较大。
b. Worker MPM 运行模式
worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。
**优点:**可以处理海量请求,而系统资源的开销小。原因:一个进程中包括多个线程。多个线程之间可以共享内存,所以占用的内存资源比较少。
**缺点:**不太安全。如果一个线程坏了。整个进程都要坏了。另外存在keep-alive长连接占用资源时间过长。
c. Event MPM
event模式是在2.4版本中才稳定发布的模式。这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。
当某个连接没有请求时,会主动关闭连接,在work模式下,必须等keep-alive超时,才可以释放。
d. 修改 Apache 工作模式
# 查看Apache 工作模式
httpd -V
由于在预编译的时候添加了--enable-mpms-shared=all参数,可以直接修改工作模式,如果没有添加,需要重新指定参数编译安装。
vim /usr/local/apache/conf/httpd.conf
# 重启服务
systemctl restart httpd
# 查看工作模式
httpd -V
e. 查看web站点访问情况
Httpd服务器使用了两种类型的日志:访问日志和错误。这两种日志的文件名分别为access_log和error_log,均位于/usr/local/apache/logs目录下。
# 查看web访问日志
tail /usr/local/apache/logs/access_log
# 查看web错误日志
tail /usr/local/apache/logs/error_log
5、httpd.conf 配置文件
vim /usr/local/apache/conf/httpd.conf
全局配置:
ServerRoot "/usr/local/apache" # httpd服务器安装目录
Listen 80 # 设置httpd服务器监听的地址和网络端口号
User daemon # 设置运行httpd进程的用户账号
Group daemon # 设置运行httpd进程的组账号
ServerAdmin you@example.com # 设置httpd服务器的管理员e-mail地址
ServerName www.test.com:80 # 设置web站点的完整域名
DocumentRoot "/usr/local/apache/htdocs" # 设置网站根目录
DirectoryIndex index.html index.php # 设置网站的默认首页
ErrorLog logs/error_log # 设置错误日志文件的路径
LogLevel warn # 设置记录错误日志的级别
CustomLog logs/access_log common # 设置访问日志文件的路径
PidFile logs/httpd.pid # 设置用于保存httpd进程号的文件
AddDefaultCharset UTF-8 # 设置站点中的网页默认使用的字符集编码
Include conf/extra/httpd-default.conf # 加载另一个配置文件的内容
区域配置项:
<Directory /> # 定义"/"目录区域的开始
AllowOverride None # 不允许隐含控制文件覆盖配置
Require all denied # 禁止任何人访问此区域
</Directory> # 定义"/"目录区域的结束
6、httpd 服务的访问控制
a. 客户机地址限制
通过require配置项,可以根据主机的主机名或ip地址来决定是否允许客户端访问,在httpd服务器的主配置文件的<Location>、<Directory>、<Files>、<Limit>配置段中均可以使用Require配置项来控制客户端的访问,地址的形式可以是ip地址、网络地址、主机名或域名,使用名称"all"时表示任意地址。
Require all granted: 表示允许所有主机访问
Require all denied: 表示拒绝所有主机访问
Require local: 表示仅允许本地主机访问
Require [not] host <主机名或域名列表>: 表示允许或拒绝指定主机或域访问
Require [not] ip<ip地址或网段列表>: 表示允许或拒绝指定ip地址或网段访问
通常情况下,网站服务器是对所有客户机开放的,网页文档目录并未做任何限制,因此使用的是"Require all granted"策略,表示允许从任何客户机访问。
<Directory "/usr/local/apache/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
b. 用户授权限制
基于用户的访问控制包括认证(authentication)和授权(authorization)两个过程,是apache允许指定用户使用用户名和密码访问特定资源的一种方式。认证是指识别用户身份的过程,授权是指允许特定用户访问特定目录区域的过程。
Httpd服务器支持使用摘要认证(digest)和基本认证(basic)两种方式,使用摘要认证需要在编译httpd之前添加--enable-auth-digest选项,但并不是所有的浏览器都支持摘要认证;而基本认证是httpd服务的基本功能,不需要预先配置特别的选项。
① 创建用户认证数据文件
htpasswd -c /usr/local/apache/conf/.apachepasswd admin
htpasswd /usr/local/apache/conf/.apachepasswd user1
-
-c选项表示新建立此文件,如果密码文件已经存在,则省略-c,否则会覆盖
cat /usr/local/apache/conf/.apachepasswd
② 添加用户授权配置
vim /usr/local/apache/conf/httpd.conf
# 添加用户授权配置
<Directory "/usr/local/apache/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
AuthName "welcome"
AuthType Basic
AuthUserFile /usr/local/apache/conf/.apachepasswd
Require valid-user
#Require all granted
</Directory>
- AuthName: 定义受保护的领域名称,该内容将在浏览器弹出的认证对话框中显示
- AuthType: 设置认证的类型,Basic表示基本认证
- AuthUserFile:设置用于保存用户账号、密码的认证文件路径
- Require valid-user:要求只有认证文件中的合法用户才能访问,其中valid-user表示所有合法用户,若只授权给单个用户,可改为指定的用户名。
③ 启动服务
systemctl restart httpd
④ 测试访问
7、配置Apache虚拟主机
虚拟web主机指的是在同一台服务器中运行多个web站点,httpd支持的虚拟主机类型包括三种:
- 不同ip相同端口
- 相同ip不同端口
- 不同域名相同端口
a. 开启虚拟主机功能
三种都需要把虚拟主机功能打开
# 编辑Apache配置文件
vim /usr/local/apache/conf/httpd.conf
# 去掉文件中的这行注释,如果没有此行,手写此行
Include conf/extra/httpd-vhosts.conf
b. 配置不同ip相同端口虚拟主机
① 给服务增加IP
ifconfig ens33:1 192.168.137.20
ifconfig ens33:1
② 创建站点目录
mkdir -p /var/www/html/{web,bbs}
tree /var/www
③ 创建站点网页
echo "Welcome to web page!!!" > /var/www/html/web/index.html
echo "Welcome to bbs page!!!" > /var/www/html/bbs/index.html
④ 定义虚拟主机文件
# 创建日志文件目录
mkdir -p /usr/local/apache/logs/www/{web,bbs}
# 编辑虚拟主机配置文件
vim /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost 192.168.137.5:80>
ServerAdmin root@hualu.com
DocumentRoot "/var/www/html/web"
ServerName www.hualuweb.com
ErrorLog "logs/www/web/hualuweb.com-error_log"
CustomLog "logs/www/web/hualuweb.com-access_log" common
<Directory "/var/www/html/web">
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.137.20:80>
ServerAdmin root@hualu.com
DocumentRoot "/var/www/html/bbs"
ServerName www.hualubbs.com
ErrorLog "logs/www/bbs/hualubbs.com-error_log"
CustomLog "logs/www/bbs/hualubbs.com-access_log" common
<Directory "/var/www/html/bbs">
Require all granted
</Directory>
</VirtualHost>
# 添加服务名称
vim /usr/local/apache/conf/httpd.conf
# 添加服务网站
ServerName www.hualuweb.com:80
ServerName www.hualubbs.com:80
# 检查虚拟主机配置文件语法
httpd -t
⑤ 重启服务并测试
systemctl restart httpd
# 查看web访问日志
cat /usr/local/apache/logs/www/web/hualuweb.com-access_log
c. 配置相同ip不同端口虚拟主机
① 修改 httpd.conf
# 添加监听端口
vim /usr/local/apache/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 80
Listen 8081
② 编辑虚拟主机配置文件
vim /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost 192.168.137.5:80>
ServerAdmin root@hualu.com
DocumentRoot "/var/www/html/web"
ServerName www.hualuweb.com
ErrorLog "logs/www/web/hualuweb.com-error_log"
CustomLog "logs/www/web/hualuweb.com-access_log" common
<Directory "/var/www/html/web">
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.137.5:8081>
ServerAdmin root@hualu.com
DocumentRoot "/var/www/html/bbs"
ServerName www.hualubbs.com
ErrorLog "logs/www/bbs/hualubbs.com-error_log"
CustomLog "logs/www/bbs/hualubbs.com-access_log" common
<Directory "/var/www/html/bbs">
Require all granted
</Directory>
</VirtualHost>
③ 测试虚拟主机配置文件语法
httpd -t
④ 重启服务并测试
systemctl restart httpd
d. 不同域名相同端口虚拟主机
① 编辑虚拟主机配置文件
vim /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost www.hualuweb.com:80>
ServerAdmin root@hualu.com
DocumentRoot "/var/www/html/web"
ServerName www.hualuweb.com
ErrorLog "logs/www/web/hualuweb.com-error_log"
CustomLog "logs/www/web/hualuweb.com-access_log" common
<Directory "/var/www/html/web">
Require all granted
</Directory>
</VirtualHost>
<VirtualHost www.hualubbs.com:80>
ServerAdmin root@hualu.com
DocumentRoot "/var/www/html/bbs"
ServerName www.hualubbs.com
ErrorLog "logs/www/bbs/hualubbs.com-error_log"
CustomLog "logs/www/bbs/hualubbs.com-access_log" common
<Directory "/var/www/html/bbs">
Require all granted
</Directory>
</VirtualHost>
② 配置hosts映射文件
vim /etc/hosts
192.168.137.5 www.hualuweb.com
192.168.137.5 www.hualubbs.com
③ 检测虚拟主机文件语法
httpd -t
④ 重启服务
systemctl restart httpd
⑤ 修改Windows映射文件
C:\Windows\System32\drivers\etc\hosts
192.168.137.5 www.hualuweb.com
192.168.137.5 www.hualubbs.com