Linux基础教程之HTTP相关配置解读

一次完整的HTTP请求处理过程:
1、建立连接:接收或拒绝链接请求
2、接受请求:接收客户端请求报文中对某资源的一次请求的过程
Web访问响应模型(Web I/O)
单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请
求被串行响应;
多进程I/O模型:并行启动多个进程,每个进程响应一个链接请求;
复用I/O结构:启动一个进程,同时响应N个链接请求;
实现方法:多线程模型和事件驱动;
多线程模型:一个进程生成N个线程,每线程响应一个连接请求;
事件驱动:一个进程处理N个请求。
复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收
M*N个请求。
 

3、处理请求:

服务器对请求报文进行解析,并获取请求的资源及请求方法

等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
元数据:请求报文首部
<method> <URL> <VERSION>
HEADERS 格式 name:value
<request body>
示例:
Host : www.magedu.com 请求的主机名称
Server: Apache/2.4.7
HTTP常用请求方式,Method GET、POST、HEAD、PUT、DELETE、

TRACE、OPTIONS

4、访问资源:
服务器获取请求报文中请求的资源web服务器,即存放了 web资源的服
务器,负责向请求者提供对方请求的静态资源,或 动态运行后生成的资
源 。
资源放置于本地文件系统特定的路径:
DocRoot –> /var/www/html
/var/www/html/images/logo.jpg
http://www.magedu.com/images/logo.jpg
web服务器资源路径映射方式:
(a) docroot
(b) alias
(c) 虚拟主机docroot
(d) 用户家目录docroot
 
5、构建响应报文:
一旦Web服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体。
1)响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括: 描述了响应主体MIME类型的Content-Type首部描述了响应主体长度的Content-Length 实际报文的主体内容
2)URL重定向:web服务构建的响应并非客户端请求的资源 ,而是资源另外一个访问路径:
永久重定向:http://www.360buy.com
临时重定向:http://www.taobao.com
3)MIME类型:
Web服务器要负责确定响应主体的MIME类型。有很多配置服务器的方法可以将MIME类型与资源管理起来 ;
魔法分类:Apache web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名的时候;
显式分类:可以对Web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型。
类型协商: 有些Web服务器经过配置,可以以多种文档格 式来存储资源。在这种情况下,可以配置Web服务器,使其可 以通过与用户的协商来决定使用哪种格式(及相关的MIME类型 )”最好”

6、发送响应报文

Web服务器通过连接发送数据时也会面临与接收数据一 样的问题。服务器可能有很多条到各个客户端的连接,有些是空 闲的,有些在向服务器发送数据,还有一些在向客户端回送响应 数据。服务器要记录连接的状态,还要特别注意对持久连接的处 理。对非持久连接而言,服务器应该在发送了整条报文之后,关 闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状 态,在这种情况下,服务器要正确地计算Content-Length首部 ,不然客户端就无法知道响应什么时候结束了

7、记录日志 

最后,当事务结束时,Web服务器会在日志文件中添加 一个条目,来描述已执行的事务

 
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默认
 
HTTPD安装
版本:centos6:2.2
centos7:2.4
安装方式:
rpm:centos发行版,稳定,建议使用
编译:定制或特殊需求
Centos 6程序环境:httpd-2.2
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
检查配置语法:

            httpd -t

            service httpd configtest

      进行语法检测时,会报错,虽然没有影响,但是也不好看;解决方法:

            方法一:

                       

方法二: vim /etc/hosts  进行本地地址解析

     

服务脚本:/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/run/httpd/httpd.pid
日志文件目录:
/var/log/httpd
access_log: 访问日志
error_log:错误 日志

帮助文档包:

            httpd-manual

      如果上不了网时,可以手动安装文档包,进行查看

Httpd 2.2常见配置
模块文件路径:
/usr/lib64/httpd/modules
httpd配置文件的组成:
# grep “Section” /etc/httpd/conf/httpd.conf 主配置文件
### Section 1: Global Environment 全局环境匹配
### Section 2: ‘Main’ server configuration 主服务的的配置
### Section 3: Virtual Hosts 虚拟主机配置

配置格式:

directive + value 指令 + 值

directive: 不区分字符大小写

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

下面先介绍一个小实验,再介绍HTTPD的基本配置:

  

在客户端机器连接服务器时,显示出Apache版本信息,不安全。

       编辑HTTPD主配置文件,加上下面一行就可以了

      #vim /etc/httpd/conf/httpd.conf

       ServerTokens productonly(可以简写prod)

          service restart httpd

 

HTTPD基本配置及用法:

1、切换工作模式:
vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
2、修改监听的IP和Port
Listen [IP:]PORT

(1) 省略IP表示为0.0.0.0;表示监听本机所有IP;
(2) Listen指令可重复出现多次
Listen 80
Listen 8080
(3) 修改监听socket,重启服务进程方可生效
4、MPM( Multi-Processing Module)多路处理模块 :
prefork, worker, event(试验阶段)

httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,

分别用于实现对不同MPM机制的支持

确认方法:
ps aux | grep httpd
默认为/usr/sbin/httpd, 即prefork模式
查看静态编译的模块 :httpd -l
查看静态编译及动态装载的模块 :httpd –M
动态模块加载:不需重启即生效
动态模块路径 :/usr/lib64/httpd/modules/
更换使用的httpd程序:
vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
重启服务生效
httpd.worker -l 查看
pstree -p |grep httpd 查看进程和线程
测试:yum install httpd-tools
ab -c 1000 -n 10000 http://192.168.164.129/
 
 

prefork的默认配置:

<IfModule prefork.c>
StartServers 8 开机启动时,默认开启8个进程
MinSpareServers 5 最小空闲进程
MaxSpareServers 20 最大空闲进程
ServerLimit 256 最多进程数,最大20000
MaxClients 256 最大并发

MaxRequestsPerChild 4000 子进程最多能处理的请求 数量。在处理MaxRequestsPerChild 个请求之后,

子进程将 会被父进程终止,这时候子进程占用的内存就会释放(为0时 永远不释放)

</IfModule>
 
worker的默认配置:
<IfModule worker.c>
StartServers 4 开机启动时,默认开启4个进程
MaxClients 300 最大支持多少客户端并发访问
MinSpareThreads 25 最小的空闲线程
MaxSpareThreads 75 最大的空闲线程
ThreadsPerChild 25 每个子进程生成的线程数量
MaxRequestsPerChild 0 无限制
</IfModule>
5、DSO: Dynamic Shared Object 动态共享对象
加载动态模块配置:
/etc/httpd/conf/httpd.conf
配置指令实现模块加载格式:
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:
相对于ServerRoot(默认/etc/httpd)指向的路径而言:
/etc/httpd/modules/

示例:要使用某个某块,需按照下面格式,加载到主配置文件里即可:

   LoadModule auth_basic_module modules/mod_auth_basic.so

6、定义’Main’ server的文档页面路径 :
DocumentRoot “/path” 网站主页目录
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置

下面先介绍一下,什么是URL:

URL组成
<scheme>://<user>:<password>@<host>:<port>/<path>;<params> ?<query>#<frag>
schame:方案,访问服务器以获取资源时要使用哪种协议
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名或IP地址
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
params:参数,某些方案用这个组件来指定输入的参数,参数为名/值对,
URL中可多含多个参数,用;分隔 .
query:查询,某些方案会用这个组件传递参数以激活程序,如数据库,用
?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔

好了,通过以上已经了解了什么事URL了,下面介绍怎么设置主页等相关操作:

实验:更改HTTPD主页;实验环境在centos6.9主机上搭建的HTTPD服务,

          (主机IP:192.168.164.129)

        首先自定义一个主页目录以及文件:

#vim /etc/httpd/conf/httpd.conf
DocumentRoot “/app/website1”
#service httpd reload

访问测试:

         如果以上自定义的主页文件不存在时,会出现以下情景:

默认情况下,会在/var/www/html目录下找index.html这个主页文件,如果找不到,则显示下图主页。
DirectoryIndex index.html index.html.var
Include conf.d/*.conf
下图主页文件:/etc/httpd/conf.d/welcome.conf

  如果welcome.conf这个文件也找不到,会出现下图的情景:

 cd /etc/httpd/conf.d

         mv welcome.conf welcome.conf.bak

如果把主配置文件里的主页目录再改回去,

cd /var/www/html/
mv index.html b.html

下图把主页目录下的文件都列出来了,不安全
vim /etc/httpd/conf/httpd.conf
Option -Indexes FollowSymLinks
service httpd reload
 

下图中,再次访问网站时,主目录下的文件就显示不了,变得安全点。

注意:SELinux和iptables的状态
7、站点访问控制常见机制
可基于两种类型的路径指明对哪些资源进行何种访问控制
访问控制机制有两种:客户端来源地址,用户账号
文件系统路径:
<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 Includes FollowSymLinks
SymLinksifOwnerMatch ExecCGI MultiViews
常见选项:
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源
文件时,返回索引列表给用户 。没写时默认是不开启的。

 
FollowSymLinks:允许访问主页目录下的符号链接文件所指向的源文
件 ;没写时默认是开启的。
None:全部禁用
All: 全部允许

(2) AllowOverride

与访问控制相关的哪些指令可以放在指定目录下的 .htaccess(由
AccessFileName指定)文件中,覆盖之前的配置指令
只对<directory>语句有效
AllowOverride All: 所有指令都有效
AllowOverride None: .htaccess 文件里定义的策略无效
AllowOverride AuthConfig Indexes 除了AuthConfig 和
Indexes的其它指令都无法覆盖

  示例:实现AllowOverride ,基于指定目录.htaccess,以及FollowSymlinks的用法

         # vim /etc/httpd/conf/httpd.conf

 

touch /app/website1/.htaccess

  访问测试,访问软链接,直接指向源文件的内容。

 
 
 
 
 
(3)基于来源地址的访问控制机制
Order:定义生效次序;写在最后面的表示默认法则
Order allow,deny    :默认拒绝
Order deny,allow    :默认允许

Allow from 

 Deny from

来源地址:IP
NetAddr: 172.16
172.16.0.0

172.16.0.0/16

具体用法:下图中定义了order allow,deny先允许,后拒绝;根据法则后定义的生效

    #curl  http://192.168.164.29   是被拒绝访问的

     

8、定义默认主页面
DirectoryIndex index.html inex.html.var
9、日志设定
日志类型:
访问日志 错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn 定义日志级别,默认值warn
loglevel 可选值: debug, info, notice, warn,error crit, alert, emerg
访问日志: /var/log/httpd/access_log
定义日志格式: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”的值;即 发出请求的应
用程序
 
 
10、定义路径别名
格式: 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

注意:以上红色字体标识,是一一对应的,注意/路径和别名的区分。

 
11、设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
 
12、基于用户的访问控制
认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
认证法式两种:
basic:明文–不安全,可以基于https访问
digest:消息摘要认证,兼容性差
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,
以便告知用户认证的原因
用户的账号和密码
虚拟账号:仅用于访问某服务时用到的认证标识
存储:文本文件,SQL数据库,ldap目录存储,nis等
 
basic认证配置示例:
(1) 定义安全域
<Directory “/path”>
Options None
AllowOverride None 是否允许验证.htaccess文件
AuthType Basic 认证类型
AuthName “String” 管理目录提示语句
AuthUserFile “/PATH/HTTPD_USER_PASSWD_FILE”
验证配置文件
Require user username1 username2 …
指定用户
</Directory>
允许账号文件中的所有用户登录访问: Require valid-user
(2) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd命令来源于httpd-tools包
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
-c:自动创建文件,仅应该在文件不存在时使用
-m:md5格式加密
-s:sha格式加密
-D:删除指定用户
 

实验:基于用户账号密码认证的访问控制;

实验环境在centos6.9上搭建httpd服务,(192.168.8.128)

基于安全考虑可以设置严格的权限:
chmod 600 /etc/httpd/conf.d/.husers
setfacl -m u:apache:r /etc/httpd/conf.d/.husers
针对主页目录进行配置:

也可以定义在.htaccess文件里:

vim /etc/httpd/conf/httpd.conf

# cd /app/website1/admin
vim .htaccess

基于组账号进行认证
(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 …

实验:基于用户组的安全认证,在上个实验基础上实现

 
1、创建组文件
#vim /etc/httpd/conf.d/.htgroups
g1:httpuser1 httpuser2
g2:httpuser3
2、定义安全域
cd /app/website1/admin
vim .htaccess

字符浏览器测试:在另一台机器上测试
links 192.168.8.128/admin
远程客户端和用户验证的控制
Satisfy ALL|Any
ALL 客户机IP和用户验证都需要通过才可以
Any客户机IP和用户验证,有一个满足即可

示例: 

Require valid-user

Order allow,deny
Allow from 192.168.1
Satisfy Any
14、虚拟主机
站点标识: socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同;
请求报文中首部
Host: www.magedu.com
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址 ;
基于port:为每个虚拟主机使用至少一个独立的port;
基于FQDN:为每个虚拟主机使用至少一个FQDN
注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机, 一般
先禁用main主机
禁用方法:注释中心主机的DocumentRoot指令即可
虚拟主机的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot “/path”
</VirtualHost>
建议:上述配置存放在独立的配置文件中
其它可用指令:
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog: 错误日志
CustomLog:访问日志
<Directory “/path”> </Directory>
Alias
 
实验1:基于IP的虚拟主机
a、准备环境,创建多个主页文件,并为网卡配置多个IP地址
          ip addr add 192.168.8.130/24 dev eth0 label eth0:1

b、虚拟主机配置文件设置:
cd /etc/httpd/conf.d
vim vhosts.conf

c、在另一台客户端机器上进行验证
2、基于端口的虚拟主机:

3、基于FQDN的虚拟主机

15、status页面
帮助我们实现http服务器的一些功能状态的查看,以页面的方式查看他的工作情况:进程编号,负载状态。
vim /etc/httpd/conf/httpd.conf
LoadModule status_module modules/mod_status.so

要想实现status功能,模块必须加载。

可以在虚拟机设置里面定义,也可以单独定义在conf.d目录下。

<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 172.16
</Location>
ExtendedStatus On 显示扩展信息

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、网络安全、云原生、Go、Python开发专业人才培训机构!