HTTP服务器应用

http服务器程序

httpd apache
nginx
lighttpd

应用程序服务器

IIS .asp
tomcat .jsp
jetty 开源的servlet容器,基于Java的web容器
Resin CAUCHO公司,支持servlets和jsp的引擎
webshpere(IBM), weblogic(BEA), jboss,oc4j(Oracle)

市场占有率统计
www.netcraft.com

Httpd介绍

特性:

高度模块化:core + modules
DSO: Dynamic Shared Object 动态加/卸载
MPM:multi-processing module多路处理模块

MPM工作模式

prefork:多进程I/O模型,每个进程响应一个请求,默认模型

一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个

worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型

一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

event:事件驱动模型(worker模型的变种)

一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力

httpd-2.2:event 测试版,centos6默认
httpd-2.4:event 稳定版,centos7默认

prefork MPM

worker MPM

event MPM

进程角色

httpd功能特性

1> 虚拟主机
IP、Port、FQDN
2> CGI:Common Gateway Interface,通用网关接口
3> 反向代理
4> 负载均衡
5> 路径别名
6> 丰富的用户认证机制
basic
digest
7> 支持第三方模块

httpd-2.4新特性

MPM支持运行为DSO机制;以模块形式按需加载
event MPM生产环境可用
异步读写机制
支持每模块及每目录的单独日志级别定义
每请求相关的专用配置
增强版的表达式分析式
毫秒级持久连接时长定义
基于FQDN的虚拟主机不需要NameVirutalHost指令
新指令,AllowOverrideList
支持用户自定义变量
更低的内存消耗

Httpd 安装

安装方式:

rpm:centos发行版,稳定,建议使用
编译:定制或特殊需求

安装httpd并启动服务:

yum install httpd  -y
systemctl start httpd

CentOS 7程序环境:httpd-2.4
配置文件:

/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf

检查配置语法:

httpd –t

服务单元文件: /usr/lib/systemd/system/httpd.service

配置文件:/etc/sysconfig/httpd

服务控制和启动:

systemctl enable|disable httpd.service
systemctl {start|stop|restart|status} httpd.service

站点网页文档根目录:

/var/www/html

模块文件路径:  

/etc/httpd/modules
/usr/lib64/httpd/modules

主程序文件:

/usr/sbin/httpd

主进程文件:

/etc/httpd/run/httpd.pid

日志文件目录:

/var/log/httpd
access_log: 访问日志
error_log:错误日志

安装帮助文档包:

yum isntall httpd-manual  -y

注意:安装完帮助手册之后,重启httpd服务,没有网络也可以在网上输入指定的IP地址加manual手册就可以查看帮助手册。

示例:192.168.34.100/manual  

Httpd 常见配置

httpd配置文件的组成:
主要组成

Global Environment
Main server configuration
virtual host

配置格式:directive value

directive 不区分字符大小写
value 为路径时,是否区分大小写,取决于文件系统

官方帮助

http://httpd.apache.org/docs/2.4/

(2)httpd 配置文件的组成:修改前先备份,养成好习惯

vim /etc/httpd/conf/httpd.conf

为了避免配置文件比较混乱,可以新建一个测试文件单独存放写入的配置文件信息即可

vim  /etc/httpd/conf.d/testconf
ServerTokens Prod
systemcl relaod httpd 重新加载httpd服务

测试显示信息结果

[root@centos7html]#curl -I http://192.168.34.100/
HTTP/1.1 403 Forbidden
Date: Wed, 27 Nov 2019 13:04:46 GMT
Server: Apache 可以看到此时只是显示apache头部
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8

配置文件在的设置       首部显示的信息

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
This setting applies to the entire server and cannot be enabled or disabled on a virtualhost-by-virtualhost basis.
After version 2.0.44, this directive also controls the information presented by the ServerSignature directive.
建议使用:ServerTokens Prod 越详细越不安全

修改监听的IP和Port

Listen [IP:]PORT
(1) 省略IP表示为本机所有IP
(2) Listen指令至少一个,可重复出现多次

Listen 80
Listen 8080

示例:

Listen 192.168.1.100:8080
Lsten 80

指定固定的IP地址和监听端口固定绑定

vim  /etc/httpd/conf/httpd.conf
Listen 192.168.34.100:9527 监听指定的IP地址和端口号

在/var/www/html目录下创建一个index.html文件

在另外一个终端监听,此时就必须指定IP地址和端口号才能监听到具体的内容

持久连接

Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接
断开条件:时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应
折衷:使用较短的持久连接时间

