运维架构之httpd

Web Service

传输层:提供进程地址

Port number

tcp:传输控制协议,面向连接,通信前需建立虚拟链路,结束后拆除;0-65535

udp:用户数据报协议,无连接;0-65535

IANA

0-1023:众所周知,永久分配给固定应用使用;22/tcp(ssh)、80/tcp(http)、443/tcp(https)

1024-41951:注册端口,分配给程序员注册为某服务使用;11211/udp、tcp(memcached)、3306/tcp(mysql)

41952+:客户端程序随机使用的端口;动态端口、私有端口;其范围定义:/proc/sys/net/ipv4/ip_local_port_range

Socket:IPC的一种实现,允许位于不同主机(甚至同一主机)上的不同进程之间进行通信;数据交换;Socket API

SOCK_STREAM:tcp套接字

SOCK_DGRAM:udp套接字

SOCK_RAM:裸套接字

TCP协议的特性

建立连接,三次握手

将数据打包成段,校验和(CRC-32)

确认、重传、超时

排序、逻辑序号

流量控制,滑动窗口算法

拥塞控制:慢启动,拥塞避免算法

Socket Domain(根据其所使用的地址)

AF_INET:Address Family,IPv4

AF_INET6:IPv6

AF_UNIX:同一主机上不同进程通信时使用

每类套接字都至少提供了两种Socket,流、数据报

流:可靠地传递,面向连接,无边界

数据报:不可靠地传递,有边界

套接字相关的系统调用

socket():创建一个套接字

bind():绑定

listen():监听

accept():接收请求

connect():请求连接建立

write():发送数据

read():接收数据

send()、recv()、sendto()、recvfrom()

http:hyper text transfer protocol

html:编程语言,超文本标记语言

CSS:Cascading Style Sheet

js:javascript

MIME:Multipurpose Internet Mail Extension

工作机制

http请求

http响应

Web资源,web resource

静态文件:jpg、gif、html、txt、js、css、mp3、avi

动态文件:php、jsp

媒体

媒体类型(MIME类型):major/minor

text/html

text/plain

image/jpeg

image/gif

URI:Uniform Resource Identifier

URL:Uniform Resource Locator,用于描述某服务器上某特定资源的位置

Scheme://Server:Port/path/to/resource

URN:Uniform Resource Naming

http协议版本

HTTP/0.9:原型版本,功能简陋

HTTP/1.0:第一个广泛使用的版本,支持MIME

HTTP/1.1:增强了缓存功能

HTTP/2.0:

一次完整的http请求过程

  1. 建立或处理连接,接收请求或拒绝请求
  2. 接收请求

    接收来自于网络的请求报文中对某资源的一次请求的过程

    并发访问响应模型(Web I/O)

    单进程I/O结构:只启动一个进程处理用户请求,且一次只处理一个,多个请求串行响应

    多进程I/O结构:并行启动多个进程,每个进程响应一个请求

    复用I/O结构:一个进程响应多个请求

    多线程模型:一个进程生成多个线程,每个线程响应一个用户请求

    事件驱动:event-driven

    复用的多进程I/O结构:启动多个进程,每个进程响应多个请求

  3. 处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息

    元数据:请求数据首部

    <method><URL><VERSION>

    Host:请求的主机名称

    Connection

  4. 访问资源:获取请求报文中请求的资源

    web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放置于本地文件系统某路径下,称为DocRoot

    web服务器资源路径映射方式

    docroot

    alias

    虚拟主机docroot

    用户家目录docroot

  5. 构建响应报文

    资源的MIME类型

    显式分类

    魔法分类

    协商分类

    URL重定向

    web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径

  6. 发送响应报文
  7. 记录日志

http服务器程序

httpd(apache)

nginx

lighttpd

应用程序服务器

IIS

tomcat,jetty,jboss,resin

webshpere,weblogic,oc4j

httpd的安装配置和使用

httpd:apache

httpd的特性

高度模块化,core+modules

DSO:Dynamic Shared Object

MPM:Multipath Processing Modules

prefork:多进程模型,每个进程响应一个请求

一个主进程负责生成多个子进程,子进程称为工作进程,主进程负责监听套接字,每个子进程处理一个用户请求,即便没有用户请求,也会预先生成多个空闲进程(≤1024),随时等待请求到达

