HTTP协与Apache服务的搭建

首先看一张图,在IOS七层模型与TCP/IP四层模型中,HTTP协议所处的位置一目了然,我们来从头开始了解HTTP协议的工作原理。
在这里插入图片描述
一个网站有以下几个指标来衡量:

  • IP(独立IP):即Internet Protocol,指独立IP数。一天内来自 相同客户机IP地址只计算一次,记录远程客户机IP地址的计 算机访问网站的次数,是衡量网站流量的重要指标
  • PV(访问量): 即Page View, 页面浏览量或点击量,用户每 次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV 与来访者的数量成正比,PV并不是页面的来访者数量,而是 网站被访问的页面数量
  • UV(独立访客):即Unique Visitor,访问网站的一台电脑为一 个访客。一天内相同的客户端只被计算一次。可以理解成访问 某网站的电脑的数量。网站判断来访电脑的身份是通过来访电 脑的cookies实现的。如果更换了IP后但不清除cookies,再访 问相同网站,该网站的统计中UV数是不变的
    网站统计:http://www.alexa.cn/rank.

一次完整的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
    示例:
    Host: www.yangyang.host 请求的主机名称
    Server: Apache/2.4.7
    HTTP常用请求方式(Method):
    GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

  • **4、访问资源:
    服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源
    资源放置于本地文件系统特定的路径:DocRoot
    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服务器会在日志文件中添加一 个条目,来描述已执行的事务

Apache 介绍

Apache原型是在20世纪90年代初,国家超级计算机应用中心NCSA开发
1995年开源社区发布apache(a patchy server)

  • ASF: apache software foundation

  • FSF:Free Software Foundation

  • 特性:

    • 高度模块化: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默认
    在这里插入图片描述

实验HTTP短链接
telnet 服务器IP 端口
GET /index.html HTTP/1.1
HOST:3.3.3.3 (随便写)

服务的配置文件
/etc/httpd/conf/httpd.conf
支持长连接 配置文件
KeepAlive ON

启动脚本的配置文件
/etc/sysconfig/httpd
去掉下行的注释
HTTPD=/usr/sbin/httpd.worker
开启worker模式

具体MPM工作模块设置在主配置文件里

<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

访问网页apache,主配置文件里定义的这样格式的文件
DirectoryIndex index.html index.html.var
主站点页面文件
当找不到上述格式的文件的时候
默认错误页面显示在这里显示
/etc/httpd/conf.d/welcome.conf
把这个文件改名就可以不再显示Apache宣传界面
而 index.html文件在
/var/www/error 目录下

站点访问控制常见机制

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

  • 文件系统路径:
<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"> 

中“基于源地址”实现访问控制
在主配置文件里添加

  • 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的其它指令都无法覆盖

    写完.htaccess文件之后还需要再配置文件中加入AllowOverride All
    例子:
<Directory /web/docs/spec> 
	AllowOverride All
</Directory> 
  • (3) 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

    例子
<Directory /web/docs/spec> 
	order deny,allow
	deny from 172.16.0.0/16
</Directory> 

这里的deny,allow的顺序非常重要

  • deny,allow的意思是没有被明确拒绝的都允许
    order deny,allow
    deny from 172.16.0.0/16

    除了172.16.0.0/16都允许

  • allow,deny的意思是没有被明确允许的都拒绝
    order allow,deny
    deny from 172.16.0.0/16
    所有都拒绝

  • order allow,deny
    deny from 172.16.0.0/16
    allow from 172.16.0.0/16

    172.16.0.0/16被允许,如果有冲突,以排在后面的基准,优先级高
    如下表:

    allow denydeny allow
    allow only允许允许
    deny only拒绝拒绝
    allow deny拒绝允许
    none拒绝允许

日志设定

日志类型:

  • 访问日志
  • 错误日志
    错误日志:
    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”的值;即发 出请求的应用程序

设定默认字符集

AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030

定义路径别名

格式: Alias /URL/ "/PATH/"

DocumentRoot "/www/htdocs" 
	http://www.yangyang.host/download/bash.rpm 
	==>/www/htdocs/download/bash.rpm 
Alias /download/ "/rpms/pub/" 
	http://www.yangyang.host/download/bash.rpm 
	==>/rpms/pub/bash.rpm 
	http://www.yangyang.host/images/logo.png 
	==>/www/htdocs/images/logo.png 

基于用户的访问控制

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

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