设置:KeepAlive On|Off  默认支持长久连接

KeepAliveTimeout 15  默认是以s为单位,断开时长

测试:telnet WEB_SERVER_IP PORT

GET /URL HTTP/1.1
Host: WEB_SERVER_IP

开始验证断开时长情况:

vim /etc/httpd/conf.d/test.conf
KeepAliveTimeout 15     设置断开时长为15s
systemctl reload httpd 重新加载httpd

此时在另一个主机上连接配置好的连接超时时长机器,连接超过15s之后就会自定断开

[root@centos777~]#telnet  192.168.34.100 80
Trying 192.168.34.100...
Connected to 192.168.34.100.
Escape character is '^]'.
GET /index.html HTTP/1.1
HOST: 1.1.1.1

MPM( Multi-Processing Module)多路处理模块

prefork, worker, event

切换使用的MPM,默认使用prefork模块较多

vim /etc/httpd/conf.modules.d/00-mpm.conf

启用要启用的MPM相关的LoadModule指令即可

查看静态编译的模块

httpd -l

查看静态编译及动态装载的模块

httpd –M

动态模块加载:不需重启即生效

动态模块路径

/usr/lib64/httpd/modules/

修改模块配置,只需要将前面的注释去掉,重启httpd服务,就可以使用当前的模块:

vim  /etc/httpd/conf.modules.d/00-mpm.conf  

 prefork的配置:

StartServers         8   # 一开始启动服务时有8个进程
MinSpareServers 5 # 最小空闲进程
MaxSpareServers 20 # 最大空闲进程
ServerLimit 256 # 最多进程数,最大20000
MaxRequestsPerChild 4000 # 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
MaxClients 256 # 最大并发数

修改httpd的include包含的以*.conf结尾的配置文件,防止与主配置文件混乱,限制进程数与并发数,设置情况需要根据生产环境进行设置,设置完之后重启httpd服务:systemctl restart httpd

[root@centos7 ~]# vim /etc/httpd/conf.d/test.conf
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

worker的配置:

ServerLimit       16    最多线程数
StartServers 2 一开始准备2个线程
MaxRequestWorkers 150 最大处理请求数量
MinSpareThreads 25 最小空闲进程
MaxSpareThreads 75 最大空闲进程
ThreadsPerChild 25 每个子线程的25个最大线程

与上面的prefork配置同理,需要开启work模块,并设置work模块的最大线程与进程,限制大小可以根据实际生产环境进行设置。

[root@centos7 ~]# vim /etc/httpd/conf.d/test.conf
ServerLimit 16
StartServers 2
MaxRequestWorkers 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25

DSO: Dynamic Shared Object 

    加载动态模块配置

/etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf

配置指定实现模块加载格式:

LoadModule <mod_name> <mod_path>

模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)

示例:

LoadModule auth_basic_module
modules/mod_auth_basic.so

演示:

如果不想让此LoadModule auth_basic_module模块不再生效,直接在配置文件中注释掉此模块即可

[root@centos7~]#cd /etc/httpd/conf.modules.d
[root@centos7conf.modules.d]#ls
00-base.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-proxy.conf 00-systemd.conf 01-cgi.conf
[root@centos7conf.modules.d]#vim 00-base.conf 在此配置文件中修改配置文件

由于已经被注释掉,此时已经搜不到此模块信息:

httpd -M |grep basic

再将配置文件中的模块再修改回去,此时再验证结果

vim /etc/httpd/conf.modules.d/00-base.conf,将要启用的模块的#去掉即可,此时已经能查看到当前的模块

定义'Main' server的文档页面路径

DocumentRoot “/path”

文档路径映射:

DocumentRoot指向的路径为URL路径的起始位置

示例:

DocumentRoot "/app/data“
http://HOST:PORT/test/index.html --> /app/data/test/index.html

注意:SELinux和iptables的状态

练习:

新建一个/data/www目录,将访问的网站页面是此目录,我们怎么去修改呢?

[root@centos7data]#mkdir /data/www
[root@centos7data]#cp /var/www/html/index.html /data/www/
[root@centos7 ~]# echo welcome to beijing > /data/www/index.html

修改定义文件格式,将文件格式可以写入到临时的文件中,在include包含的*.conf配置文件中指定新的访问网页路径,不需要注释掉httpd默认的主配置文件的/var/www/html/目录,默认会优先访问新创建的目录路径

[root@centos7conf.modules.d]#vim /etc/httpd/conf.d/test.conf
DocumentRoot "/data/www"
<Directory "/data/www">
Require all granted
</Directory>

修改完之后重新启动httpd服务

systemctl restart httpd

此时可以通过/data/html访问页面。

定义站点主页面

搜索:/DirectoryIndex

格式:DirectoryIndex index.html index.html.var

分析:

查询http://192.168.30.106/ 及其子目录时,不指定文件,可以默认打开目录下的index.html文件

在配置文件中默认的模块语句,优先使用index.html文件

vim /etc/httpd/conf/httpd.conf

<IfModule dir_module>
DirectoryIndex index.html
</IfModule>

 如果将baidu.html写在index.html上面,此时的优先级高于index.html文件,优先访问的就是baidu.html

子配置文件 /etc/httpd/conf.d/welcome.conf 的welcome.conf不是以conf结尾的文件,且将/var/www/html/目录下的index.html文件移动到别的目录下,此时访问页面时就会报错

[root@centos7conf.d]#mv welcome.conf  welcome.conf.bak  将配置文件改名
[root@centos7conf.d]#systemctl restart httpd
[root@centos7data]#mv /var/www/html/index.html /data/ 将index.html文件移动到data目录下

重启httpd服务:systemctl restart httpd

报错页面,此时被拒绝访问:

站点访问控制常见机制

可基于两种机制指明对哪些资源进行何种访问控制访问控制机制有两种:客户端来源地址,用户账号
文件系统路径:

<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">

<Directory>中“基于源地址”实现访问控制

(1) Options:后跟1个或多个以空白字符分隔的选项列表,可在总配置文件中修改,也可从创建一个自配置文件中修改设置

在选项前的+,- 表示增加或删除指定选项

常见选项:

Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
FollowSymLinks:允许访问符号链接文件所指向的源文件
None:全部禁用
All: 全部允许

在新建的文件夹中进行设置/etc/httpd/conf.d/test.conf

vim /etc/httpd/conf.d/test.conf

<directory /data/www>
options indexes 指明URL路径下部存在于定义的主页面资源相符的资源文件时,返回列表给用户
Require all granted
</directory>

配置文件中指明要访问的文件路径:vim  /etc/httpd/conf/httpd.conf

将/etc/httpd/conf.d/welcome.conf的配置文件进行修改并重启httpd服务,然后再网页访问,此时就可以显示文件列表信息:

[root@centos7html]#cd /etc/httpd/conf.d
[root@centos7conf.d]#ls
autoindex.conf manual.conf README test.conf userdir.conf welcome.conf
[root@centos7conf.d]#mv welcome.conf welcome.conf.bak
[root@centos7conf.d]#systemctl restart httpd

显示效果:

(2)FollowSymLinks:允许访问符号链接文件所指向的源文件 

[root@centos7conf.d]#cd /data/www
[root@centos7www]#ls
baidu.html index.html.bak shenzhen.html
[root@centos7www]#ln -s /etc etcdir 将etc创建一个软连接,软连接名为etcdir

在新建的文件中修改配置文件,允许访问软连接的源文件

vim /etc/httpd/conf.d/test.conf
<directory /data/www>
options indexes FollowSymLinks 允许访问软连接的源文件
Require all granted
</directory>

重启httpd服务

systemctl  restart httpd  

在网页上查看效果,此时可以看到etcdir软链接到etc下的文件:

示例一:

<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>

(3)AllowOverride

与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令

只对<directory>语句有效

AllowOverride All: .htaccess中所有指令都有效
AllowOverride None: .htaccess 文件无效,默认不写就是文件无效
AllowOverride AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都无法覆盖

在/data/www/目录下新建一个.htaccess文件,并将指定的指令添加到该文件中

cd /data/www   切换到www目录下
vim .htaccesss 新建一个.htaccess文件
options indexes FollowSymLinks 允许使用的指令

然后在/etc/httpd/conf.d/test.conf配置文件中修改相关配置文件,允许所有指令有效:

vim  /etc/htttpd/conf.d/test.conf

<directory /data/www>
allowoverride all
#options indexes FollowSymLinks
Require all granted
</directory>

重启httpd服务:

systemctl restart httpd

查看网页效果,可以访问结果:

(4)基于IP的访问控制: 

1> 无明确授权的目录,默认拒绝
2> 允许所有主机访问:Require all granted
3> 拒绝所有主机访问:Require all denied
4> 控制特定的IP访问:
Require ip IPADDR:授权指定来源的IP访问
Require not ip IPADDR:拒绝特定的IP访问
5> 控制特定的主机访问:
Require host HOSTNAME:授权特定主机访问
Require not host HOSTNAME:拒绝 HOSTNAME:
6> FQDN:特定主机
domin.tld:指定域名下的所有主机