worker:多线程模型(多进程生成,一个进程生成多个线程),一个线程响应一个请求

event:事件驱动模型,一个线程响应多个请求

安装方式

rpm

编译安装

CentOS6

程序环境

配置文件

/etc/httpd/conf/httpd.conf

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

服务脚本

/etc/rc.d/init.d/httpd

配置文件:/etc/sysconfig/httpd

主程序文件

/usr/sbin/httpd

/usr/sbin/httpd.event

/usr/sbin/httpd.worker

日志文件

/var/log/httpd

access_log:访问日志

error_log:错误日志

站点文档目录

/var/www/html

模块文件路径

/usr/lib64/httpd/modules

配置文件的组成

Section 1:Global Environment

Section 2:”Main” server configuration

Section 3:Virtual Hosts

配置格式:directive value

directive:不区分大小写

value:为路径时,取决于文件系统

常用配置

  1. 修改监听的IP和端口

    Listen [IP:]PORT

    省略IP表示监听本机的所有IP,Listen可重复出现多次

  2. 持久连接

    Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其他的请求完成

    如何断开?

    数量限制:100

    时间限制:可配置

    副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到响应

    折中:使用较短的持久连接时间

    httpd-2.4支持ms级持久时间

    非持久连接

    KeepAlive On|Off

    MaxKeepAliveRequests n

    KeepAliveTimeout n

    测试:telnet HOST PORT

    GET /URL HTTP/1.1

    Host:HOSTNAME or IP

  3. MPM,Multipath Process Modules,多道处理模块

    prefork、worker、event

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

    确认方法:ps aux | grep httpd

    默认为/usr/sbin/httpd,其使用prefork

    查看模块列表

    查看静态编译的模块

    httpd -l

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

    httpd -M

    更换使用的httpd程序

    /etc/sysconfig/httpd

    HTTPD=

    重启服务生效

    prefork的配置

    <IfModule prefork.c>

    StartServers 8
    服务器进程启动时启动的进程数

    MinSpareServers 5
    最小空闲进程数

    MaxSpareServers 20
    最大

    ServerLimit 256
    为MaxClients指定的在其生命周期内的最大值

    MaxClients 256
    最大并发请求数

    MaxRequestsPerChild 4000
    一个服务器进程能响应的最大请求数

    </IfModule>

    worker的配置

    <IfModule worker.c>

    StartServers 4
    服务器进程启动时启动的进程数

    MaxClients 300
    服务器端最大启动的线程数

    MinSpareThreads 25
    最小空闲线程数

    MaxSpareThreads 75
    最大

    ThreadsPerChild 25

    MaxRequestsPerChild 0
    一个服务器进程能响应的最大请求数

    </IfModule>

    PV、UV

    PV:Page View

    UV:User View

    独立IP量

  4. DSO

    配置指令实现模块加载

    LoadModule <mod_name> <mod_path>

    模块路径可使用相对地址,相对于ServerRoot(/etc/httpd)而言,/etc/httpd/modules

  5. 定义”Main” server的文档页面路径

    DocumentRoot

    文档路径映射

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

    DocumentRoot “/var/www/html”

    test/index.html –> http://HOST:PORT/test/index.html

  6. 站点访问控制

    可基于两种类型的路径指明对哪些资源进行访问控制

    文件系统路径

    <Directory “”> </Directory>

    <File “”> </File>

    <FileMatch “正则表达式”> </FileMatch>

    URL路径

    <Location “”> </Location>

    <LocationMatch “”> </Location>

    访问控制机制

    基于来源地址

    基于用户账号密码

  7. Directory中基于来源地址实现访问控制
    1. Options

      可用值:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All

      Indexes:索引

      FollowSymLinks:允许跟踪符号链接文件

    2. AllowOverride
    3. 基于来源地址的访问控制机制

      Order allow,deny
      检查次序,前为例外,后为默认机制

      Order deny,allow

      Allow from all

      Deny from all

      来源地址

      IP地址

      NetAddr

      172.16

      172.16.0.0

      172.16.0.0/16

      172.16.0.0/255.255.0.0

  8. 定义默认主页面

    DirectoryIndex index.html index.html.var

  9. 日志设定

    错误日志

    ErrorLog logs/error_log

    LogLevel warn

    debug, info, notice, warn, error, crit,
    alert, emerg.

    访问日志

    CustomLog logs/access_log combined

    LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined

    %h:客户端IP地址

    %l:Remote logname (from identd, if supplied). -表示为空

    %u:Remote user(from auth; may be bogus if return status (%s) is 401)

    %t:Time the request was received (standard english format)

    %r:First line of request,请求报文的首行信息

    %s:响应状态码

    %b:响应报文的大小,单位为byte,不包含响应报文首部

    %{Referer}i:请求报文中”referer”首部的值,当前资源的访问入口,及从哪个页面中的超链接跳转而来

    %{User-Agent}i:请求报文中”User-Agent”首部的值,及发出请求用到的应用程序

    详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

  10. 路径别名

    Alias /URL/ “PATH/TO/SOMEDIR/”

    Alias /bbs/ “/forum/htdocs”

    http: //www.123.com/bbs/index.html

    –> /forum/htdocs/bbs/

  11. 设定默认字符集

    AddDefaultCharset UTF-8

    GBK、GB2312、GB18030

  12. 基于用户的访问控制

    认证质询

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

    认证

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

    认证方法

    basic:明文

    digest:消息摘要

    安全域:需要用户通过认证后才能访问的路径

    应该通过名称对其进行标识,并用于告知用户认证的原因

    用户的账号和密码存储于何处

    虚拟账号:仅用于访问某服务时用到的认证标识

    存储

    文本文件

    SQL数据库

    ldap

    nis

    basic认证

    1. 定义安全域

      <Directory “”>

      Options None

      AllowOverride None

      AuthType Basic

      AuthName “STRING”

      AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”

      Require user username1 username2 …

      </Directory>

      允许账号文件中的所有用户登录访问

      Require valid-user

    2. 提供账号和密码存储

      使用htpasswd命令进行管理

      htpasswd [options] passwordfile username

      -c:自动创建passwordfile,因此,仅应该在添加第一个用户时使用

      -m:md5加密用户密码

      -s:sha1加密用户密码

      -D:删除指定用户

    3. 实现基于组进行认证

      <Directory “”>

      Options None

      AllowOverride None

      AuthType Basic

      AuthName “STRING”

      AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”

      AuthGroupFile “/PATH/TO/HTTPD_GROUP_PASSWD_FILE”

      Require group group1 group2…

      </Directory>

      要提供用户账号文件和组文件

      组文件:每行定义一个组

      GRP_NAME:user1 user2…

  13. 虚拟主机

    三种实现方案

    基于IP

    为每个虚拟主机准备至少一个IP地址

    基于port

    为每个虚拟主机准备至少一个专用port,实践中少用

    基于hostname

    为每个虚拟主机准备至少一个专用hostname

    可混合使用三种方式中任意方式

    一般虚拟主机不要与中心主机混用,要使用虚拟主机,先禁用中心主机

    禁用中心主机:注释DocumentRoot

    每个虚拟主机都有专用配置

    <VirtualHost “IP:PORT”>

    ServerName

    DocumentRoot “”

    <Directory “”>

    </Directory>

    </VirtualHost>

    ServerAlias:虚拟主机的别名

    ErrorLog

    CustomLog

  14. 内置的status页面

    <Location /server-status>

    SetHandler server-status

    Order deny,allow

    Deny from all

    Allow from .example.com

    </Location>

http协议和httpd的配置

URL:Uniform Resource Locator

URL方案:scheme

服务器地址:ip:port

资源路径

<Scheme>://<user>:<password>@<Server>:<Port>/<path/to/resource>;<params>?<query>#<frag>

params:参数

query:查询

frag:锚定符

相对URL

绝对URL

http协议

http/0.9,http/1.0,http/1.1,http/2.0

http协议:stateless

服务器无法持续追踪访问者来源

cookie,session

http事务

请求:request

响应:response

报文语法格式

request报文

<method> <request-URL> <version>

<headers>

<entity-body>

response报文

<version> <status> <reason-phrase>

<headers>

<entity-body>

method:请求方法,标明客户端希望服务器对资源执行的动作

GET、HEAD、POST、PUT、DELETE、OPTIONS、TRACE

version

HTTP/<major>.<minor>

status

三位数字:如200、301、302、404、502;标记请求过程中发生的情况

reason-phrase

状态码所标记的状态的简要描述

headers

每个请求或响应报文可包含任意个首部,每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是值

entity-body:请求时附加的数据或响应时附加的数据

method(方法)

GET:从服务器获取一个资源

HEAD:只从服务器获取文档的响应首部

POST:向服务器发送服务器要处理的数据

PUT:将请求的主体部分直接存储在服务器上

