1. 关于apache
- 中文名 阿帕奇,是主流的企业后端web服务器
- 默认监听端口 80
- 服务名 httpd
2. 虚拟主机
2.1 什么是虚拟主机
虚拟空间,也称虚拟主机(Virtual Host Virtual Server)是使用特殊的软硬件技术,把一台计算机主机分成一台台"虚拟"的主机,每一台虚拟主机都具有独立的域名和IP地址(或共享的IP地址),具有完整的Internet服务器功能,是使用特别的软件和硬件技术,把一台真实的物理电脑主机分割成多个的逻辑存储单元,每个单元由于没有物理实体,但是每一个物理单元都能像真实的物理主机一样在网络上工作。单独的域名、IP地址(或共享的IP地址)、完整的Internet服务器功能。虚拟主机的关键技术在于,即使在同一台硬件、同一个操作系统上,运行着为多个用户打开的不同的服务器程式,互不干扰。
理解:
加入某企业用Apache作为web服务器,如果没有虚拟主机,想要两个域名的网站 www.test.com www.abc.com 则需要两个服务器 如果这两个网站 都不太占据资源 比如展示型网站 此时 用两个服务器 有点太浪费主机资源 我们可以将两个网站都做在同一个Apache服务器上 以节省资源 这种技术 称之为虚拟主机 一个Apache服务器可以具有多个网站及域名
2.2 虚拟主机的作用
-
虚拟主机用于学习和研究方面。很多人建设网站,用于学习某些方面的知识和记录积累。网站上面主要把自己遇到的问题和解决的方法进行记录,以备以后的使用和研究。同时也是与其他人进行知识的分享。这些都不需要很大的带宽,内存等,而且首要的一点是使用方便。还有就是自己做网站来进行测试,所以选择虚拟主机是个不错的选择。
-
虚拟主机用于个人博客类型的网站。这些类型网站主要用于个人的生活和爱好的方面来进行建设,也不需要选择很高的配置,主要是来展示个人的心得和生活。主要是用来自己看和对自己生活的分享。选择虚拟主机简单,方便,小巧,非常的实用。
-
用于中小型的企业展示和单页营销型的网站。对于很多的中小企业,他们的网站主要用来展示企业的基本情况,或者产品的特定时间的营销。并不涉及到网上的在线交易。所以选择虚拟主机来说也是非常的合适,便于管理和信息的发布。
2.3 Apache虚拟主机的实现
安装Apache服务
[root@localhost ~]# yum -y install httpd
2.3.1 基于域名的虚拟主机
修改配置
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
349 <VirtualHost 192.168.20.133>
350 DocumentRoot /var/www/html/test
351 ServerName www.test.com
352 </VirtualHost>
353 <VirtualHost 192.168.20.133>
354 DocumentRoot /var/www/html/abc
355 ServerName www.abc.com
356 </VirtualHost>
做虚拟主机 需要VirtualHost标签 192.168.20.133 是当前服务器ip
DocumentRoot 此域名的网页目录的绝对路径
ServerName 虚拟主机的域名
创建响应的目录和对应的网页文件
[root@localhost ~]# mkdir -p /var/www/html/{test,abc}
[root@localhost ~]# echo "test" > /var/www/html/test/index.html
[root@localhost ~]# echo "abc" > /var/www/html/abc/index.html
利用hosts文件做简单的域名解析
[root@localhost ~]# vim /etc/hosts #追加两行
192.168.20.133 www.test.com
192.168.20.133 www.abc.com
启动服务并验证
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# curl http://www.test.com
test
[root@localhost ~]# curl http://www.abc.com
abc
2.3.2 基于端口的虚拟主机
修改虚拟主机的端口
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
42 Listen 80 #默认监听80端口 不变
43 Listen 8888 #此行为新增加的
350 <VirtualHost 192.168.20.133:80> #为ip加上端口
354 <VirtualHost 192.168.20.133:8888> #为ip加上端口
新增的端口尽量大一些 避免与系统服务的端口相冲突
重启服务 验证
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl http://192.168.20.133:80
test
[root@localhost ~]# curl http://192.168.20.133:8888
abc
2.3.3 基于ip的虚拟主机
先增加一个ip
[root@localhost ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
[root@localhost ~]# ifconfig ens32:1 192.168.20.188/24
[root@localhost ~]# ifconfig | grep 188
inet 192.168.20.188 netmask 255.255.255.0 broadcast 192.168.20.255
修改配置
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
43 Listen 8888 #删除掉 不用了
349 <VirtualHost 192.168.20.188>
353 <VirtualHost 192.168.20.133>
重启 访问测试
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl http://192.168.20.133
abc
[root@localhost ~]# curl http://192.168.20.188
test
3. 用户个人主页及访问控制
编辑用户个人主页的设置
[root@localhost ~]# vim /etc/httpd/conf.d/userdir.conf
17 # UserDir disabled #此行注释掉 不注释表示禁用
24 UserDir public_html #此行取消注释
31 <Directory "/home/*/public_html">
32 AllowOverride all
33 AuthUserFile "/etc/httpd/.passwd"
34 AuthName "Plese login"
35 AuthType basic
36 Require valid-user
37 </Directory>
all 表示所有用户的家目录下的public_html目录的访问都需要验证
authuserfile 验证时候与这个文件核对密码
authname 访问需要验证的页面时 弹窗的提示信息
authtype 验证类型 basic 基本类型
require valid-user 需要经过验证才可以访问到内容
设置web服务器域名 及域名解析
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
95 ServerName www.example.com
[root@localhost ~]# vim /etc/hosts
192.168.20.133 www.example.com #添加解析记录
如果是在centos中访问 这些解析即可 如果实在Windows中访问
Windows的hosts文件 需要写入域名解析
创建用户个人首页
[root@localhost ~]# useradd tiezhu
[root@localhost ~]# su - tiezhu
[tiezhu@localhost ~]$ pwd
/home/tiezhu
[tiezhu@localhost ~]$ mkdir public_html
[tiezhu@localhost ~]$ echo "homepage for user tiezhu" > public_html/index.html
[tiezhu@localhost ~]$ exit
logout
调整selinux、给权限
[root@localhost ~]# setenforce 0
[root@localhost ~]# chmod 711 /home/tiezhu/
设置验证密码
[root@localhost ~]# htpasswd -c /etc/httpd/.passwd tiezhu
New password:
Re-type new password:
Adding password for user tiezhu
启动Apache并进行访问测试
[root@localhost ~]# netstat -anput | grep LISTEN | grep 80
Apache没有启动 我们这里启动Apache(如果已经启动 则重启)
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# netstat -anput | grep LISTEN | grep 80
tcp6 0 0 :::80 :::* LISTEN 11240/httpd
用浏览器访问 http://www.example.com/~tiezhu/index.html
4. Apache的源码安装和模式切换
4.1 Apache的源码安装
72 yum -y install gcc gcc-c++ expat-devel pcre-devel
73 tar -zxf apr-1.7.0.tar.gz
74 cd apr-1.7.0
75 ./configure --prefix=/usr/local/apr
76 make && make install
77 cd
78 tar -zxf apr-util-1.6.1.tar.gz
79 cd apr-util-1.6.1
80 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
81 make && make install
82 cd
83 tar -zxf httpd-2.4.39.tar.gz
84 cd httpd-2.4.39
85 ./configure --prefix=/usr/local/httpd --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most
86 make && make install
apr 主要是提供apr-utils和httpd必备的lib文件
apr-util 是一个通用的函数库, 他可以让httpd不用关心底层的操作系统平台 可以很方便的进行移植
源码安装参数释义:
--enable-so #可以让httpd支持动态扩展模块
--enable-mods-shared=most #指定有哪些动态扩展模块,most值的是绝大多数
4.2 apache的服务和服务控制
[root@localhost ~]# ls /usr/local/httpd/
bin build cgi-bin conf error htdocs icons include logs man manual modules
bin目录: 服务相关的脚本 比如负责启动、关闭apache的脚本
conf目录: 配置文件
logs: 日志文件
error: 存放错误信息
服务控制
启动
[root@localhost ~]# /usr/local/httpd/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
启动时 如果apache没有设置ServerName 会有警告 但依然可以启动
[root@localhost ~]# netstat -anput | grep LISTEN | grep 80
tcp6 0 0 :::80 :::* LISTEN 1423/httpd
关闭:
[root@localhost ~]# /usr/local/httpd/bin/apachectl stop
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
#关闭的时候 依然会提醒没有设置域名 不是报错
[root@localhost ~]# netstat -anput | grep LISTEN | grep 80
重启:
[root@localhost ~]# /usr/local/httpd/bin/apachectl stop
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
[root@localhost ~]# /usr/local/httpd/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
[root@localhost ~]# netstat -anput | grep LISTEN | grep 80
tcp6 0 0 :::80 :::* LISTEN 1611/httpd
重启 如果使用restart 不会报错 但是 没有效果
4.3 apache的工作模式和切换
4.3.1 工作模式和特点
Prefork
特点:
apache启动之初,就预先fork一些子进程,然后等待请求进来,这样做主要是为了减少频繁创建和销毁进程的开销。每个子进程包含一个线程,在一个时间点,该进程只可以处理一个请求。
处理一定数量的请求时 需要更多的系统资源 对请求的处理效率较低 如果是很多请求的情况下 会将请求放在队列中 一直等待前边的处理完毕
关于进程和线程 不动的可以看https://blog.csdn.net/weixin_43557605/article/details/101101551
Worker
特点:
与prefork相比,使用了多进程和多线程,也会先fork几个子进程,之后为每个子进程创建一些线程,这些线程里包含一个监听线程。每个请求过来,会被分配一个线程来服务。因为work模式比prefork具备更多的线程,而大多数线程都可以处理请求 所以 worker模式具有比prefork模式更高的并发处理量
如果使用keep-alive的长连接方式,某个线程会等到到超时才会被释放,如果过多的线程被这样占据,会导致在高并发场景下系统无服务线程可用
Event
特点:
event模式和worker模式很想,最大的区别在于,event模式下,有另外一个线程,这个线程可以监督、管理keep-alive长连接的线程,使其在处理完请求后 及时释放连接 这样 在高并发场景下 可以拥有更强的处理能力
三种工作模式中 最好的event模式 所以 apache模型优化 一般都是想把apache适应的模型 切换为event
4.3.2 apahe工作模式的查看和切换
查看
[root@localhost ~]# /usr/local/httpd/bin/httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
event.c --->从此处可以看出 当前的模式就是event模式
切换(通过编译安装进行模式切换)
./configure --prefix=/usr/local/httpd --with-apr.......... --with-mpm=worker
configure的时候 加上--with-mpm=