不能有失败,至少有一个成功匹配才成功,即失败优先

<RequireAll>
Require all granted
Require not ip 172.16.1.1 拒绝特定IP
</RequireAll>

多个语句有一个成功,则成功,即成功优先

<RequireAny>
Require all denied 所有都不可以访问
require ip 172.16.1.1 允许特定IP
</RequireAny>

演示:

先将/etc/httpd/conf.d目录下的welcome.conf.bak恢复为welcome.conf

cd /etc/httpd/conf.d
mv welcome.conf.bak welcome.conf

在配置文件中/etc/httpd/conf.d/test.conf修改内容,不允许192.168.34.101访问

<directory /data/www>
<requireall> 此配置需要嵌套在directory中
Require all granted
require not ip 192.168.34.101 拒绝192.168.34.101进行访问
</requireall>
</directory>

检查语法:httpd -t 并重启httpd服务。

用192.168.34.101主机进行远程登录尝试,此时访问拒绝:

curl -I 192.168.34.100

192.168.34.102访问100的主机正常:

演示:

在配置文件中/etc/httpd/conf.d/test.conf修改内容,只允许192.168.34.101IP地址访问

<directory /data/www>
<requireany>
Require all denied
require ip 192.168.34.101
</requireany>
</directory>

httpd -t 检查语法,重启httpd服务。

192.168.34.101主机访问正常

192.168.34.102访问被拒绝:

 演示:也可以针对特定的文件夹进行访问控制

[root@centos7conf.d]#cd /data/www/
[root@centos7www]#mkdir news [root@centos7data]#echo /data/www/index.html > www/news/index.html

修改新建test.conf配置文件信息

vim /etc/httpd/conf.d/test.conf
<directory /data/www> 允许访问/data/www目录下的文件
Require all granted
</directory>
<directory /data/www/news> 不允许访问/data/www/news目录下的信息
Require all denied
</directory>

查看结果,此时可以访问到/data/www目录下的index.html文件,不能访问到news目录下的文件

日志设定

日志类型:

访问日志
错误日志

错误日志:

ErrorLog logs/error_log
LogLevel warn
LogLevel 可选值: debug, info, notice, warn,error, crit, alert, emergmo

httpd服务器默认的错误日志路径:/etc/httpd/logs/error_log

用户访问网页的日志默认存放路径在 /var/log/httpd/目录下:

访问日志:
定义日志格式:LogFormat format strings

LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" testlog

使用日志格式:

CustomLog logs/access_log testlog

参考帮助: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”的值;即发出请求的应用程序

在配置文件中/etc/httpd/conf/httpd.conf搜索/combined能具体看到日志格式和定义,如下图:

可以在此配置文件中定义名称和格式:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined  # 两个combined需要对应才能使用
CustomLog "logs/access_log" combined

 查询成功与错误日志:

帮助文档中可以查询具体含义:

设定默认字符集

AddDefaultCharset UTF-8 此为默认值
中文字符集:GBK, GB2312, GB18030

可以新建一个配置文件/etc/httpd/conf.d/test.conf中修改字符集:

定义路径别名 

格式: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

演示:

新建一个sports目录,将index.html文件放到sports目录下

[root@centos7data]#mkdir sports
[root@centos7data]#ls
sports www
[root@centos7data]#cp www/index.html sports/

在新建的配置文件中/etc/httpd/conf.d/test.conf中添加别名配置文件,定义别名为sports

vim /etc/httpd/conf.conf/test.conf

重启httpd服务:systemctl restart httpd

查看网页显示结果:

基于用户的访问控制

1)认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码

2)认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源

3)认证方式两种:

basic:明文
digest:消息摘要认证,兼容性差

4)安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因

5)用户的账号和密码

虚拟账号:仅用于访问某服务时用到的认证标识
存储:文本文件,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

提供账号和密码存储(文本文件)

使用专用命令完成此类文件的创建及用户管理

需要安装httpd-tools包:

[root@centos7 httpd]# yum install httpd-tools -y

htpasswd [options] /PATH/HTTPD_PASSWD_FILE username

-c 自动创建文件,仅应该在文件不存在时使用
-p 明文密码
-d CRYPT格式加密,默认
-m md5格式加密
-s sha格式加密
-D 删除指定用户

指定特定的用户进行访问网页