DELETE:请求删除服务器上指定的文档

TRACE:追踪请求到达服务器中间经过的代理服务器

OPTIONS:请求服务器返回对指定资源支持使用的请求方法

协议查看或分析工具:tcpdump、tshark、wireshark

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:与301相似,但在响应报文中指定的为资源现在所处的临时新位置;Found

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

401:需要输入账号和密码才能访问资源,Unauthorized

403:请求被禁止;Forbidden

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

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

502:代理服务器从后端服务器收到一条伪响应;Bad Gateway

headers

格式

Name: Value

首部的分类

通用首部

Date:报文的创建时间

Connection:连接状态,keepalive、close

Via:显示报文经过的中间节点

Cache-Control:控制缓存

Pragma

请求首部

Accept:通知服务器自己能够接受的媒体类型

Accept-Charset:接受的字符集

Accept-Encoding:接受的编码格式

Accept-Language:接受的语言

Client-IP

Host:请求的服务器名称和端口号

Referer:包含当前正在请求的资源的上一级资源

User-Agent:客户端代理,浏览器类型

条件式请求首部

Expect

If-Modified-Since:自从指定的时间后,请求的资源是否发生过修改

If-UnModified-Since

If-None-Match:本地缓存中存储的文档的Etag是否与服务器文档的Etag不匹配

If-Match

安全请求首部

Authorization:向服务器发送认证信息,如账号密码

Cookie:客户端向服务器发送cookie

Cookie2

代理请求首部

Proxy-Authorization:向代理服务器认证

响应首部

信息性

Age:响应持续时长

Server:服务器程序软件名称和版本

协商首部:某资源有多种表示方法时使用

Accept-Ranges:服务器可接受的请求范围类型

Vary:服务器查看的其他首部列表

安全响应首部

Set-Cookie:向客户端设置Cookie

Set-Cookie2

WWW-Authenticate:来自服务器对客户端的质询认证表单

实体首部

Allow:列出对此实体可使用的请求方法

Location:告知客户端真正的实体位于何处

Content-Encoding

Content-Language

Content-Length:实体的长度

Content-Location:实体真正所处位置

Content-Type:实体的对象类型

缓存相关

Etag:实体的扩展标签

Expires:实体的过期时间

Last-Modified:最后一次修改的时间

扩展首部

httpd-2.2

curl命令

curl是基于URL语法在命令行方式下工作的文件传输工具,支持FTP、SFTP、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE、LDAP等协议,支持HTTPS认证,支持HTTP的POST、PUT等方法、FTP上传

kerberos认证,HTTP上传,代理服务器,Cookie,用户名/密码认证

上传下载断点续传,http代理服务器管道,IPv6

socks5代理服务器,通过http代理服务器上传文件到FTP服务器等

curl [option] URL

-A/–user-agent:设置用户代理发送给服务器

–basic:使用http基本认证

-e/–referer URL:来源地址

–cacert FILE:CA证书

–compressed:要求返回的压缩格式

-H/–header <line>:自定义头部信息传递给服务器

-I/–head:只显示响应报文首部信息

–limit-rate:设置传输速度

-u/–user <user[:password]>:设置服务器的用户名和密码

-0/–http1.0:使用HTTP1.0

elinks

elinks [option] URL

-dump:不进入交互模式,而直接将URL的内容输出至标准输出

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

适用场景

节约带宽,额外消耗CPU,较老浏览器可能不支持

压缩适于压缩的资源,如文本文件

https

http over ssl = https 443/tcp

SSL会话的简化过程

  1. 客户端发送可供选择的加密方式,并向服务器请求证书
  2. 服务器端发送证书以及选定的加密方式给客户端
  3. 客户端取得证书并进行证书验证

    如果信任给其发证书的CA

    a、验证证书来源的合法性,用CA的公钥解密证书上的数字签名

    b、验证证书内容的合法性,完整性校验

    c、检查证书的有效期限

    d、检查证书是否被吊销

    e、证书拥有者的名字,与访问的目标主机要一致

  4. 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
  5. 服务器用此密钥加密用户请求的资源,响应给客户端

    SSL会话是基于IP地址创建,所以单IP的主机上,仅可以使用一个https虚拟主机