认证方式两种:
* basic:明文
* digest:消息摘要认证,兼容性差

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

用户的账号和密码
虚拟账号:仅用于访问某服务时用到的认证标识
存储:文本文件,SQL数据库,ldap目录存储,nis等

例子:

下载密码命令包
yum install httpd-tools

生成密码
htpasswd -cs /etc/httpd/conf.d/.httpusers yang

创建密码配置文件
vim /etc/httpd/conf.d/auth.conf

<Directory /var/www/html/secret>
        authtype basic
        authname "老哥,起来工作了!"
        authuserfile "/etc/httpd/conf.d/.httpuers"
        require user yang
</Directory>

重新启动httpd服务器

或者在 /var/www/html/secre下创建.htaccess文件
把/etc/httpd/conf.d/auth.conf文件复制到 /var/www/html/secre下
修改为

 authtype basic
        authname "老哥,起来工作了!"
        authuserfile "/etc/httpd/conf.d/.httpuers"

修改/etc/httpd/conf.d/auth.conf文件

<Directory /var/www/html/secret>
        allowoverride authconfig
</Directory>

密码组

vim /etc/httpd/conf.d/.httpgroups
admin: user1 user2

修改配置文件
vim /var/www/html/secre/.htaccess

  	authtype basic
    authname "老哥,起来工作了!"
    authuserfile "/etc/httpd/conf.d/.httpuers"
  	authgroupfile “/etc/httpd/conf.d/.httpgroups”
	require group admin

修改/etc/httpd/conf.d/auth.conf文件

<Directory /var/www/html/secret>
        allowoverride authconfig
</Directory>

重新启动服务器

远程客户端和用户验证的控制
Satisfy ALL|Any
ALL 客户机IP和用户验证都需要通过才可以
Any客户机IP和用户验证,有一个满足即可

示例:
Require valid-user
Order allow,deny
Allow from 192.168.1
Satisfy Any

实现用户家目录的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 – yang;mkdir ~/public_html
setfacl –m u:apache:x ~student
访问 http://localhost/~yang/index.html

ServerSignature On | Off | EMail

当客户请求的网页并不存在时,服务器将产生错误文档,缺省 情况下由于打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息,如果不对外显示这些信息,就可以将这个参数设置为Off
设置为Email,将显示ServerAdmin 的Email提示

ServerType inetd | standalone.

standalone 独立服务模式
inetd 非独立服务模式
只适用于Unix平台

status页面

LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 172.16
</Location>
ExtendedStatus On 显示扩展信息

虚拟主机

站点标识: socket
虚拟主机有三种构建方法:

  • IP相同,但端口不同
  • IP不同,但端口均为默认端口
  • FQDN不同:
    请求报文中首部
    Host: www.yangyang.host

有三种实现方案:

  • 基于ip:为每个虚拟主机准备至少一个ip地址

  • 基于port:为每个虚拟主机使用至少一个独立的port

  • 基于FQDN:为每个虚拟主机使用至少一个FQDN
    注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机
    禁用方法:注释中心主机的DocumentRoot指令即可

    虚拟主机的配置方法:

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

建议:上述配置存放在独立的配置文件中
其它可用指令:
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog: 错误日志
CustomLog:访问日志
<Directory “/path"> </Directory>
Alias

基于IP的虚拟主机示例:
创建/etc/httpd/conf.d/vhost.conf文件
vim /etc/httpd/conf.d/vhost.conf

<virtualhost 192.168.1.39:80>
       	documentroot /var/www/html
      	ErrorLog logs/html1-error_log
      	CustomLog logs/html1-error_log common
</virtualhost>

<VirtualHost 192.168.1.50:80>
		    DocumentRoot /var/www/html2
 		   ErrorLog logs/html2-error_log
 		   CustomLog logs/html2-error_log common
</VirtualHost>

<VirtualHost 192.168.1.100:80>
		    DocumentRoot /var/www/html3
 		   ErrorLog logs/html3-error_log
 		   CustomLog logs/html3-error_log common
</VirtualHost>

基于端口的虚拟主机:可和基于IP的虚拟主机混和使用

		Listen 8001
		Listen 8002
		Listen 8003

		<virtualhost *:8001>
 		       documentroot /var/www/html
   		     ErrorLog logs/html1-error_log
   		     CustomLog logs/html1-error_log common
		</virtualhost>

		<VirtualHost *:8002>
  			  DocumentRoot /var/www/html2
  			  ErrorLog logs/html2-error_log
 			   CustomLog logs/html2-error_log common
		</VirtualHost>

		<VirtualHost *:8003>
			    DocumentRoot /var/www/html3
			    ErrorLog logs/html3-error_log
			    CustomLog logs/html3-error_log common
		</VirtualHost>

