5.5 Linux Apache服务

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
相关推荐
李小白202002021 分钟前
Linux 生成/proc/config.gz
linux·服务器·前端
我们的五年9 分钟前
【Linux课程学习】:《简易版shell实现和原理》 《哪些命令可以让子进程执行,哪些命令让shell执行(内键命令)?为什么?》
linux·运维·服务器·学习
阿俊仔(摸鱼版)19 分钟前
GPT分区、格式化与自动挂载
linux·服务器·云计算
康熙38bdc32 分钟前
Linux 线程互斥
linux·运维·开发语言
Wthzdq37 分钟前
正则表达式(二)
linux·运维·服务器
逆风水手1 小时前
Python3交叉编译arm-linux放入设备中运行方式
linux·运维·arm开发
学习编程之路1 小时前
【Linux】软件包管理与vim工具使用详解
linux·运维·服务器·科技
是老余1 小时前
Linux的介绍及虚拟机centOS系统的下载与应用
linux·运维·centos
怡雪~1 小时前
K8s的API资源对象NetworkPolicy
linux·容器·kubernetes
小安运维日记1 小时前
CKA认证 | Day4 K8s管理应用生命周期(下)
linux·运维·云原生·容器·kubernetes·云计算