新建一个admin目录,并将文件的路径指向admin目录下的index.html下:

[root@centos7www]#pwd
/data/www
[root@centos7www]#mkdir admin
[root@centos7www]#echo /data/www/admin/index.html > /data/www/admin/index.html 将文件指向admin目录下的index.html文件中

创建一个httpdpass文件、tom和jerry用户

[root@centos7data]#htpasswd -c /etc/httpd/conf.d/httpdpass tom 创建tom用户和httpdpass文件
New password:
Re-type new password:
Adding password for user tom
[root@centos7data]#htpasswd -s /etc/httpd/conf.d/httpdpass jerry 创建jerry用户时,不要再创建文件,不然会覆盖httpdpass文件,因此可以用默认的-s选项加密
New password:
Re-type new password:
Adding password for user jerry

修改新创建的文件权限

[root@centos7data]#chmod 600 /etc/httpd/conf.d/httpdpass

只赋予apache账号一个读权限即可:

[root@centos7conf.d]#setfacl -m u:apache:r /etc/httpd/conf.d/httpdpass

修改新建的配置文件:

vim /etc/httpd/conf.d/test.conf  修改此配置文件
<directory /data/www/admin>
AuthType Basic
AuthName "welcome to login"
AuthUserFile "/etc/httpd/conf.d/httpdpass"
Require user tom 只允许tom访问此文件
</directory>

检查httpd服务的配置文件信息,并将httpd服务重启

[root@centos7www]#httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe9d:204e. Set the 'ServerName' directive globally to suppress this message
Syntax OK
[root@centos7www]#systemctl restart httpd

验证网页效果,并登陆

允许所有人登陆访问网页

第一种实现方法:

设置所有人都能登录,需要加入valid-user选项即可,然后重启httpd服务:

DocumentRoot "/data/www"
<directory /data/www/admin>
AuthType Basic
AuthName "welcome to login"
AuthUserFile "/etc/httpd/conf.d/httpdpass"
#Require user tom
Require valid-user # 在上面的基础上加入此选项,允许所有人登陆访问
</directory>

第二种实现方法:

vim /etc/httpd/conf.d/test.conf  # 在配置文件中修改
DocumentRoot "/data/www"
<directory /data/www/admin>
allowoverride authconfig # 允许在/data/www/admin/.htaccess文件基于验证登陆访问网页
</directory> vim /data/www/admin/.htaccess # 在.htaccess文件中配置允许所有人访问
AuthType Basic
AuthName "welcome to login"
AuthUserFile "/etc/httpd/conf.d/httpdpass"
#Require user tom
Require valid-user # 在上面的基础上加入此选项,允许所有人登陆访问

删除用户名:

[root@centos7conf.d]#htpasswd -D /etc/httpd/conf.d/httpdpass jerry
Deleting password for user jerry

基于组账号进行认证