基于FQDN的虚拟主机:

NameVirtualHost *:80
<virtualhost *:80>
        servername www.a.com
        documentroot /var/www/html
        ErrorLog logs/html1-error_log
	serveralias www.cc.com
	serveralias www.ccc.com
        CustomLog logs/html1-error_log common
</virtualhost>

<VirtualHost *:80>
        servername www.b.com
        DocumentRoot /var/www/html2
        ErrorLog logs/html2-error_log
        CustomLog logs/html2-error_log common
</VirtualHost>

<VirtualHost *:80>
        servername www.c.com
        DocumentRoot /var/www/html3
        ErrorLog logs/html3-error_log
        CustomLog logs/html3-error_log common
</VirtualHost>

serveralias www.cc.com 为常用别名跳转

HTTP的报文结构

在这里插入图片描述
telnet www.baidu.com
telnet 服务器IP 端口
GET /index.html HTTP/1.1
HOST:3.3.3.3 (随便写)
回车

这便是模拟HTTP的请求报文
在这里插入图片描述

http协议状态码分类

status(状态码):

  • 1xx:100-101 信息提示
  • 2xx:200-206 成功
  • 3xx:300-305 重定向
  • 4xx:400-415 错误类信息,客户端错误
  • 5xx:500-505 错误类信息,服务器端错误

200: 成功,请求数据通过响应报文的entity-body部分发送;OK

301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部 Location指明了资源现在所处的新位置;Moved Permanently

302: 响应报文Location指明资源临时新位置 Moved Temporarily

304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变, 则通过响应此响应状态码通知客户端;Not Modified

401: 需要输入账号和密码认证方能访问资源;Unauthorized

403: 请求被禁止;Forbidden

404: 服务器无法找到客户端请求的资源;Not Found

500: 服务器内部错误;Internal Server Error

502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网 关;Bad Gateway

503 – 服务不可用,临时服务器维护或过载,服务器无法处理请求

504 – 网关超时

curl工具

curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持 HTTP的POST、PUT等方法, FTP上传, kerberos认证, HTTP上传,代理服务器,cookies,用户名/密码认证, 下载文 件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling),还支持IPv6,socks5代理服务器,通过http代理 服务器上传文件到FTP服务器等,功能十分强大
curl [options] [URL…]
-A/–user-agent 设置用户代理发送给服务器
-e/–referer 来源网址
–cacert CA证书 (SSL)
-k/–insecure 允许忽略证书进行 SSL 连接
–compressed 要求返回是压缩的格式
-H/–header 自定义首部信息传递给服务器
-i 显示页面内容,包括报文首部信息
-I/–head 只显示响应报文首部信息
-D/–dump-header 将url的header信息存放在指定文件中
–basic 使用HTTP基本认证
-u/–user <user[:password]>设置服务器的用户和密码
-L 如果有3xx响应码,重新发请求到新位置
-O 使用URL中默认的文件名保存文件到本地
-o 将网络文件保存为指定的文件中
–limit-rate 设置传输速度
-0/–http1.0 数字0,使用HTTP 1.0
-v/–verbose 更详细
-C - 选项可对文件使用断点续传功能
-c/–cookie-jar 将url中cookie存放在指定文件中
-x/–proxy <proxyhost[:port]> 指定代理服务器地址 -X/–request 向服务器发送指定请求方法
-U/–proxy-user user:password 代理服务器用户和密码
-T 选项可将指定的本地文件上传到FTP服务器上
–data/-d 方式指定使用POST方式传递数据
-b name=data 从服务器响应set-cookie得到值,返回给服务器

openssl s_client -connect www.yangyang.host:443 代替telnet连接

elinks工具:
elinks [OPTION]… [URL]…
-dump: 非交互式模式,将URL的内容输出至标准输出
-source:打印源码

mod_deflate模块

使用mod_deflate模块压缩页面优化传输速度
适用场景:

  • (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)
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

https:http over ssl

