Httpd(apache)
工作模式(FPM)
prefork
多进程模型,一个进程相应一个请求,消耗内存
worker
多线程模型,多进程生成,一个进程生成多个线程
一个线程相应一个请求
event
事件驱动模型(异步),一个线程相应多个请求
Centos6:httpd2.2
安装方式
rpm安装
编译安装
安装httpd
# yum install httpd -y
启动httpd
service httpd start
开机启动httpd
chkconfig httpd on
重启httpd
service httpd restart
查看安装的httpd的软件包
# rpm -qa httpd
返回结果:
httpd-2.2.15-53.el6.centos.x86_64
查看安装的httpd的配置文件
# rpm -qc httpd
返回结果:
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/var/www/error/HTTP_BAD_GATEWAY.html.var
/var/www/error/HTTP_BAD_REQUEST.html.var
/var/www/error/HTTP_FORBIDDEN.html.var
/var/www/error/HTTP_GONE.html.var
/var/www/error/HTTP_INTERNAL_SERVER_ERROR.html.var
/var/www/error/HTTP_LENGTH_REQUIRED.html.var
/var/www/error/HTTP_METHOD_NOT_ALLOWED.html.var
/var/www/error/HTTP_NOT_FOUND.html.var
/var/www/error/HTTP_NOT_IMPLEMENTED.html.var
/var/www/error/HTTP_PRECONDITION_FAILED.html.var
/var/www/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
/var/www/error/HTTP_REQUEST_TIME_OUT.html.var
/var/www/error/HTTP_REQUEST_URI_TOO_LARGE.html.var
/var/www/error/HTTP_SERVICE_UNAVAILABLE.html.var
/var/www/error/HTTP_UNAUTHORIZED.html.var
/var/www/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
/var/www/error/HTTP_VARIANT_ALSO_VARIES.html.var
/var/www/error/contact.html.var
/var/www/error/include/bottom.html
/var/www/error/include/spacer.html
/var/www/error/include/top.html
解释:
/etc/httpd/conf/httpd.conf
httpd主配置文件
/etc/httpd/conf.d/
httpd的虚拟主机配置文件存放位置以.conf结尾
/var/www/error/
错误页面存放目录如404,302,500等错误页面
/etc/logrotate.d/httpd
启动脚本,启动文件
配置文件/etc/sysconfig/httpd
启动模型的配置文件
/usr/sbin/httpd
prefork启动文件(默认启动模式)
/usr/sbin/httpd.event
event模型的启动文件(2.2的event测试阶段的,不建议使用)
/usr/sbin/httpd.worker
worker模型的启动文件
日志文件目录
/var/log/httpd/
access_log
访问日志
error_log
web服务程序启动运行中的错误日志
站点文档目录
/var/www/html/
配置文件的组成
# grep "Section" /etc/httpd/conf/httpd.conf
返回结果:
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Host
解释:(第二段和第三段不建议同时使用)
Section 1: Global Environment
全局环境配置
Section 2: 'Main' server configuration
主服务器配置
Section 3: Virtual Host
虚拟主机配置
常用配置:
先备份httpd.conf主配置文件
cp /etc/httpd/conf/httpd.conf{,.bak}
修改httpd监听IP和(port)端口
vim /etc/httpd/conf/httpd.conf
利用/查找指定的内容如查找Listen,先在飞编辑模式下按/然后后面跟上Listen
如果不是自己要找的,可以按n键向下搜索
默认Listen监听的是所有IP地址端口是80
省略ip表示监听本机所有IP,Listen可重复出现多次
LISTEN格式
Listen {ip:}port
如:
Listen 10.0.1.1:80
这里是只监听10.0.1.1的80端口
Listen 10.0.1.1:81
这里只监听10.0.1.1的81端口
Listen 83
这里监听所有的IP地址的83端口
可以写多个监听地址和端口如下
Listen 80
Listen 10.0.1.1:82
修改好以后重启或者重新加载httpd的配置文件
service httpd reload 重新加载配置文件
service httpd restart 重启httpd
Listen 80
利用命令查看httpd监听端口和IP
# netstat -lntup
返回结果:
......
tcp 0 0 :::80 :::* LISTEN 1580/httpd
......
这里可以看到httpd监听的是所有的IP地址,监听端口是80
持久链接(会话保持时间)
连接建立后,每个资源获取完成后不会断开连接,而是继续等待其他资源的请求的完成
如何断开:
数量限制:100个
获取100个资源以后自动断开,哪怕你的时间没有到期
时间限制:可以自己定义比如60秒
副作用
对并发访问量较大的服务器,有的服务器已经请求完资源,还有没有访问到的在排队等待
持久连接功能会使有些请求得不到相应
折中方案:
使用较短的持久时间,比如5秒钟
httpd2.4支持毫秒级的持久化设置
配置httpd持久化设置
vim /etc/httpd/con/httpd.conf
找到KeepAlive Off
KeepAlive Off
默认是关闭状态
如果不启用MaxKeepAliveRequests 100和KeepAliveTimeout 15就没有作用
启用KeepAlive
KeepAlive On
MaxKeepAliveRequests 100
最大连接请求连接数
KeepAliveTimeout 15
连接超时时长,单位默认是秒
利用telnet测试长连接
先来安装telnet
yum install telnet -y
利用命令测试连接
telnet 10.0.1.1 80
然后输入
GET / HTTP/1.1
Host: 10.0.1.1
回车再回车,这时候发现连接并没有断开,说明持久连接生效了
MPM,HTTPD各种模型,多路并发相应模型是如何实现的
httpd-2.2不支持同时编译多个模块,最多在编译时选定一个
rpm安装的包提供了三个二进制程序文件,分别用于实现不同MPM机制的实现和切换
确认自己使用的哪种MPM模型
# ps aux|grep httpd
返回结果:
root 2184 0.0 0.3 177400 3824 ? Ss Oct22 0:00 /usr/sbin/httpd
apache 2186 0.0 0.2 177400 2464 ? S Oct22 0:00 /usr/sbin/httpd
apache 2187 0.0 0.2 177400 2468 ? S Oct22 0:00 /usr/sbin/httpd
apache 2188 0.0 0.3 177536 3156 ? S Oct22 0:00 /usr/sbin/httpd
apache 2189 0.0 0.3 177536 3068 ? S Oct22 0:00 /usr/sbin/httpd
apache 2190 0.0 0.3 177536 3052 ? S Oct22 0:00 /usr/sbin/httpd
apache 2191 0.0 0.2 177400 2464 ? S Oct22 0:00 /usr/sbin/httpd
apache 2192 0.0 0.2 177400 2464 ? S Oct22 0:00 /usr/sbin/httpd
apache 2193 0.0 0.2 177400 2464 ? S Oct22 0:00 /usr/sbin/httpd
root 2297 0.0 0.0 103312 872 pts/0 S+ 00:04 0:00 grep httpd
这里是prefork模型运行的httpd(/usr/sbin/httpd)
如果是/usr/sbin//usr/sbin/httpd.worker就是worker模式
如果是/usr/sbin//usr/sbin/httpd.event就是event模型
更换httpd模型,改成worker模型
vim /etc/sysconfig/httpd
原
#HTTPD=/usr/sbin/httpd.worker
改后(把前面的#号注释去掉)
HTTPD=/usr/sbin/httpd.worker
修改好
重启服务,这样启动起来以后以worker模型启动
# service httpd restart
利用ps命令查看httpd的启动模型
# ps aux|grep httpd
root 2341 0.0 0.4 177608 4048 ? Ss 00:35 0:00 /usr/sbin/httpd.worker
apache 2343 0.0 0.5 521868 5324 ? Sl 00:35 0:00 /usr/sbin/httpd.worker
apache 2344 0.0 0.5 521868 5332 ? Sl 00:35 0:00 /usr/sbin/httpd.worker
apache 2345 0.0 0.5 521868 5332 ? Sl 00:35 0:00 /usr/sbin/httpd.worker
root 2456 0.0 0.0 103312 872 pts/0 S+ 00:35 0:00 grep httpd
这里可以看到启动的进程是/usr/sbin/httpd.worker
更换httpd模型,改成event模型
vim /etc/sysconfig/httpd
原
#HTTPD=/usr/sbin/httpd.worker
改后(把前面的#号注释去掉)
HTTPD=/usr/sbin/httpd.event
修改好
重启服务,这样启动起来以后以event模型启动
# service httpd restart
利用ps命令查看httpd的启动模型
# ps aux|grep httpd
返回结果:
root 2488 0.0 0.4 177604 4024 ? Ss 00:40 0:00 /usr/sbin/httpd.event
apache 2490 0.0 0.5 521864 5316 ? Sl 00:40 0:00 /usr/sbin/httpd.event
apache 2491 0.0 0.5 521864 5320 ? Sl 00:40 0:00 /usr/sbin/httpd.event
apache 2492 0.0 0.5 521864 5336 ? Sl 00:40 0:00 /usr/sbin/httpd.event
root 2575 0.0 0.0 103312 872 pts/0 S+ 00:40 0:00 grep httpd
先把httpd的模型改回prefork模型
vim /etc/sysconf/httpd
原
HTTPD=/usr/sbin/httpd.worker
改为先给注释掉,前面加一个#号就行
#HTTPD=/usr/sbin/httpd.worker
重启服务
server httpd restart
preforkr模型配置文件详解
vim /etc/httpd/con/httpd.conf
下面的这段话是以if判断来是否生效,根据启动MPM模型来判断是否生效
根据模块来判断是启用那个配置文件生效
这是prefork模型的配置文件详解
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
解释:
<IfModule prefork.c>
prefork模型模块运行的模块
StartServers 8
服务启动时服务器启动的进程数
MinSpareServers 5
最小空闲进程数
MaxSpareServers 20
最大空闲进程数
ServerLimit 256
为MaxClients生命周期内的进程数量最大值
MaxClients 256
最大并发请求数,最大启动进程数量
MaxRequestsPerChild 4000
一个服务最多能相应多少次的请求
</IfModule>
worker模型配置文件详解
修改成worker模型请往上看
启动/etc/sysconf/httpd下的HTTPD=/usr/sbin/httpd.worker
然后重启服务即可
if判断启动模块来生效哪个模块的配置文件
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
解释:
<IfModule worker.c>
StartServers 4
服务启动时服务器启动的进程数
MaxClients 300
服务器启动时最大的线程数
MinSpareThreads 25
最小空闲线程数
MaxSpareThreads 75
最大空闲线程数
ThreadsPerChild 25
每个进程,所启动的线程数
MaxRequestsPerChild 0
每个线程数所能最大相应请求的数量
</IfModule>
查看httpd直接编译进核心的模块列表
# httpd -l
返回结果:
Compiled in modules:
core.c(核心模块)
prefork.c(prefork模块)
http_core.c(httpd功能核心模块)
mod_so.c(支持模块动态装卸载)
查看httpd静态及动态装卸载的模块
# httpd -M
返回结果:
httpd: apr_sockaddr_info_get() failed for Centos6-1
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
auth_basic_module (shared)
auth_digest_module (shared)
authn_file_module (shared)
authn_alias_module (shared)
authn_anon_module (shared)
authn_dbm_module (shared)
authn_default_module (shared)
authz_host_module (shared)
authz_user_module (shared)
authz_owner_module (shared)
authz_groupfile_module (shared)
authz_dbm_module (shared)
authz_default_module (shared)
ldap_module (shared)
authnz_ldap_module (shared)
include_module (shared)
log_config_module (shared)
logio_module (shared)
env_module (shared)
ext_filter_module (shared)
mime_magic_module (shared)
expires_module (shared)
deflate_module (shared)
headers_module (shared)
usertrack_module (shared)
setenvif_module (shared)
mime_module (shared)
dav_module (shared)
status_module (shared)
autoindex_module (shared)
info_module (shared)
dav_fs_module (shared)
vhost_alias_module (shared)
negotiation_module (shared)
dir_module (shared)
actions_module (shared)
speling_module (shared)
userdir_module (shared)
alias_module (shared)
substitute_module (shared)
rewrite_module (shared)
proxy_module (shared)
proxy_balancer_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_ajp_module (shared)
proxy_connect_module (shared)
cache_module (shared)
suexec_module (shared)
disk_cache_module (shared)
cgi_module (shared)
version_module (shared)
Syntax OK
DSO动态共享对象
支持模块动态装卸载
模块装载目录
/usr/lib64/httpd/modules/
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
模块路径可使用相对路径(地址)
相对于ServerRoot指定的路径而言(/etc/httpd)
/etc/httpd/modules这是一个软连接,连接到/usr/lib64/httpd/modules/
装载模块的配置文件
/etc/httpd/conf/httpd.conf
如果要注释掉指定的模块只需要把模块LoadModule前面加上#号注释小即可比如
#LoadModule auth_basic_module modules/mod_auth_basic.so
默认是启用的
禁用掉的模块想启用只需要把前面的#号注释掉就启用了
定义网站根路径
DocumentRoot指向的丼为URL路径的起始位置
如:www.9527edu.org/ = DocumentRoot /var/www/html
默认网站根路径目录是在/var/www/html/下
修改默认网站根目录
单独创建一个目录做网站目录
mkdir -p /html/www/
修改网站目录
vim /etc/httpd/con/httpd.conf
原
DocumentRoot "/var/www/html"
改后
DocumentRoot "/html/www
保存退出
重启apache
service httpd restart
添加一个测试的页面到新的目录里面
echo "now test web index" > /html/www/index.html
利用curl命令测试访问
# curl 10.0.1.1
返回结果:
now test web index
站点访问控制机制
可基于两种类型的路径指定对那些资源进行控制
文件系统路径:
<Directory ""> </Direcotry> 单个目录
<File ""> </File> 单个文件
<FileMatch ""> </FileMatch> 正则表达式(尽量不使用正则表达式,效率低)
URL路径:
<location ""> </location>
访问控制机制:
基于来源地址:
基于用户账号密码:
Direcotry中基于来源地址实现访问控制
Options选项,根据用户访问控制的选项或机制
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
Indexes索引:
如果启用这个选项,你所在目录如果没有默认的索引页面,它会把你的网站下所有内容展示出来
实例:
启用状态,
<Directory "/html/www">
Options Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
禁用状态在Indexes前面加上-(减号)
<Directory "/html/www">
Options -Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
FollowSymLinks
符号连接访问(软连接)
允许跟踪符号软连接到的连接文件
启用状态
<Directory "/html/www">
Options -Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
禁用状态
<Directory "/html/www">
Options None
Order allow,deny
Allow from all
</Directory>
SymLinksifOwnerMatch
允许追踪,属主匹配的时候允许追踪原文件和符号连接的属主匹配的时候,否则就不允许
ExecCGI
MultiViews
根据浏览器语言或者指定的选项去做匹配一般不启用,性能差
下面语句块解释:
基于来源地址的访问控制机制
<Directory "/html/www">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
解释:
Order
检查次序
Order allow,deny,只有你允许的才允许,需要做白名单
Order deny,deny,默认的都允许,只有deny的才deny,也就是做黑名单处理
allow
deny
ip:限制
NetAddr:
10.0.
10.0.0.0
10.0.0.0/16
10.0.0.0/255.255.0.0
实例:
拒绝10.0.1主机访问,允许10.0.0.0/24网段内的主机访问
vim /etc/httpd/con/httpd.conf
修改
<Directory "/html/www">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Deny from 10.0.0.1
Allow from 10.0.0.0/24
</Directory>
保存退出
重启服务以后10.0.0.1这台主机就无法访问了,但是其他主机照样可以访问
重启服务
service httpd restart
日志设定:
错误日志路径
ErrorLog logs/error_log
真实路径L:/etc/httpd/logs/error_log
日志级别:
默认是warn
LogLevel warn
级别如下
debug, info, notice, warn, error, crit,alert, emerg
访问日志:
CustomLog logs/access_log combined
解释:
combined
日志格式
定义日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
解释:
%h
客户端访问者的IP地址
%l
访问者用户名一般为空(不重要)
%u
用户认证时的用户名,(一般为空)需要输入用户名和密码的
%t
服务器收到请求时的时间,提供服务的时间
\"%r\
请求报文的首行信息(请求时的方法,请求时的URL,请求时的协议版本)
%>s
记录访问请求时的状态码如200,302,302,404,403,500等
%b
相应报文的主体部分大小,单位是字节不包含相应报文首部
\"%{Referer}i\"{%{Foobar}i}
请求报文当中"referer"首部的值,当前资源的访问入口,从自于哪个超链接请求跳转而来
\"%{User-Agent}i\"
请求报文中的头部信息,也就是客户端的浏览器信息
即发出请求用到的应用程序,
详细的一段访问日志记录
10.0.0.1 - - [23/Oct/2021:19:11:27 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"
路径别名:
21:00分
定义默认主页面可以要多个,自左而右生效
DirectoryIndex index.html index.html.var
Centos7:httpd2.4
安装httpd
yum install httpd -y
查看安装的httpd的软件包
# rpm -qa httpd
返回结果:
httpd-2.4.6-97.el7.centos.1.x86_64
查看安装的httpd的配置文件
# rpm -qc httpd
返回结果:
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
解释: