http服务简介
Apache HTTP Server(简称Apache或httpd)是Apache软件基金会的一个开放源代码的网页服务器软件,旨在为unix,windows等操作系统中提供开源httpd服务。由于其安全性、高效性及可扩展性,被广泛使用,自1996年4月以来,Apache一直是Internet上最流行的web服务。它快速、可靠并且可通过简单的API扩充,将Perl、Python等解释器等编译到httpd的相关模块中。
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 | 拒绝指定来源主机名的主机访问 |
注意: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后面不需要添加端口
ip后面需要加上8080端口
相同端口不同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
访问192.168.91.137
配置相同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文件拖到桌面用记事本打开添加域名解析之后再移回去
检测是否配置完成