SSL会话的简化过程

  • (1) 客户端发送可供选择的加密方式,并向服务器请求证书
  • (2) 服务器端发送证书以及选定的加密方式给客户端
  • (3) 客户端取得证书并进行证书验证
    如果信任给其发证书的CA
    • (a) 验证证书来源的合法性;用CA的公钥解密证书上数字签名
    • (b) 验证证书的内容的合法性:完整性验证
    • (c) 检查证书的有效期限
    • (d) 检查证书是否被吊销
    • (e) 证书中拥有者的名字,与访问的目标主机要一致
  • (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密 此数据发送给服务器,完成密钥交换
  • (5) 服务用此密钥加密用户请求的资源,响应给客户端
    注意:SSL是基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机

搭建步骤:
(1) 为服务器申请数字证书
测试:通过私建CA发证书

  • (a) 创建私有CA
  • (b) 在服务器创建证书签署请求
  • (c) CA签证

(2) 配置httpd支持使用ssl,及使用的证书
yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile

(3) 测试基于https访问相应的主机
openssl s_client [-connect host:port] [-cert filename] [- CApath directory] [-CAfile filename]

HTTPS 实现

下载ssl模块
yum install mod_ssl

创建放证书的路径:
mkdir /etc/httpd/conf.d/ssl

进行证书申请,自己搭建根CA
配置文件vim /etc/pki/tls/openssl.cnf

1。建立Root CA
生成私钥
(umask 066;openssl genrsa -out private/cakey.pem 4096 )
自签名证书
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
查看自签名认证证书
openssl x509 -in cacert.pem -noout -text

2。用户或服务器
cd /etc/httpd/conf.d/ssl
生成私钥
(umask 066;openssl genrsa -out app.key 1024)
生成证书申请文件
openssl req -new -key app.key -out app.csr
将申请文件发给CA
scp app.csr root@192.168.1.19:/etc/pki/CA

3。CA颁发证书
touch index.txt
echo 0F > serial
openssl ca -in app.csr -out certs/app.crt -days 100
发给申请方
scp certs/app.crt 192.168.1.39:/etc/httpd/conf.d/ssl/

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

修改下面三项

<VirtualHost _default_:443>
SSLCertificateFile /etc/httpd/conf.d/ssl/app.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/app.key

这里的路径是放的证书位置

接着把CA证书也得复制过来
scp cacert.pem 192.168.1.39:/etc/httpd/conf.d/ssl

修改配置文件
vim /etc/httpd/conf.d/ssl.conf
SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem
把这一行修改成CA证书存放的位置(127行)

重启服务

接着把证书导出来添加到系统里面,使系统接受信任,
Mac和WIndows各有不同,自行百度
记得把hosts文件修改DNS指向
192.168.1.39 www.yangyang.host

接着使用https://www.yangyang.host就可以访问到了
在颁发CA到时候最重要的就是观察系统时间
如果时间不标准 CA证书会无效过期,还是不能使用

openssl s_client -connect www.yangyang.host:443 代替telnet连接
证书连接https

将http请求转发至https的URL

重定向
Redirect [status] 原本路径 跳转路径

status状态:

  • 永久跳转
    Permanent:Returns a permanent redirect status (301) indicating that the resource has moved permanently
  • 临时跳转
    Temp:Returns a temporary redirect status (302). This is the default

示例:
Redirect temp / https://www.yangyang.host/

生效需要在/etc/httpd/conf/httpd.conf
或者/etc/httpd/conf.d/下创建.conf文件
并且加入跳转语句
redirect temp / www.baidu.com

跳转到https
需要使用模块rewrite_module
使用httpd -M | grep rewrite命令来查询
修改配置文件
vim /etc/httpd/conf/httpd.conf

<Directory />
	RewriteEngine on
	RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302] 
<Directory>

需要记住,这里必须是在网站的配置文件的标签内,否则不生效

HSTS:HTTP Strict Transport Security

服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带 HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部 做307跳转到HTTPS。而无需任何网络过程
HSTS preload list

是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用 Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、 Edge浏览器也会采用这个列表

实现HSTS示例:

vim /etc/httpd/conf/httpd.conf

<Directory />
	Header always set Strict-Transport-Security "max- age=31536000" 
	RewriteEngine on
	RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302] 
<Directory>

max- age=31536000的默认时间是秒

压力测试
ab [OPTIONS] URL
来自httpd-tools包
-n:总请求数
-c:模拟的并行数
-k:以持久连接模式测试
如果并行输太大太多的请求,可以使用以下命令来调高系统局限性
ulimit –n # 调整能打开的文件数

httpd-2.4

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

