# httpd服务


http服务简介

Apache HTTP Server(简称Apache或httpd)是Apache软件基金会的一个开放源代码的网页服务器软件,旨在为unix,windows等操作系统中提供开源httpd服务。由于其安全性、高效性及可扩展性,被广泛使用,自1996年4月以来,Apache一直是Internet上最流行的web服务。它快速、可靠并且可通过简单的API扩充,将Perl、Python等解释器等编译到httpd的相关模块中。

download

httpd版本

  • CentOS6系列的版本默认提供的是httpd-2.2版本的rpm包
  • CentOS7系列的版本默认提供的是httpd-2.4版本的rpm包

httpd2.2版本

特性
事先创建进程
按需维持适当的进程
模块化设计,核心比较小,各种功能通过模块添加(包括PHP),支持运行时配置,支持单独编译模块
支持多种方式的虚拟主机配置,如基于ip的虚拟主机,基于端口的虚拟主机,基于域名的虚拟主机等
支持https协议(通过mod_ssl模块实现)
支持用户认证
支持基于IP或域名的ACL访问控制机制
支持每目录的访问控制(用户访问默认主页时不需要提供用户名和密码,但是用户访问某特定目录时需要提供用户名和密码)
支持URL重写
支持MPM(Multi Path Modules,多处理模块)。用于定义httpd的工作模型(单进程、单进程多线程、多进程、多进程单线程、多进程多线程)

httpd2.4版本

特性
httpd-2.4的新特性:
MPM支持运行DSO机制(Dynamic Share Object,模块的动态装/卸载机制),以模块形式按需加载
支持event MPM,eventMPM模块生产环境可用
支持异步读写
支持每个模块及每个目录分别使用各自的日志级别
每个请求相关的专业配置,使用来配置
增强版的表达式分析器
支持毫秒级的keepalive timeout
基于FQDN的虚拟主机不再需要NameVirtualHost指令
支持用户自定义变量
支持新的指令(AllowOverrideList)
降低对内存的消耗

httpd服务特点

名称 特点
高度模块化 core + modules,核心加模块,想要什么功能添加什么模块;
DOS Dynamic Shared Object,动态共享库;
MPM Multipath processing Modules 多路处理模块.

MPM的工作原理

prefork

  • 多进程模型,每个进程响应一个请求、一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理,每个子进程处理一个请求;即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个子进程。

worker

  • 多进程多线程模型,每线程处理一个用户请求、一个主进程:负责生成子进程、负责创建套接字、负责接收请求、并将其派发给某子进程进行处理,每个子进程负责生成多个线程,每个线程负责响应用户请求;并发响应数量为:子进程数量*子进程创建的最大线程数量。

event

  • 事件驱动模型,多进程模型,每个进程响应多个请求、一个主进程 :负责生成子进程、负责创建套接字、负责接收请求,并将其派发给某个子进程进行处理,子进程基于事件驱动机制直接响应多个请求。

httpd配置文件

