本节索引
一、Apache介绍
二、Apache常用设置
三、mod_deflate模块——压缩页面优化传输
四、实现虚拟主机——单台主机搭建多个网站
1.实验:基于端口号的虚拟主机
2.实验:基于IP地址的虚拟主机
3.实验:基于主机头的虚拟主机
一、Apache介绍
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的
计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件
之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服
务器中。
发展历史:
20世纪90年代初,国家超级计算机应用中心NCSA开发
1995年开源社区发布apache(a patchy server)
ASF: apache software foundation
FSF:Free Software Foundation
特性:
1.高度模块化:core+modules
2.动态加/卸载:DSO(Dynamic Shared Object)
3.多路处理模块:MPM(multi-processing module)
功能特性:
基于IP、Port、FQDN的虚拟主机
CGI:Common Gateway Interface,通用网关接口
反向代理
负载均衡
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块
Httpd安装及主要文件
版本:
CentOS 6: 2.2
CentOS 7:2.4
安装方式:
rpm,yum:centos发行版,稳定,建议使用
编译安装:定制或特殊需求
CentOS 6程序环境:httpd-2.2
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
检查配置语法:
httpd –t
service httpd configtest
服务脚本:/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
服务控制和启动:
chkconfig httpd on|off
service {start|stop|restart|status|configtest|reload} httpd
站点网页文档根目录:
/var/www/html
模块文件路径:
/etc/httpd/modules
/usr/lib64/httpd/modules
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event
主进程文件:
/etc/httpd/run/httpd.pid
日志文件目录:
/var/log/httpd
access_log: 访问日志
error_log:错误日志
帮助文档包:
httpd-manual
Apache是一个模块化的程序,管理员可以选择一些模块来增加服务器的某些功能。这些模块,可以在
创建服务器程序时静态地编译到httpd服务器的二进制代码中,也可以编译成一些独立于服务器程序的
DynamicShared Objects (DSOs)文件
模块索引官方文档:http://httpd.apache.org/docs/2.4/mod/
查看静态编译的模块
httpd -l
查看静态编译及动态装载的模块
httpd –M
动态模块加载:不需重启即生效
动态模块路径
/usr/lib64/httpd/modules/
下面来介绍一些Httpd使用中的常见设置
二、Apache常用设置
1服务器版本信息显示格式
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2
MyMod/1.2
建议使用:ServerTokens Prod
示例:
当使用curl –I命令访问一台主机时,系统默认:
修改为:ServerToken Prod
2修改监听的IP和Port
Listen [IP:]PORT
(1) 省略IP表示为本机所有IP
(2) Listen指令至少一个,可重复出现多次
Listen 80
Listen 8080
示例:
Listen 192.168.1.100:8080
Lsten 80
注:当主配置文件/etc/httpd/conf/httpd.conf以及 /etc/httpd/conf.d目录下同时有Listen指令时,将同时
生效
3持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继
续等待其它的请求完成,默认关闭持久连接
断开条件:数量限制:100
时间限制:以秒为单位, httpd-2.4 支持毫秒级
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应
折衷:使用较短的持久连接时间
设置: KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
测试: telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
4 MPM(Multi -Processing Modules)多路处理模块
经过适当的配置,可以提高服务器的负载能力。
原理是通过增加服务进程数量使服务器可以同时处理更多用户请求。
三种模式:prefork, worker, event(2.2为试验阶段)
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装
的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持
确认方法:
httpd –V
ps aux | grep httpd
默认为/usr/sbin/httpd, 即prefork模式
更换使用的httpd程序:
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
重启服务生效
pstree -p|grep httpd 查看进程和线程
Httpd 2.4 与之不同
以动态模块方式提供
配置文件:/etc/httpd/conf.modules.d/00-mpm.conf
httpd –M |grep mpm
重启服务生效
pstree -p|grep httpd 查看进程和线程
prefork:
多进程I/O模型,每个进程响应一个请求,默认模型
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先
生成多个空闲进程,等待请求,最大不超过1024个
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。(我们常用的mod_php,PHP
的拓展不需要支持线程安全)
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种
场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。
prefork的默认配置:
<IfModule prefork.c>
StartServers 8 服务启动时,预先同时开启几个进程
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256 最多进程数,最大20000
MaxClients 256 最大并发
MaxRequestsPerChild 4000 子进程最多能处理的请求数量。在处
理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这
时候子进程占用的内存就会释放(为0时永远不释放)
</IfModule>
worker:
复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应
一个请求,并发响应请求:m*n
优点:占据更少的内存,高并发下表现更优秀。
缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。
如果使用keep-alive的长连接方式,某个线程会一直被占据,也许中间几乎没
有请求,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会
导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
worker的默认配置:
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0 无限制
</IfModule>
event:
事件驱动模型(worker模型的变种)
一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:
m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请
求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请
求处理能力
httpd-2.2: event 测试版,centos6默认
httpd-2.4:event 稳定版,centos7默认
5.DSO: Dynamic Shared Object
加载动态模块配置
/etc/httpd/conf/httpd.conf
配置指定实现模块加载格式:
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:
相对于ServerRoot(默认/etc/httpd)
示例:
LoadModule auth_basic_module
modules/mod_auth_basic.so
6更改httpd服务默认目录
DocumentRoot “/path”
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
示例:
DocumentRoot “/app/data”
CentOS7必须给目录授权才能使用:
<Directory “/app/data”>
Require all granted
</Directory>
http://HOST:PORT/test/index.html
–> /app/data/test/index.html
注意:SELinux和iptables的状态
7定义站点未指定时的默认页面
默认为testing页面:
DirectoryIndex index.html index.html.var
8基于IP的访问控制:
CentOS 6:
order和allow、deny
放在directory, .htaccess中
order:定义生效次序;写在后面的表示默认法则
Order allow,deny
Order deny,allow
Allow from和Deny from:定义客户端地址
客户端地址:
IP
网络: 172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
CentOS 7:
无明确授权的目录,默认拒绝
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all denied
控制特定的IP访问:
Require ip IPADDR:授权指定来源的IP访问
Require not ip IPADDR:拒绝特定的IP访问
控制特定的主机访问:
Require host HOSTNAME:授权特定主机访问
Require not host HOSTNAME:拒绝
HOSTNAME:
FQDN:特定主机
domin.tld:指定域名下的所有主机
9针对资源进行访问控制
可基于两种机制指明对哪些资源进行何种访问控制
访问控制机制有两种:客户端来源地址,用户账号
文件系统路径:
针对目录:
<Directory “/path”>
…
</Directory>
针对文件,支持通配符:
<File “/path/file”>
…
</File>
支持正则表达式:
<FileMatch “PATTERN”>
…
</FileMatch>
URL路径:
<Location “”>
…
</Location>
<LocationMatch “”>
…
</LocationMatch>
示例:
<FilesMatch “\.(gif|jpe?g|png)$”>
<Files “?at.*”> 通配符
<Location /status>
<LocationMatch “/(extra|special)/data”>
10 <Directory>中“基于源地址”实现访问控制
(1) Options:后跟1个或多个以空白字符分隔的选项列表
在选项前的+,- 表示增加或删除指定选项
常见选项:
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源
文件时,返回索引列表给用户
FollowSymLinks:允许访问符号链接文件所指向的源文件
None:全部禁用
All: 全部允许
示例:
<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options FollowSymLinks
</Directory>
<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options +Includes -Indexes
</Directory>
(2) AllowOverride
与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName
指定)文件中,覆盖之前的配置指令
只对<directory>语句有效
AllowOverride All: 所有指令都有效
AllowOverride None:.htaccess 文件无效
AllowOverride AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都无法覆盖
11日志设定
日志类型:
访问日志
错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn
LogLevel 可选值:
debug, info, notice, warn,error,crit, alert, emerg 越靠后等级越高
访问日志:
定义日志格式:LogFormat format strings
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
使用日志格式:
CustomLog logs/access_log combined
参考帮助:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h 客户端IP地址
%l 远程用户,启用mod_ident才有效,通常为减号“-”
%u 验证(basic,digest)远程用户,非登录访问时,为一个减号“-”
%t 服务器收到请求时的时间
%r First line of request,即表示请求报文的首行;记录了此次请求的“方法”,
“URL”以及协议版本
%>s 响应状态码
%b 响应报文的大小,单位是字节;不包括响应报文http首部
%{Referer}i 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至
当前页面的,超链接来源
%{User-Agent}i 显示浏览器类型;请求报文中首部“User-Agent”的值;即发出请求的应用程序
更多的格式选项请参考官方mod_log_config 文档
示例:
默认日志中日期显示为:[21/Jun/2018:17:00:54 +0800]
vim /etc/httpd/conf/httpd.conf
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined找到此行
修改 %t ==> %{%F %T}t
再次打开access_log日志日期格式:2018-06-21 19:02:27
12设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
13定义路径别名
格式: Alias /URL/ “/PATH/”
DocumentRoot “/www/htdocs”
http://www.magedu.com/download/bash.rpm
==>/www/htdocs/download/bash.rpm
Alias /download/ “/rpms/pub/”
http://www.magedu.com/download/bash.rpm
==>/rpms/pub/bash.rpm
http://www.magedu.com/images/logo.png
==>/www/htdocs/images/logo.png
注意:CentOS 7要给重新指定的路径进行grant授权才可访问
<directory “/rpm/pub”>
require all granted
</directory>
14基于用户的访问控制
认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户
端提供账号和密码
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,
则服务器发送响应的资源
认证方式两种:
basic:明文
digest:消息摘要认证,兼容性差
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告
知用户认证的原因
用户的账号和密码
虚拟账号:仅用于访问某服务时用到的认证标识
存储:文本文件,SQL数据库,ldap目录存储,nis等
basic认证配置示例:
(1) 定义安全域
<Directory “/path”>
Options None
AllowOverride None
AuthType Basic
AuthName “String“
AuthUserFile “/PATH/HTTPD_USER_PASSWD_FILE”
Require user username1 username2 …
</Directory>
允许账号文件中的所有用户登录访问:
Require valid-user
(2) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
-c:自动创建文件,仅应该在文件不存在时使用
-p:明文密码
-d:CRYPT格式加密,默认
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户
基于组账号进行认证
(1) 定义安全域
<Directory “/path”>
AuthType Basic
AuthName “String“
AuthUserFile “/PATH/HTTPD_USER_PASSWD_FILE”
AuthGroupFile “/PATH/HTTPD_GROUP_FILE”
Require group grpname1 grpname2 …
</Directory>
(2) 创建用户账号和组账号文件
组文件:每一行定义一个组
GRP_NAME: username1 username2 …
示例:
<Directory “/www/htdocs/admin”>
Options None
AllowOverride None
AuthType Basic
AuthName “Administator private”
AuthUserFile “/etc/httpd/conf.d/.htpasswd”
AuthGroupFile “/etc/httpd/conf.d/.htgroup”
Require group webadmins
</Directory>
vim /etc/httpd/conf.d/.htgroup
webadmins:wang mage
远程客户端和用户验证的控制
Satisfy ALL|Any
ALL 客户机IP和用户验证都需要通过才可以
Any客户机IP和用户验证,有一个满足即可
示例:
Require valid-user
Order allow,deny
Allow from 192.168.1
Satisfy Any
15实现用户家目录的http共享
基于模块mod_userdir.so实现
httpd -M |grep userdir
SELinux: http_enable_homedirs
相关设置:
vim /etc/httpd/conf.d/userdir.conf
UserDir public_html #指定共享目录的名称
准备目录
su – wang;mkdir ~/public_html
setfacl –m u:apache:x ~wang
访问
http://localhost/~wang/index.html
16、status页面
功能:显示系统中的状态信息,了解服务器状态,监控用
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Require all granted
</Location>
ExtendedStatus On 显示扩展信息
访问:
http://IP:PORT/server-status 就可以监控apache服务了
下面就是该网页所显示的监控情况:
参数说明:
字段 说明
Server Version Apache 服务器的版本。
Server MPM MPM工作模式
Server Built Apache 服务器编译安装的时间。
Current Time 目前的系统时间。
Restart Time Apache 重新启动的时间。
Parent Server Generation Apache 父程序 (parent process) 的世代编号,就是 httpd 接收到 SIGHUP
而重新启动的次数。
Server uptime Apache 启动后到现在经过的时间。
Total accesses 到目前为此 Apache 接收的联机数量及传输的数据量。
CPU Usage 目前 CPU 的使用情形。
_SWSS…. 所有 Apache process 目前的状态。每一个字符表示一个程序,最多可以显示 256 个程序
的状态。
Scoreboard Key 上述状态的说明。以下为每一个字符符号所表示的意义:
* _:等待连结中。
* S:启动中。
* R:正在读取要求。
* W:正在送出回应。
* K:处于保持联机的状态。
* D:正在查找DNS。
* C:正在关闭连结。
* L:正在写入记录文件。
* G:进入正常结束程序中。
* I:处理闲置。
* .:尚无此程序。
Srv 本程序与其父程序的世代编号。
PID 本程序的process id。
Acc 分别表示本次联机、本程序所处理的存取次数。
M 该程序目前的状态。
CPU 该程序所耗用的CPU资源。
SS 距离上次处理要求的时间。
Req 最后一次处理要求所耗费的时间,以千分之一秒为单位。
Conn 本次联机所传送的数据量。
Child 由该子程序所传送的数据量。
Slot 由该 Slot 所传送的数据量。
Client 客户端的地址。
VHost 属于哪一个虚拟主机或本主机的IP。
Request 联机所提出的要求信息。
三、mod_deflate模块——压缩页面优化传输
mod_deflate
功能:压缩页面优化传输速度
官方文档:http://httpd.apache.org/docs/2.4/mod/mod_deflate.html
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
(2) 压缩适于压缩的资源,例如文本文件
LoadModule deflate_module modules/mod_deflate.so SetOutputFilter DEFLATE
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
Level of compression (Highest 9 – Lowest 1) 压缩比(1-9)
DeflateCompressionLevel 9
排除特定旧版本的浏览器,不支持压缩
Netscape 4.x 只压缩text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html
Netscape 4.06-08三个版本 不压缩
BrowserMatch ^Mozilla/4\.0[678] no-gzip
Internet Explorer标识本身为“Mozilla / 4”,但实际上是能够处理请求的压缩。
如果用户代理首部匹配字符串“MSIE”(“B”为单词边界”),就关闭之前定
义的限制
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
查看网站是否压缩
方法一:利用curl命令
Curl -I -v –compressed http://www.178linux.com
方法二:站长工具查询
示例:
查看mod_deflate.so模块是否已加载
修改配置文件
重启httpd服务即可
systemctl restart httpd
四、实现虚拟主机——单台主机搭建多个网站
前期准备:
虚拟机一台,操作系统版本为CentOS 7.4,IP地址:192.168.30.10
1实验:基于端口号的虚拟主机
实验预期:
搭建三个网站,网站与监听端口对应关系如下:
www.a.com Listen 81
www.b.com Listen 82
www.c.com Listen 83
具体步骤:
创建网站目录
mkdir /data/website{1,2,3} -pv
echo www.a.com > /data/website1/index.html
echo www.b.com > /data/website2/index.html
echo www.c.com > /data/website3/index.html
编写配置文件
vim /etc/httpd/conf.d/test2.conf
Listen 81
listen 82
listen 83
<directory “/data/”>
require all granted
</directory>
<VirtualHost *:81>
DocumentRoot “/data/website1”
ServerName www.a.com
Errorlog “logs/a.com.error_log”
Transferlog “logs/a.con-access_log”
</VirtualHost>
<VirtualHost *:82>
DocumentRoot “/data/website2”
ServerName www.b.com
Errorlog “logs/b.com.error_log”
Transferlog “logs/b.con-access_log”
</VirtualHost>
<VirtualHost *:83>
DocumentRoot “/data/website3”
ServerName www.c.com
Errorlog “logs/c.com.error_log”
Transferlog “logs/c.con-access_log”
</VirtualHost>
重启httpd服务
systemctl restart httpd
检查端口是否监听状态
ss -ntl
浏览器分别打开IP:port测试网页能否正常显示
2实验:基于IP地址的虚拟主机
实验预期:
搭建三个网站,网站与IP地址对应关系如下:
www.a.com 192.168.30.11
www.b.com 192.168.30.22
www.c.com 192.168.30.33
添加IP地址
ip addr add 192.168.30.11/24 dev ens33
ip addr add 192.168.30.22/24 dev ens33
ip addr add 192.168.30.33/24 dev ens33
修改配置文件
vim /etc/httpd/conf.d/test.conf
<directory “/data/”>
require all granted
</directory>
<VirtualHost 192.168.30.11:80>
DocumentRoot “/data/website1”
ServerName www.a.com
Errorlog “logs/a.com.error_log”
Transferlog “logs/a.con-access_log”
</VirtualHost>
<VirtualHost 192.168.30.22:80>
DocumentRoot “/data/website2”
ServerName www.b.com
Errorlog “logs/b.com.error_log”
Transferlog “logs/b.con-access_log”
</VirtualHost>
<VirtualHost 192.168.30.33:80>
DocumentRoot “/data/website3”
ServerName www.c.com
Errorlog “logs/c.com.error_log”
Transferlog “logs/c.con-access_log”
</VirtualHost>
重启httpd服务
systemctl restart httpd
打开浏览器分别测试
3实验:基于主机头的虚拟主机
实验预期:
通过主机头可直接访问到网站页面,也是实际应用中最常见的虚拟主机搭建方式
具体步骤:
修改配置文件
vim /etc/httpd/conf.d/test.conf
<directory “/data/”>
require all granted
</directory>
<VirtualHost *:80>
DocumentRoot “/data/website1”
ServerName www.a.com
Errorlog “logs/a.com.error_log”
Transferlog “logs/a.con-access_log”
</VirtualHost>
<VirtualHost *:80>
DocumentRoot “/data/website2”
ServerName www.b.com
Errorlog “logs/b.com.error_log”
Transferlog “logs/b.con-access_log”
</VirtualHost>
<VirtualHost *:80>
DocumentRoot “/data/website3”
ServerName www.c.com
Errorlog “logs/c.com.error_log”
Transferlog “logs/c.con-access_log”
</VirtualHost>
配置DNS解析,为了方便模拟,我们就在/etc/hosts文件中配置解析
重启httpd服务
systemctl restart httpd
打开浏览器分别访问www.a.com,www.b.com,www.c.com,访问成功
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/101326