httpd-2.4
重新设置主站目录,不仅需要修改
DocumentRoot 选项,还得单独加权限,如下例:

DocumentRoot "/app/website"
<Directory /app/website>
        Require all granted
</Directory>

配置应用:

  • (1) 切换使用的MPM
    Centos 7:/etc/httpd/conf.modules.d/00-mpm.conf
    启用要启用的MPM相关的LoadModule指令即可
    centos6编译安装:
    vim /etc/httpd24/httpd.conf
    Include /etc/httpd24/extra/httpd-mpm.conf
    LoadModule mpm_event_module
    modules/mod_mpm_event.so
  • (2)主目录: DocumentRoot /path
  • (3) 基于IP的访问控制:
    无明确授权的目录,默认拒绝
    允许所有主机访问: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:指定域名下的所有主机

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

<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> 
  • (4) 虚拟主机
    基于FQDN的虚拟主机不再需要NameVirutalHost指令
<VirtualHost *:80> 
		ServerName www.b.net 
		DocumentRoot "/apps/b.net/htdocs" 
		<Directory "/apps/b.net/htdocs"> 
			Options None 
			AllowOverride None 
			Require all granted 
		</Directory> 
	</VirtualHost> 

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

  • (5) ssl:安装mod_ssl,和httpd-2.2相同配置
  • (6) KeepAlive on 持久连接
    KeepAliveTimeout #ms 默认以毫秒为单位
    MaxKeepAliveRequests 100 毫秒级持久连接时长定义
    在配置文件
    vim /usr/share/doc/httpd-2.4.6/httpd-default.conf

Sendfile机制

不用 sendfile 的传统网络传输过程:
read(file, tmp_buf, len)
write(socket, tmp_buf, len)

硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈

一般网络应用通过读硬盘数据,写数据到 socket 来完成网络传输,底层执行过程:

  • 1 系统调用 read() 产生一个上下文切换:从 user mode 切换到 kernel mode, 然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。

  • 2 数据从 kernel buffer 拷贝到 user buffer,然后系统调用 read() 返回,这时 又产生一个上下文切换:从kernel mode 切换到 user mode

  • 3 系统调用 write() 产生一个上下文切换:从 user mode 切换到 kernel mode, 然后把步骤2读到 user buffer 的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer和 socket 相关联。

  • 4 系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 user mode(第4次切换),然后DMA从 kernel buffer 拷贝数据到协议栈(第4次拷贝)

    上面4个步骤有4次上下文切换,有4次拷贝,如果能减少切换次数和拷贝次数将会 有效提升性能

在kernel 2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数
用 sendfile() 来进行网络传输的过程:

  • sendfile(socket, file, len);
  • 硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈
    • 1 系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关 的 kernel buffer。这里没有 user mode 和 kernel mode 之间的 切换,在 kernel 中直接完成了从一个 buffer 到另一个 buffer 的拷贝。
    • 2 DMA 把数据从 kernel buffer 直接拷贝给协议栈,没有切换, 也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里

反向代理功能

启用反向代理
ProxyPass “/” “http://www.example.com/”
ProxyPassReverse “/” "http://www.example.com/"

特定URL反向代理
ProxyPass “/images” “http://www.example.com/”
ProxyPassReverse “/images” http://www.example.com/

示例:

<VirtualHost *> 
	ServerName www.yangyang.host
	ProxyPass / http://localhost:8080/ 
	ProxyPassReverse / http://localhost:8080/ 
</VirtualHost> 

在centos6编译安装httpd-2.4 方法一

安装httpd-2.4
依赖于apr-1.4+, apr-util-1.4+, [apr-iconv]
apr: apache portable runtime,解决跨平台实现(虚拟接口)

CentOS 6:默认:apr-1.3.9, apr-util-1.3.9

安装前准备开发包:
开发环境包组:
安装Development Tools
yum groupinstall “development tools” -y
yum install -y libxml2-devel

Server 相关包:
pcre-devel,
openssl-devel
expat-devel
libxml2-devel

下载源代码并解压缩:
httpd-2.4.27.tar.bz2
apr-1.6.2.tar.bz2
apr-util-1.6.0.tar.bz2

安装apr-1.7+
wget wget https://downloads.apache.org//apr/apr-1.7.0.tar.bz2

tar -xvf apr-1.7.0.tar.bz2
cd apr-1.7.2
./configure --prefix=/app/apr
make && make install