httpd目前有多个版本,主流有两个版本分别为:2.2、2.4;在安装了httpd软件之后,会生成配置文件。
这些文件有:

  • 主配置文件:/etc/httpd/conf/httpd.conf ,这个是httpd最主要的配置文件
  • 扩展配置文件:/etc/httpd/confd/*.conf ,这个是htpd的辅助配置文件
  • 站点文档目录:/var/www/html/
  • 模块的目录:/etc/httpd/modules/
  • 日志目录:/var/log/httpd/*
  • 访问日志为:,/access_log
  • 错误日志为:/error_log

httpd命令

//语法:httpd [options]
//常用的options:
   -l      //查看静态编译的模块,列出核心中编译了哪些模块。 \
           //它不会列出使用LoadModule指令动态加载的模块
   -M      //输出一个已经启用的模块列表,包括静态编译在服务 \
           //器中的模块和作为DSO动态加载的模块
   -v      //显示httpd的版本,然后退出
   -V      //显示httpd和apr/apr-util的版本和编译参数,然后退出
   -X      //以调试模式运行httpd。仅启动一个工作进程,并且 \
           //服务器不与控制台脱离
   -t      //检查配置文件是否有语法错误

源码安装httpd

httpd脚本安装点击直接下载 sh +x httpd.sh 执行脚本

httpd依赖于 apr、apr-util

安装工具包组

[root@localhost apr-1.7.0]# yum -y groupinstall "Development Tools" 

安装apr apr-util pcre

[root@localhost ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.bz2

[root@localhost ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.bz2

[root@localhost ~]#https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.bz2

解压下载的源码包

[root@localhost ~]#tar -jxf apr-1.7.0.tar.bz2 -C /usr/local/src/
[root@localhost ~]#tar -jxf apr-util-1.6.1.tar.bz2 -C /usr/local/src/
[root@localhost ~]#tar -jxf pcre-8.45.tar.bz2 -C /usr/local/src/

安装apr

1.进入解压后的apr ,进行编译安装

[root@localhost ~]# cd /usr/local/src/apr-1.7.0/
[root@localhost apr-1.7.0]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.7.0]# make && make install

安装apr-util

1.进入解压后的apr-util ,进行编译安装

[root@localhost ~]# cd /usr/local/src/
[root@localhost apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr
[root@localhost apr-util-1.6.1]#make && make install

安装httpd

下载httpd 源码包

wget https://downloads.apache.org/httpd/httpd-2.4.54.tar.bz2

解压httpd,到/usr/local/src/

[root@localhost ~]# tar -jxf httpd-2.4.54.tar.bz2 -C /usr/local/src/

进入/usr/local/src/httpd-2.4.54

[root@localhost httpd-2.4.54]#./configure --prefix=/usr/local/apache \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--enable-so \
--enable-mods-shared=most  \
--enable-ssl  \
--enable-cgi  \
--enable-rewrite  \
--with-zlib   \
--with-pcre     \
--enable-modules=most    \
--enable-mpms-shared=all  \

[root@localhost httpd-2.4.54]#make && make install

设置环境变量、头文件、添加lib、man文档

[root@localhost ~]# echo ‘export PATH=/usr/local/apache/bin:$PATH’ > /etc/profile.d/httpd.sh
[root@localhost ~]# source /etc/profile.d/httpd.sh
[root@localhost ~]# ln -s /usr/local/apache/include/ /usr/include/httpd
[root@localhost ~]# sed -i ‘22a MANDATORY_MANPATH /usr/local/apache/man’ /etc/man_db.conf

设置源码安装apache能使用systemctl 开启、关闭、重启、开机自启

[root@localhost ~]# cd /usr/lib/systemd/system
[root@localhost system]# cp sshd.service httpd.service复制sshd.service,改名为httpd.service
[root@localhost system]#vim apache.service             进入httpd.service进行修改,保存退出
[root@localhost system]#cat httpd.service             显示修改后的文件内容
[Unit]
Description=httpd server daemon
After=network.target sshd-keygen.target

[Service]
Type=forking
ExecStart=/usr/local/apache/bin/apachectl
ExecStop=/usr/local/apache/bin/apachectl  stop
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

systemctl daemon-reload     设置刚修改的文件生效

 systemctl start httpd.service         开启apache服务
 systemctl status httpd.service      查看apache服务已开启


 systemctl stop httpd.service       关闭apache服务
 systemctl status httpd.service    查看apache服务已关闭
● apache.service - apache server daemon
   [root@localhost ~]# systemctl stop httpd.service 
[root@localhost ~]# systemctl status httpd.service 
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd.service(8)

 
systemctl enable httpd.service       设置开机自启
Created symlink /etc/systemd/system/multi-user.target.wants/apache.service → /usr/lib/systemd/system/httpd.service.
 systemctl status httpd.service       查看apache已设置开机自启
● apache.service - apache server daemon
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-07-21 16:49:06 CST; 21s ago
 Main PID: 51042 (httpd)
    Tasks: 82 (limit: 23457)
    
systemctl enable --now httpd.service       设置开机自启同时立马启动
Created symlink /etc/systemd/system/multi-user.target.wants/apache.service → /usr/lib/systemd/system/httpd.service.

关闭防火墙

[root@localhost ~]# systemctl stop firewalld.service

访问apache网站

安装总结

报错

安装apr时报的错

报错一:apr进行预编译接着又报错,缺少gcc

configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details

解决方式

安装开发工具包组

[root@localhost ~]# yum -y groupinstall "Development Tools"

报错二:

rm: cannot remove 'libtoolT': No such file or directory

解决方式

[root@localhost ~]# cd /usr/local/src/apr-1.7.0 
vi configure
找到RM='$RM'修改为RM='$RM -f'

安装apr-util报的错

报错一:1.进入解压后的apr-util 进行预编译

configure: error: APR could not be located. Please use the --with-apr option.

解决方式

使用如下格式说明apr路径

[root@localhost apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr

安装httpd报的错

报错一:1.进入解压的httpd,进行预编译 ,报错显示未找到APR util

checking for APR-util... no
configure: error: APR-util not found.  Please read the documentation.

解决方法

[root@localhost httpd-2.4.54]# ./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

报错二

configure: error: pcre(2)-config for libpcre not found. PCRE is required and available from http://pcre.org/

解决方式

下载pcre源码包解压,进行编译安装

wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.bz2

[root@localhost ~]#tar -jxf pcre-8.45 -C /usr/local/src/
[root@localhost ~]#cd /usr/local/src/pcre
[root@localhost pcre2-10.37]# ./configure --prefix=/usr/local/pcre
[root@localhost pcre2-10.37]#make && make install

报错三

configure: error: Did not find working script at pcre2-config

解决方法

yum install pcre-devel -y

httpd常用配置

访问控制法则

法则 功能
Require all granted 允许所有主机访问
Require all deny 拒绝所有主机访问
Require ip IPADDR 授权指定来源地址的主机访问
Require not ip IPADDR 拒绝指定来源地址的主机访问
Require host HOSTNAME 授权指定来源主机名的主机访问
Require not host HOSTNAME 拒绝指定来源主机名的主机访问

image
注意:httpd-2.4版本默认是拒绝所有主机访问的,所以安装以后必须做显示授权访问

示例:
所以这里设置的时允许所有主机访问,拒绝这个192.168.91.136这个虚拟机访问

[root@localhost ~]# cd /usr/local/apache/conf
[root@localhost conf]# vim httpd.conf

<Directory /usr/local/apache/htdocs >
    <RequireAll>
        Require not ip 192.168.91.136
        Require all granted
    </RequireAll>
</Directory>


[root@localhost conf]# httpd -t    检查配置文件是否设置是对的
Syntax OK                     表示配置权限设置成功
[root@localhost conf]# systemctl restart httpd.service   重启服务
[root@localhost conf]# curl http://192.168.91.136   136这个虚拟机访问就发现拒绝访问
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>


<Directory /usr/local/apache/htdocs >
    <RequireAll>
        Require  ip 192.168.91.0/24  允许192.168.91这个网段的主机都可以访问
    </RequireAll>
</Directory>

<Directory /usr/local/apache/htdocs >
    <RequireAll>
        Require not  host  www.1314520.link  拒绝这个域名访问
        Require all granted                允许所有主机访问
    </RequireAll>
</Directory>

配置虚拟主机(yum安装的httpd)

虚拟主机有三类:

  • 相同IP不同端口
  • 不同IP相同端口
  • 相同IP相同端口不同域名

虚拟主机的配置可以写在主配置文件;也可以将配置写在扩展配置文件,扩展配置文件需要自行创建。

相同IP不同端口

关闭防火墙
yum 下载httpd并开启httpd服务

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl restart httpd.service

1、先找到httpd-vhosts.conf这个虚拟主机模板文件,复制到/etc/httpd/conf.d/ 扩展配置文件

[root@localhost ~]# find / -name httpd-vhosts.conf
/usr/share/doc/httpd/httpd-vhosts.conf

2、下载坦克、和斗地主游戏源码

[root@localhost ~]# cd /var/www/html/     进入httpd 网站主页
[root@localhost ~]#wget www.1314520.link/upload/2022/07/坦克.zip

[root@localhost html]# wget   www.1314520.link/upload/2022/07/斗地主.zip

[root@localhost html]# ls
  ''$'\345\235\246\345\205\213''.zip'  ''$'\346\226\227\345\234\260\344\270\273''.zip'


解压这两个游戏源码,然后把这两个目录改成自己想要改成的名字
[root@localhost html]# unzip 坦克.zip  
[root@localhost html]# unzip  斗地主.zip
[root@localhost html]# ls 我这里改成了tanke 和 zhuawawa 
tanke  zhuawawa

3、配置相同ip 不同端口

[root@localhost ~]# cd /etc/httpd/conf.d/   
[root@localhost conf.d]# vim httpd-vhosts.conf
    DocumentRoot "/var/www/html/zhuawawa"        网站存放的目录
    ServerName www.tanke.com                  绑定的域名
    ErrorLog "/var/log/httpd/httpd-host.example.com-error_log"   错误日志存放位置
    CustomLog "/var/log/httpd/httpd-host.example.com-access_log" common  网站访问日志存放方法及位置,这里是组合日志方式
     <Directory "/var/www/html/zhuawawa">            指定网站目录访问控制,默认不允许访问
        <RequireAll>                              Require访问控制指令
            Require all granted                   允许所有主机访问
            Require not ip 192.168.91.137         拒绝192.168.91.137主机访问
        </RequireAll>
    </Directory>
</VirtualHost>

Listen 8080
<VirtualHost *:8080>
    DocumentRoot "/var/www/html/tanke"
    ServerName www.zhuawawa.com
    ErrorLog "/var/log/httpd/httpd-host2.example.com-error_log"
    CustomLog "/var/log/httpd/httpd-host2.example.com-access_log" common
</VirtualHost>

[root@localhost html]# httpd -t       检查配置文件是否有语法错误
Syntax OK                             表示配置文件没有语法错误
[root@localhost html]# systemctl restart httpd.service 重启服务
[root@localhost html]# systemctl stop firewalld.service 关闭防火墙

检测是否配置完成

去浏览器搜索虚拟机IP,因为httpd默认80端口所以ip后面不需要添加端口

image-1658568156638

ip后面需要加上8080端口

image-1658568178586

相同端口不同IP

[root@localhost conf.d]# ip addr add 192.168.91.137/24 dev eth0 添加临时IP
[root@localhost conf.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:46:af:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.136/24 brd 192.168.91.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.91.137/24 scope global secondary eth0
       valid_lft forever preferred_lft forever

[root@localhost ~]# vim /etc/httpd/conf.d/httpd-vhosts.conf 
<VirtualHost  192.168.91.136:80>      
    DocumentRoot "/var/www/html/zhuawawa"
    ServerName www.tanke.com
    ErrorLog "/var/log/httpd/httpd-host.example.com-error_log"
    CustomLog "/var/log/httpd/httpd-host.example.com-access_log" common
</VirtualHost>

<VirtualHost 192.168.91.137:80>      
    DocumentRoot "/var/www/html/tanke"
    ServerName www.zhuawawa.com
    ErrorLog "/var/log/httpd/httpd-host2.example.com-error_log"
    CustomLog "/var/log/httpd/httpd-host2.example.com-access_log" common
</VirtualHost>

[root@localhost ~]# httpd -t
Syntax OK
[root@localhost ~]# systemctl restart httpd.service

检测是否配置完成

访问192.168.91.136

image-1658568195724

访问192.168.91.137

image-1658568209424

配置相同IP相同端口不同域名

[root@localhost ~]# vim /etc/httpd/conf.d/httpd-vhosts.conf
<VirtualHost  *:80>
    DocumentRoot "/var/www/html/zhuawawa"
    ServerName www.zhua.com
    ErrorLog "/var/log/httpd/httpd-host.example.com-error_log"
    CustomLog "/var/log/httpd/httpd-host.example.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/var/www/html/tanke"
    ServerName www.tk.com
    ErrorLog "/var/log/httpd/httpd-host2.example.com-error_log"
    CustomLog "/var/log/httpd/httpd-host2.example.com-access_log" common
</VirtualHost>

[root@localhost ~]# httpd -t
Syntax OK
[root@localhost conf.d]# systemctl restart httpd.service 

注意客户端需要域名解析

在 C:\Windows\System32\drivers\etc 里面的 hosts文件拖到桌面用记事本打开添加域名解析之后再移回去

image-1658568231268

检测是否配置完成

浏览器访问www.zhua.com

image-1658568241113
访问www.tk.com

image-1658568252437