配置httpd支持https

  1. 测试:通过私建CA发证书

    a、创建私有CA

    b、在服务器创建证书签署请求

    c、CA签证

  2. 配置httpd支持使用ssl及使用的证书

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

httpd自带的工具程序

htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具

apachectl:httpd自带的服务控制脚本,支持start、stop

apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具

rotatelogs:日志滚动工具

access.log –>

access.log,access.1.log

access.log,access.1.log,access.2.log

suexec:访问某些有特殊权限设置的资源时,临时切换至指定用户进行

ab:apache benchmark

httpd压力测试工具

ab

ab [options] URL

-n:总的请求数

-c:模拟的并发数

-k:以持久连接模式测试

ulimit -n:调整当前用户所同时打开的文件数

webbench

http_load

jmeter

loadrunner

tcpcopy

httpd-2.4

新特性

  1. MPM支持运行DSO机制,以模块形式按需加载
  2. 支持event MPM
  3. 支持异步读写
  4. 支持每模块及每个目录分别使用各自的日志级别
  5. 每请求配置:<If>
  6. 增强版的表达式分析器
  7. 支持ms级的keepalive timeout
  8. 基于FQDN的虚拟主机不再需要NameVirtualHost指令
  9. 支持用户自定义变量

新模块

mod_proxy_fcgi

mod_ratelimit

mod_remoteip

修改了一些配置机制

不再支持使用Order,Deny,Allow来做基于IP的访问控制机制

安装httpd-2.4

  1. CentOS6

    httpd依赖于apr,apr-util,[apr-icon]

    apr:apache portable runtime

    编译安装步骤

    1.4+版的apr和apr-util

    前提:安装开发环境,安装pcre-devel

    yum groupinstall “Development Tools” “Server Platform Development”

    1. apr

      ./configure –prefix=/usr/local/apr

      make && make install

    2. apr-util

      ./configure –prefix=/usr/local/apr-util –with=/usr/local/apr

      make && make install

    3. groupadd -r apache

      useradd -r -g apache apache

      ./configure –prefix=/usr/local/apache –sysconf=/etc/httpd2.4 –enable-so –enable-ssl –enable-cgi –enable-rewrite –with-zlib –with-pcre –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –enable-modules=most –enable-mpms-shared=all –with-mpm=prefork

      make && make install

    4. 启动服务

      apachectl

  2. CentOS7

    配置文件

    主配置文件:/etc/httpd/conf/httpd.conf

    模块配置文件:/etc/httpd/conf.modules.d/*.conf

    辅助配置文件:/etc/httpd/conf.d/*.conf

    mpm:以DSO机制提供,配置文件00-mpm.conf

    服务控制:systemctl {start|stop|restart|status|reload} httpd.service

    配置

    1. 切换使用MPM

      LoadModule mpm_NAME_module modules/mod_mpm_NAME.so

      NAME:prefork、event、worker

    2. 修改”Main”Server的DocumentRoot
    3. 基于IP的访问控制法则

      允许所有主机访问:Require all granted

      拒绝所有主机访问:Require all deny

      控制特定IP访问

      Require ip IPADDR:授权指定来源地址的主机访问

      Require not ip IPADDR:拒绝指定来源地址的主机访问

      IPADDR

      IP:192.168.100.100

      Net/Mask:192.168.100.0/255.255.255.0

      Net/Length:192.168.100.0/24

      Net:192.168.100

      控制特定主机访问

      Require host HOSTNAME

      Require not host HOSTNAME

      HOSTNAME

      FQDN:特定主机

      DOMAIN:指定域内的所有主机

      <RequireAll>

      Require all granted

      Require not ip IPADDR

      </RequireAll>

    4. 虚拟主机

      基于IP、Port和FQDN都支持

      基于FQDN的不再需要NameVirtualHost指令

    5. ssl

      启用模块:LoadModule ssl_module modules/mod_ssl.so

    6. 服务脚本

      /etc/rc.d/init.d/httpd

      本文摘自http://www.178linux.com/100298

有待验证!

上一篇:《MySQL技术内幕》读书笔记


下一篇:微信小程序左右滑动切换图片酷炫效果(附效果)