(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 ...

实现组认证登陆网页

在httpdgroup文件中配置两个用户组账号

[root@centos7conf.d]#vim /etc/httpd/conf.d/httpdgroup
testgroup:tom jerry

在.htaccess中修改配置文件:

vim /data/www/.htaccess  # 在
AuthType Basic
AuthName "welcome to login"
AuthUserFile "/etc/httpd/conf.d/httpdpass"
AuthGroupFile "/etc/httpd/conf.d/httpdgroup" # 只有此组里边的用户名访问httpdpass文件
Require group testgroup # 允许分组进行登陆网页,与上面允许用户访问类似。

远程客户端和用户验证的控制

Satisfy ALL|Any

(1)ALL 客户机IP和用户验证都需要通过才可以

(2)Any客户机IP和用户验证,有一个满足即可

实现用户家目录的http共享

基于模块mod_userdir.so实现

SELinux: http_enable_homedirs

相关设置:

vim /etc/httpd/conf/httpd.conf
<IfModule mod_userdir.c>
#UserDir disabled
UserDir public_html #指定共享目录的名称
</IfModule>

准备目录

su - wang;mkdir ~/public_html
setfacl -m u:apache:x ~wang

访问

http://localhost/~wang/index.html

提问:我们如何将用户账号家目录的指定目录共享在网页上?

下来我介绍一下:

先在/etc/httpd/conf.d/目录下查看一个配置文件userdir.conf:

[root@centos7data]#ls /etc/httpd/conf.d
autoindex.conf httpdgroup httpdpass manual.conf README test.conf userdir.conf welcome.conf

配置userdir.conf文件里边的内容:

vim /etc/httpd/conf.d/userdir.conf

 重启httpd服务:systemctl restart httpd

此时切换至wang用户,然后创建一个public_html目录:

[root@centos7conf.d]#su - wang
Last login: Sun Nov 24 22:07:47 CST 2019 on pts/0
[wang@centos7~]$pwd
/home/wang
[wang@centos7~]$mkdir public_html
[wang@centos7~]$echo wanghome_public_html > public_html/index.html

给apache账号一个执行权限,可以切换到/home/wang目录下,并能查看信息:

[wang@centos7~]$setfacl -m u:apache:x /home/wang

查看此时的网页页面:

192.168.34.100/~wang

 如果想将wang家目录加密让指定的用户访问,对家目录进行加密,怎么办?只需要修改配置文件,在最底部写入内容:

vim /etc/httpd/conf.d/userdir.conf

<directory /home/wang/public_html>
authtype basic
authname "wang home"
authuserfile "/etc/httpd/conf.d/httpdpass"
require user tom
</directory>

 重启httpd服务:systemctl restart httpd

查看网页效果:

登陆tom账号才能看到家目录wang账号信息:

ServerSignature On | Off | EMail

(1)当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息

(2)如果不对外显示这些信息,就可以将这个参数设置为Off,默认是关闭的。

(3)设置为Email,将显示ServerAdmin 的Email提示

status页面 

这个功能需要status_module 模块

httpd -M | grep status 查询这个模块有没有被加载

LoadModule status_module modules/mod_status.so  模块总配置文件已经加载

为了安全起见,只能允许部分IP地址访问状态页:

<Location "/status">  此处status只是文件夹的名称,访问时使用此名称访问即可
SetHandler server-status 系统自带的内部处理模块
<requireany>
require all denied # 拒绝所有IP地址
require ip 192.168.7.0/24 # 允许IP地址段进行访问
</requireany>
</Location>

ExtendedStatus On 显示扩展信息,默认是打开的

演示:我们可以查看apache是否有问题,可以将此配置写入到配置文件中,查看网页信息,然后确定apache是否正常

在vim /etc/httpd/conf.d/test.conf

重启httpd服务:systemctl restart httpd

 状态的类型:

"-"等待连接 "S"启动 "R"处于读取状态

"W"发送应答 "K"保持长连接 "D"dns查询

"C"正处于关闭状态 "L"记录日志 "G"优雅的终止,温柔的断开

"r"把空闲的worker进程清理 "."没有正常的进程

虚拟主机

站点标识: socket

IP相同,但端口不同
IP不同,但端口均为默认端口,此方式用的不多
FQDN不同: 请求报文中首部 Host: www.magedu.com 用法最多

有三种实现方案:

基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机使用至少一个独立的port
基于FQDN:为每个虚拟主机使用至少一个FQDN

虚拟主机的配置方法:

<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot “/path"
</VirtualHost>

建议:上述配置存放在独立的配置文件中
其它可用指令:

ServerAlias:虚拟主机的别名;可多次使用
ErrorLog: 错误日志
CustomLog:访问日志
<Directory “/path"> </Directory>
Alias

实验一:基于IP的多虚拟主机(不推荐)

(1)新建三个目录和三个index.html文件

[root@centos7conf.d]#mkdir /data/{a,b,c}site
[root@centos7conf.d]#echo www.a.com > /data/asite/index.html
[root@centos7conf.d]#echo www.b.com > /data/bsite/index.html
[root@centos7conf.d]#echo www.c.com > /data/csite/index.html

(2)由于本机器只有两个IP地址,此时再新加一个IP地址:

[root@centos7conf.d]#ip a a 192.168.34.100 dev ens33
[root@centos7conf.d]#ip a a 192.168.34.111 dev ens33
[root@centos7conf.d]#ip a a 192.168.34.112 dev ens33

(3)在/etc/httpd/conf.d/test.conf文件中修改配置:

<virtualhost 192.168.34.100:80>
documentroot "/data/asite"
<directory /data/asite>
require all granted
</directory>
customlog /var/log/httpd/access_a.log combined
</virtualhost> <virtualhost 192.168.34.111:80>
documentroot "/data/bsite"
<directory /data/bsite>
require all granted
</directory>
customlog /var/log/httpd/access_b.log combined
</virtualhost> <virtualhost 192.168.34.112:80>
documentroot "/data/csite"
<directory /data/csite>
require all granted
</directory>
customlog /var/log/httpd/access_c.log combined
</virtualhost>

 重启httpd服务:systemctl restart httpd

配置DNS解析域名,此时我们不需要麻烦,直接将IP地址写入到hosts文件中即可

[root@centos7 httpd]# cat  /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.34.100 www.a.com
192.168.34.111 www.b.com
192.168.34.112 www.c.com

查看当前IP地址分配的网址,此时都已经可以访问,此做法缺点就是需要大量的IP地址进行做网站。

[root@centos7 httpd]# curl www.a.com
www.a.com
[root@centos7 httpd]# curl www.b.com
www.b.com
[root@centos7 httpd]# curl www.c.com
www.c.com

实验二:基于端口的多虚拟主机(不推荐)

此方法在用户输入每个网页的端口号,比较繁琐,不建议使用

修改配置文件/etc/httpd/conf.d/test.conf

listen 81 监听81端口
listen 82 监听82端口
listen 83 监听83端口
<virtualhost *:81> 将IP地址改为*,端口号改为81
documentroot "/data/asite"
<directory /data/asite>
require all granted
</directory>
customlog /var/log/httpd/access_a.log combined
</virtualhost> <virtualhost *:82> 将IP地址改为*,端口号改为82
documentroot "/data/bsite"
<directory /data/bsite>
require all granted
</directory>
customlog /var/log/httpd/access_b.log combined
</virtualhost> <virtualhost *:83> 将IP地址改为*,端口号改为83
documentroot "/data/csite"
<directory /data/csite>
require all granted
</directory>
customlog /var/log/httpd/access_c.log combined
</virtualhost>

 重启httpd服务,systemctl restart httpd

修改/etc/hosts域名解析文件,将所有域名都指向本机的一个IP地址。

[root@centos7 conf.d]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.7.100 www.a.com www.b.com www.c.com

验证结果,可以看出,只需要一个IP地址,指定端口就可以访问网页

[root@centos7www]#curl 192.168.34.100:81
www.a.com
[root@centos7www]#curl 192.168.34.100:82
www.b.com
[root@centos7www]#curl 192.168.34.100:83
www.c.com

实验三:基于主机头多虚拟主机(推荐)

A主机:192.168.34.100   提供网站

B主机:192.168.34.101   客户端,访问网页

注意:任意目录下的页面只有显式授权才能被访问

基于FQDN实现的方式原理:用户访问网站,在http内就会携带主机头,因此我们可以利用此特性,根据主机头来判断用户访问的是哪个网站,然后返回对应的页面。

(1)在A主机(网站)和B主机上(客户端)的/etc/hosts配置文件中写入相关的IP地址和网址,指向A主机的IP地址,域名解析代替DNS解析

vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 centos7.localdomain
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.34.100 www.a.com www.b.net www.c.cn # 其中192.168.34.100是A主机的IP地址

(2)在A主机上修改/etc/httpd/conf.d/test.conf配置文件内容:

<virtualhost *:80>
servername "www.a.com" # 将访问的网址写入到主机内
documentroot "/data/asite"
<directory /data/asite>
require all granted
</directory>
customlog /var/log/httpd/access_a.log testlog
</virtualhost> <virtualhost *:80>
servername "www.b.net" # 将访问的网页写入到主机内
documentroot "/data/bsite"
<directory /data/bsite>
require all granted
</directory>
customlog /var/log/httpd/access_b.log testlog
</virtualhost> <virtualhost *:80>
servername "www.c.cn"
documentroot "/data/csite"
<directory /data/csite>
require all granted
</directory>
customlog /var/log/httpd/access_c.log testlog
</virtualhost>

(3)在B主机上测试实现访问结果,此时三个网址都可以访问

mod_deflate压缩模块(生产中很重要,网页必须压缩)

使用mod_deflate模块压缩页面优化传输速度

适用场景:

(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持

[root@centos7 conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@centos7 conf.modules.d]# cat 00-base.conf |grep deflate # 查看此模块是否加载,如果没有加载,就需要启动,此时我们看到此模块已经加载了。
LoadModule deflate_module modules/mod_deflate.so

(2) 压缩适于压缩的资源,例如文本文件

LoadModule deflate_module modules/mod_deflate.so SetOutputFilter DEFLATE
SetOutputFilter DEFLATE
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain # 压缩为纯文本
AddOutputFilterByType DEFLATE text/html # 压缩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

(3)Level of compression (Highest 9 - Lowest 1)

(4)DeflateCompressionLevel 9             压缩比

(5)排除特定旧版本的浏览器,不支持压缩

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  

实验:压缩网站页面

(1)在A主机上,将之前配置过的文件中进行修改,压缩指定的虚拟机中的网页

vim /etc/httpd/conf.d/test.conf

<virtualhost *:80>
documentroot "/data/asite"
servername www.a.com
<directory /data/asite>
require all granted
</directory>
customlog /var/log/httpd/access_a.log combined
AddOutputFilterByType DEFLATE text/plain # 将plain格式压缩为text格式
AddOutputFilterByType DEFLATE text/html # 将html压缩为text格式
DeflateCompressionLevel 9 # 压缩比,9为最高压缩比
</virtualhost>

(2)重启服务:systemctl  restart httpd

 (3)将系统日志传到/data/asite目录下

[root@centos7asite]#cp /var/log/messages /data/asite/m.txt
[root@centos7asite]#chmod +r /data/asite/m.txt

 (4)在B主机上验证压缩后的网页结果,此时是以gzip压缩格式显示。

 curl  -I --compressed   www.a.com/m.txt

(5)在网页上访问,查看头报文,可以看到此时的网站已经被压缩。

 

  

  

  

 

  

 

  

  

  

  

 

 

 

  

  

  

  

  

http服务详解(2)——httpd的配置文件常见设置的更多相关文章

  1. HTTPD之二————HTTPD服务详解————httpd的配置文件常见设置

    HTTPD之二----HTTPD服务详解----httpd的配置文件常见设置 HTTP服务器应用 http服务器程序 httpd apache nginx lighttpd 应用程序服务器 IIS,a ...

  2. 【转】SSH服务详解

    [转]SSH服务详解 第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Gro ...

  3. (转)SSH服务详解

    SSH服务详解 原文:http://www.cnblogs.com/clsn/p/7711494.html 第1章 SSH服务1.1 SSH服务协议说明SSH 是 Secure Shell Proto ...

  4. Redis 详解 (二) redis的配置文件介绍

    目录 1.开头说明 2.INCLUDES 3.MODULES 4.NETWORK 5.GENERAL 6.SNAPSHOTTING 7.REPLICATION 8.SECURITY 9.CLIENTS ...

  5. winxp计算机管理中服务详解

    winxp计算机管理中服务详解01 http://blog.sina.com.cn/s/blog_60f923b50100efy9.html http://blog.sina.com.cn/s/blo ...

  6. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  7. WCF中队列服务详解

    WCF中队列服务详解 一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务 ...

  8. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  9. http服务详解(2)——httpd2.2的配置文件常见设置

    摘要:一个服务的配置文件非常重要,弄懂配置文件是熟练掌握服务的必要前提. 一.httpd-2.2常见文件介绍 (1)配置文件: 主配置文件尽量别改,改自己的子配置文件 /etc/httpd/conf/ ...

随机推荐

  1. 导航current背景

    ========================================简单一点的 var locationUrl = location.href.toLowerCase(); //导航cur ...

  2. 《ucore lab1 exercise3》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader进入保护模式的过程 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader.请分 ...

  3. react生成二维码

    图片实例: 简介: QRCode.js 是一个生成二维码的JS库.主要是通过获取 DOM 的节点,再通过 HTML5 Canvas 绘制而成,不依赖任何库. 用法: 1. 在项目中引入qrcode.m ...

  4. [官网]Postgresql 的客户端应用 pg_config

    pg_config Name pg_config -- 检索已安装版本的 PostgreSQL 的信息 Synopsis pg_config {--bindir | --includedir | -- ...

  5. SQL入门经典(第四版)学习记录——SQL语法(二)

    一.创建表 create table 表里包含什么类型的数据 表的名称是什么 主键 列的名称是什么 每一列的数据类型是什么 每一列的长度是多少 表里哪些列可以是空的 语法: create table ...

  6. pandas中的argsort

    直接通过例子看比较好理解. import pandas as pd data = [[1, 2, 3], [2, 2, 2], [7, 8, 9]] df = pd.DataFrame(data, i ...

  7. go语言基础学习网址

    go指南 http://tour.studygolang.com/welcome/1

  8. 1.ASP.NET Core Docker学习-Docker介绍与目录

    Docker的优点: 1节约时间,快速部署和启动 2节约成本 3标准化应用发布 4方便做持续集成 5可以用Docker做为集群中的轻量主机或节点 6方便构建基于SOA或者微服务架构 的系统 学习目录: ...

  9. APK反编译教程

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  10. hdu 4324

    思路待整理 #include<cstdio> #include<iostream> #include<vector> #include<queue> # ...