apache的工作原理
Apache是目前世界上使用最为广泛的一种Web Server,它以跨平台、高效和稳定而闻名
一、LAMP架构
说起apache,那就不得不了解一下LAMP架构,LAMP架构是较为流行的一套建站架构,因其通用、跨平台、高性能、低价格的优势,无论是性能、质量还是价格都是企业搭建网站的首选平台。
Linux 操作系统底层
Apache 服务器,属于次级服务器,沟通Linux和php
PHP 服务端脚本语言,使用php_module模块与Apache服务器关联,
Mysql 和 Web Aplication (其他web服务),使用php_extensions 模块相关联
二、Apache 生命周期
启动阶段:Apache解析配置文件(如http.conf以及Include指令设定的配置文件等),模块加载(例如mod_php.so,mod_perl.so等)和系统资源初始化(例如日志文件、共享内存段等)工作。在这个阶段,Apache为了获得系统资源最大的使用权限,将以特权用户root(X系统)或超级管理员administrator(Windows系统)完成启动。
运行阶段:在这个阶段,Apache为了获得系统资源最大的使用权限,将以特权用户root(X系统)或超级管理员administrator(Windows系统)完成启动。分11个阶段处理用户的请求。
三、Apache 处理请求的过程
1、Post-Read-Request阶段: 在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。
2、URI Translation阶段 : Apache在本阶段的主要工作:将请求的URL映射到本地文件系统。模块可以在这阶段插入钩子,执行自己的映射逻辑。mod_alias就是利用这个阶段工作的。
3、Header Parsing阶段 : Apache在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。mod_setenvif就是利用这个阶段工作的。
4、Access Control阶段 : Apache在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。mod_authz_host就是利用这个阶段工作的。
5、Authentication阶段 : Apache在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。
6、Authorization阶段 : Apache在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。
7、MIME Type Checking阶段 : Apache在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块mod_negotiation和mod_mime实现了这个钩子。
8、FixUp阶段 : 这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和Post_Read_Request类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。
9、Response阶段 : Apache在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。
10、Logging阶段 : Apache在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换Apache的标准日志记录。
11、CleanUp阶段 : Apache在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等等,这是Apache一次请求处理的最后一个阶段。
四、Apache 的两种工作模式
1.什么是MPM
MPM(Multi-Processing Modules,多路处理模块)是Apache的核心组件之一,Apache通过MPM来使用操作系统的资源,对进程和线程池进行管理。Apache为了能够获得更好的运行性能,针对不同的平台 (Unix/Linux、Window)提供了不同的MPM,用户可以根据实际情况进行选择,其中最常使用的MPM有 prefork和worker两种。
2.Prefork
工作原理:Prefork是非线程、预生成进程型MPM,会预先启动一些子进程,每个子进程一个时间只能处理一个请求,并且会根据并发请求数量动态生成更多子进程
配置参数:
StartServices 服务器启动默认启动的子进程;
MinSpareServers 最小空闲进程数量;
MaxSpareServers 最大空闲进程数量;
MaxClients 最高的并发量;
ServerLimit 最大限制的并发量;
MaxRequestsPerChild 每个子进程默认最多处理多少个请求。当达到设定值时,这个进程就会被kill掉,重新生成一个新的进程(避免内存泄露等安全性问题,运行太久怕出一些bug,可能出现假死,或者占用太多内存等);
3.worker
Workder是线程化、多进程的MPM,每个进程可以生成多个线程,每个线程处理一个请求;不需要启用太多的子进程,每个进程能够拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程能够建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
配置参数:
StartServers 服务器启动时建立的子进程数,默认值是"3"。
MaxClients 允许同时服务的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列,默认值是"400"。
MinSpareThreads 最小空闲线程数,默认值是"75"。
MaxSpareThreads 设置最大空闲线程数。默认值是"250"。
ThreadsPerChild 每个子进程建立的常驻的执行线程数。默认值是25
MaxRequestsPerChild 设置每个子进程在其生存期内允许处理的最大请求数量。
4.Prefork和Worker的比较
prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。
prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。
在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。
apache的安装部署
yum install httpd -y ##安装apache软件
yum install httpd-manual -y ##安装apache手册
systemctl start httpd ##开启httpd服务
systemctl enable httpd ##设置服务开机自启动
13 firewall-cmd --list-all ##列出火墙信息
14 firewall-cmd --permanent --add-service=http ##永久允许http
15 firewall-cmd --reload ##火墙重新加载策略
对火墙进行设置,使httpd服务正常工作。
apache的基础信息
默认发布文件:/var/www/html/index.html
主配置目录:/etc/httpd/conf
主配置文件:/etc/httpd/conf/httpd.conf
子配置目录:/etc/httpd/cof.d/
子配置文件:/etc/httpd/conf.d/*.conf
默认发布目录:/var/www/html
默认发布文件:/index.html
默认端口:80
默认安全上下文:httpd_sys_content_t
程序开启默认用户:apache
apache日志:/etc/httpd/logs/*
vim /var/www/html/index.html
在浏览器输入主机ip:
发布一个简单的网页信息。
修改默认端口
httpd服务的默认端口是80端口,可以对这个端口进行修改。
vim /etc/httpd/conf/httpd.conf
修改默认端口为8080
端口之后访问时要输入端口,才可以正常访问。
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
如果火墙没有关闭还需要做这些设定
修改默认发布文件
vim /etc/httpd/conf/httpd.conf
默认发布文件就是访问apache时没有指定文件名称时默认访问的文件,这个文件可以是多个,有访问顺序。
systemctl restart httpd
vim /var/www/html/test.html
默认文件被修改为先访问test.html,当test.html不存在是才能访问到index.html。
修改默认发布目录
mkdir /www/html -p ##创建目录
vim /etc/httpd/conf/httpd.conf
httpd的默认发布目录是/var/www/html/,这里可以修改它的默认发布目录.
修改之后还要对所目录进行授权,以及修改selinux的属性这个目录才能正常发布文件。
semanage fcontext -a -t httpd_sys_content_t '/www(/.*)?'
restorecon -RvvF /www/
systemctl restart httpd
重启服务就可以在/www/html这个目录上发布文件了。
apache的虚拟主机
在建立虚拟主机时,要首先在使用浏览器的主机上设置本地解析。
vim /etc/hosts
在里面写入要解析的域名和主机的对应关系。
创建目录,在主机中编写测试文件。
mkdir /var/www/virt/redhat.com/music -p
vim /var/www/virt/redhat.com/music/index.html
在里面写如内容方便测试。
设置默认接口
vim /etc/httpd/conf.d/adefault.conf
设定子接口
vim /etc/httpd/conf.d/music.conf
systemctl restart httpd ##重启服务
在网页输入域名进行测试,通过这样的方式,设置多台主机,就可以完成多个不同网页的上线。
apache内部的访问控制
1.针对主机的访问控制
vim /etc/httpd/conf.d/adefault.conf
设置允许172.25.62.250这台主机访问,禁止其他主机访问。
可以看到250访问成功,而其他主机会访问到测试页面,看不到网页的内容,用这种方式可以主机的访问进行管理。
2.用户方式的访问控制
mkdir /var/www/html/admin
建立测试目录
vim /var/www/html/admin/index.html
编写测试页
htpasswd -cm /etc/httpd/userpass admin
建立用户admin。
htpasswd -m /etc/httpd/htuser admin1
建立用户admin1。
vim /etc/httpd/conf.d/adefault.conf
指定admin用户可以登录访问这个测试页
systemctl restart httpd
使用用户admin1登录访问。
访问失败。
使用admin用户登录访问。
访问成功!
这样就可以实现对用户的访问进行控制。
apache支持的语言
apache支持的语言有html,php,cgi和wsgi。其中html为默认设置,不需要作任何设定,下面我们来看看对于其他三种语言的支持。
1.对php的支持
yum install php -y
首先需要安装php。
vim /var/www/html/index.php
编写测试页。
172.25.254.131/index.php
在浏览器进行测试。
2.对cgi的支持
mkdir -p /var/www/html/cgi
创建测试目录
semanage fcontext -a -t httpd_sys_script_exec_t '/var/www/html/cgi(/.*)?'
restorecon -RvvF /var/www/html/cgi/
修改目录的selinux属性。
vim /var/www/html/cgi/index.cgi
编写测试内容。
chmod +x /var/www/html/cgi/index.cgi
/var/www/html/cgi/index.cgi
之后我们给这个脚本一个执行权限,看看能不能正常执行。
脚本正常执行了。
vim /etc/httpd/conf.d/adefault.conf
再编写子配置文件。
systemctl restart htppd
在浏览器设置,脚本运行成功,需要注意的是,必须给这个文件执行权限,否则测试会不成功。
3.对wsgi的支持
yum install mod_wsgi -y
同样需要下载mod_wsgi这个软件。
vim /var/www/html/cgi/script.wsgi
编写测试脚本。
chmod +x script.wsgi
/var/www/html/cgi/script.wsgi
给这个脚本执行权限,看看能否正常执行。
没有出现报错,说明正常执行了。
vim /etc/httpd/conf.d/adefault.conf
同样,去编写这个配置文件
systemctl restart httpd
重启服务之后测试。
脚本执行成功,说明可以正常使用了。
超文本传输安全协议(https)
HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,用于安全的HTTP数据传输。
使用这个传输协议需要先下载一些软件。
yum install mod_ssl -y
yum install crypto-utils -y
genkey www.westos.com
设置安全认证
选择Next
这里选择1024就够了。
在这个页面等待加载。
在这个页面时在shell里面敲键盘或移动鼠标可以加快进度。
选择No
这里直接下一步
在这填写认证信息。
vim /etc/httpd/conf.d/ssl.conf
修改配置文件,确定认证锁和钥匙的路径,这个路径在做安全认证的时候就出现了。
https://172.25.254.131
之后可以在浏览器进行测试,在ip前面加上https://。
查看认证信息
设定https虚拟主机并设定网页重写
我们知道很多网页直接输入网址之后的协议就是https而不是http,也就是不用手动去填写https就直接访问,这就需要进行网页重写。
cd /etc/httpd/conf.d/
vim z_login.conf
修改配置文件。
^(/.*)$ ##客户在浏览器地址栏中输入的所有字符
https:// ##强制客户加密访问
%{HTTP_HOST} ##客户请求主机
$1 ###“$1”标志^(/.*)$的值
[redirect=301] ##永久重写 ,302是临时
这里是配置文件中的相关信息。
mkdir -p /var/www/virtual/westos.com/z_login
cd /var/www/virtual/westos.com/z_login
vim index.html
创建目录并编写测试页。
systemctl restart httpd
重启服务后进行测试,在浏览器输入login.westos.com。
可以发现前面会自动补齐https,测试成功,这样就完成了网页重写,需要注意的时,这里的域名login.westos.com是自定义的,所以必须在/etc/hosts下设置本地解析才可以正常访问。
Apache的正向代理
使用正向代理可以使一台不能上网的客户机去正常浏览网页,使用这个功能我们要准备一个服务机,这台主机需要能正常上网,之后需要对这台主机进行一些设定。
在能上网的服务机:
yum install squid -y ##安装squid
rpm -qc squid ##查看主配置文件位置
vim /etc/squid/squid.conf
修改56行和62行内容,允许其他主机使用这个功能。
这样,对于服务机的设定就完成了。
在不能上网的客户机客户机:
点击Edit,Preferences
选择Network点击Settings。
选择第四个,输入服务机的ip和服务的端口3128,使用代理。
这样就可以使我们的客户机在不能上网的情况下访问网页了,这就和我们翻墙去访问外国网站是一样的,虽然我们不能直接访问外国网站,但可以通过一台可以访问外国网站的服务器来浏览外国网站。
反向代理
正向代理是在客户主机设定,在通过服务机去访问网站,而方向代理则和正向代理相反,客户主机不需要进行任何设定,只需要在服务主机做相应的设定,客户主机就可以通过服务主机访问网站,这台服务主机就是代理主机。
在代理主机:
yum install squid -y
vim /usr/share/doc/squid-3.3.8/squid.conf.documented
vim /etc/squid/squid.conf
http_access allow all
http_port 80 vhost vport
cache_peer 172.25.254.131 parent 80 0 proxy-only
systemctl stop httpd
systemctl restart squid
用客户机直接访问代理主机,代理主机会向目标主机获取数据,再把数据缓存,这些数据就可以被客户主机访问,这里访问172.25.254.231,实际上访问到的是172.25.254.131上的数据。
cdn集群
vim /etc/squid/squid.conf
修改配置文件,浏览器在访问www.westos.com时会将172.25.254.131和172.25.254.100这两台主机轮循访问
在后面加上weight参数可以设置访问的权重,如:
cache_peer 172.25.254.131 parent 80 0 proxy-only name=web1 originserver round-robin weight=2
cache_peer 172.25.254.100 parent 80 0 proxy-only name=web2 originserver round-robin
cache_peer_domain web1 web2 www.westos.com
systemctl restart squid
设置之后重启服务,连续访问www.westos.com时会访问172.25.254.131两次,再访问172.25.254.100一次,以此轮循。
如何搭建一个论坛
在linux中如何搭建一个论坛呢?
首先我们要下载软件包这里我下载的是 Discuz_X3.2_SC_UTF8.zip这个包。
cp Discuz_X3.2_SC_UTF8.zip /var/www/html/
之后将这个包放到 /var/www/html/目录中
unzip Discuz_X3.2_SC_UTF8.zip
解包
chmod 777 -R config/
chmod 777 -R data/
chmod 777 uc_* -R
修改目录权限
semanage fcontext -l | grep httpd
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/upload(/.*)?'
restorecon -FvvR /var/www/html/upload/
设置selinux属性
yum install mariadb php-mysql php -y
systemctl start mariadb
systemctl restart httpd
安装mariadb php-mysql php软件并启动服务,论坛的搭建需要这些软件和服务的支持。
之后就可以进行安装了在浏览器中输入172.25.254.131/upload进行安装。
完成后就可以登录了。