安装apr-util-1.6+
yum install openssl-devel pcre-devel expat-devel -y
wget https://downloads.apache.org//apr/apr-util-1.6.1.tar.bz2
tar -xvf apr-util-1.6.1.tar.bz2
cd …/apr-util-1.6.0
./configure --prefix=/app/apr-utils --with-apr=/app/apr/
make && make install

编译安装httpd-2.4
cd …/httpd-2.4.27
./configure --prefix=/app/httpd24
–enable-so
–enable-ssl
–enable-cgi
–enable-rewrite
–with-zlib
–with-pcre
–with-apr=/app/apr/
–with-apr-util=/app/apr-utils
–enable-modules=most
–enable-mpms-shared=all
–with-mpm=prefork
make && make install

安装好后进入目录
cd /app/httpd24/

添加到PATH变量
echo ‘PATH=/app/httpd24/bin/:$PATH’ > /etc/profile.d/httpd24.sh
. /etc/profile.d/httpd24.sh

添加系统用户
useradd -r -s /sbin/nologin apache

修改配置文件
vim /app/httpd24/conf/httpd.conf

修改这两项
User apache
Group apache

保存启动
apachectl start

准备脚本需要文件夹
mkdir /var/lock/subsys/

写启动脚本

#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: The Apache HTTP Server is an efficient and extensible  \
#	       server implementing the current HTTP standards.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd/httpd.pid
#
### BEGIN INIT INFO
# Provides: httpd
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: distcache
# Short-Description: start and stop Apache HTTP Server
# Description: The Apache HTTP Server is an extensible server
#  implementing the current HTTP standards.
### END INIT INFO

. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi

HTTPD_LANG=${HTTPD_LANG-"C"}

INITLOG_ARGS=""

apachectl=/app/httpd24/bin/apachectl
httpd=${HTTPD-/app/httpd24/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/app/httpd24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}



start() {
        echo -n $"Starting $prog: "
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

stop() {
	status -p ${pidfile} $httpd > /dev/null
	if [[ $? = 0 ]]; then
		echo -n $"Stopping $prog: "
		killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
	else
		echo -n $"Stopping $prog: "
		success
	fi
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
        RETVAL=6
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        LSB=1 killproc -p ${pidfile} $httpd -HUP
        RETVAL=$?
        if [ $RETVAL -eq 7 ]; then
            failure $"httpd shutdown"
        fi
    fi
    echo
}

case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  status)
        status -p ${pidfile} $httpd
	RETVAL=$?
	;;
  restart)
	stop
	start
	;;
  condrestart|try-restart)
	if status -p ${pidfile} $httpd >&/dev/null; then
		stop
		start
	fi
	;;
  force-reload|reload)
        reload
	;;
  graceful|help|configtest|fullstatus)
	$apachectl $@
	RETVAL=$?
	;;
  *)
	echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
	RETVAL=2
esac

exit $RETVAL

把这个脚本移动到/etc/init.d/目录下
mv 脚本路径 /etc/init.d/httpd24

加入chkconfig
chkconfig --add httpd24

设为开机启动
chkconfig httpd24 on

到此安装完成

在centos6编译安装httpd-2.4 方法二

安装需要的工具包
yum groupinstall “development tools” -y
yum install -y libxml2-devel
yum install openssl-devel pcre-devel expat-devel -y

下载apr,apr-util,httpd源码,并且解压缩
wget wget https://downloads.apache.org//apr/apr-1.7.0.tar.bz2
tar -xvf apr-1.7.0.tar.bz2
wget https://downloads.apache.org//apr/apr-util-1.6.1.tar.bz2
tar -xvf apr-util-1.6.1.tar.bz2
wget https://downloads.apache.org//httpd/httpd-2.4.43.tar.bz2
tar -xvf httpd-2.4.43.tar.bz2

开始编译
cp -r /root/apr-1.7.0/ /root/httpd-2.4.43/srclib/apr
cp -r /root/apr-util-1.6.1/ /root/httpd-2.4.43/srclib/apr-util
cd httpd-2.4.43/
./configure --prefix=/app/httpd24
–enable-so
–enable-ssl
–enable-cgi
–enable-rewrite
–with-zlib
–with-pcre
–with-included-apr
–enable-modules=most
–enable-mpms-shared=all
–with-mpm=prefork
make && make install
Httpd编译过程:/app/httpd24/build/config.nice
自带的服务控制脚本:/app/httpd24/bin/apachectl

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值