首页 > 代码库 > httpd详解

httpd详解

Web:是一个由许多互相链接的超文本组成的系统,通过互联网访问。 在这个系统中,每个有用的事物,称为一样“资源”;并且由一个全局“统一资源标识符”(URI)标识;这些资源通过超文本传输协议(Hypertext Transfer Protocol)传送给用户,而后者通过点击链接来获得资源。

DARPA :

IANA:                            

众所周知:

    0-1023:管理员才有权限,永久地分配给某应用使用;

注册端口:  

1024-41951:只有一部分被注册,分配原则上非特别严格;

动态端口或私有端口: 内核分配的临时端口

41952+:

/proc/sys/net//ipv4/ip_local_port_range:定义两个数字,表示可以做为临时端口的起始数字和结束数字;定义哪个范围内的端口作为临时端口

传输层协议:TCP,UDP,SCTP,DCCP

套接字类型:

tcp socket

udp socket

raw socket

TCP协议的功能:

连接建立 :建立一个通话

将数据打包成段:

    校验

确认、重传以及超时

排序

序列号

流量控制: 

     缓冲区:发送缓冲、接受缓冲

 滑动窗口:实现流量控制 去

拥塞控制:            

      慢启动

  拥塞避免算法

  

RFC:

IPC: 进程中的通信

socket:IPC的一种实现,用于同一或不同主机上的进程间的通信;

socket通信在domain中实现

     识别一个socket的方法(socket地址格式)

domain:

  Unix domain:基于socket机制实现同一主机不同进程间通信的一种方式:AF_UNIX,AF_LOCAL;地址是一个路径名(文件)

  IPv4 domain:AF_INET,基于socket机制借助于ipv4协议实现不同主机(也可以是同一主机)上的进程间通信的机制;地址是32位的ipv4地址+16位的端口号

  ipv6 domain:AF_INET6地址是128位的ipv6地址+16位的端口号;

  

  socket的类型:

  TCP:流式socket,sock_stream

  可靠、双向、面向字节流

  udp:数据报式socket,

  


  相关的系统调用:

  socket():创建一个新的socket。

  bind():绑定于一个套接字地址上

  listen():监听套接字;

  accept():接收连接请求

  

  connect():发起连接请求;

  

  close():关闭连接

  

  recv 接收请求  send 发送请求

  read()读请求

  read()和write(): recv(), send(), recvfrom(), sendto()

    

TCP协议通过TCP状态来标记当前处于通信过程的那个阶段。

CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED

http协议:

http: Hyper Text Transfer Protocol

传输文本:HTML


html: Hyper Text Mark Language


html文本框架

<html>

   <head>

  <title>TITLE</title>

</head> 

<body>

    <h1>H1</h1>

<p></p>

<h2>H1</h2>

<p> <a href="http://www.mamicode.com/admin.html">ToGoogle</a> </p>

</body>

</html>

css: Cascading Style Sheet层叠样式表


html文档的生成方式:

静态:

动态:编程语言编写的程序可输出html格式的结果

php,jsp,asp .net

依赖脚本解释器:

php:php解释器

jsp:jvm

http协议报文:

request:

请求不同html文档

response:

http协议:

    http 0.9

http 1.0

MIME: Multipurpose Internet Mail Extesions多用途互联网邮件扩展

http 1.1

http 2.0

spdy

web服务器:

理解用户请求的资源格式不仅仅是纯html格式的文档

静态资源

动态资源:

application/php

 

text/html超文本

text/plain文本


web资源:

资源类型:MIME

major/minor

text/html

text/plain

image/jpeg

image/gif

vedio/mpeg4

application/vnd.ms-powerpoint

资源名称:URI 统一资源标记符

URL:统一资源定位符:描述一个特定服务器上某资源的特定位置。

http://www.magedu.com:80/download/bash-4.3.1-1.rpm

分为三部分:

scheme(方案):http://

服务器:www.mageedu.com:80

特定服务器上的资源:/download/bash-4.3.1-2.rpm

CGI:Common Gateway Interface通用网关基础

   简化版的http  

   

   http事务:一次请求及对应的响应

   

   http方法:

   GET:请求获取一个资源,需要服务器发送

   HEAD:跟GET近似,但其不需要服务响应请求的资源,而返回响应首部

   POST:基于HTML表单向服务器提交数据,服务器常需要存储此数据;(位置,通常为关系型数据库)

   PUT:与get相反,向服务器发送资源;服务器通常需要存储此资源;(位置:通常为文件系统)

   DELETE:删除URL指向资源

   options:探测服务器端对请求的URL所支持使用的请求方法

   trace:跟一次请求中间所经过的代理服务器、防火墙或网关等

   

 http状态码:

   1xx:信息性状态码

   2xx:成功状态码

      200:OK

      201:CRERTED

   3xx:重定向类的状态码

      301:moved permanently永久重定向,

      302:found 临时重定向,会在相应报文中使用”location:新位置”;

      304:not modified

   4xx:客户端类错误

      403:Forbidden请求被拒绝

      404:Not Found资源不存在

      405:Method Not Allowed方法不对,不允许你使用你的方法。

   5xx:服务器类的错误

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

      502:Bad Gateway错误的网关,代理服务器从上游服务器收到一条伪相应

      503:Service Unavailable服务暂时不可用

 

http协议:

协议首部:

name:value

     例如:content-type:images/gif

 分三类:

 通用首部

 请求首部

 响应首部

http请求报文:

 <method> <request-URL> <version>

 请求方法-请求资源-协议版本

 <HEADERS>

 

 <entity-body>

 请求实体

 

http响应报文:  

 <version> <status> <reason-phrase>

 版本-状态码-原因短语

 <HEADERS>

 

 <entity-body>

 相应首部

 

       解释:

<method>:请求方法

<request-URL>: 请求的资源,可以是相对路径,如/images/log.jpg,也可以绝对路径,如http://www.magedu.com/images.banner.jpg

<version>: http协议版本,格式HTTP/<major>.<minor>,例如HTTP/1.0, HTTP/1.1

<headers>:各种所可以使用的首部

<status>: 状态码

<reason-phrase>: 原因短语,指状态码的易读信息  

 

 注意:http协议无状态,stateless

 cookie:标记信息

   set-cookie



http协议版本:

http 0.9: 仅用于传输html文档

http 1.0:引入MIME机制,从而支持多媒体数据;引入keep-alive(持久连接);缓存

http 1.1:更多请求方法,更精细缓存控制;持久连接(persistent);


http协议首部:

通用首部

请求首部

响应首部

实体首部

扩展首部:非标准首部,可由程序员自行创建;X-Forward-For, X-Via

通用首部:

 Connection:定义c/s之间关于请求、响应的有关选项

          Connection: keep-alive

Cache-Control: 缓存控制

    

    请求首部:

Client-IP:

Host: 请求的主机

Referer: 指明了请求当前资源原始资源的URL

User-Agent: 用户代理

     Accept首部:

Accept: 服务端能够发送的媒体的类型

Accept-Charset: 

Accept-Encoding: 

Accept-Language: 


条件式请求:

跟安全相关请求:

Authorization:授权

Cookie:

响应首部:

Age: 

Server: 向客户说明自己的程序名称和版本


协商首部:

  vary:首部列表,服务器会根据列表中的内容挑一个最适用的版本发给客户端

      跟安全相关:

        www-authencation

        set-cookie


实体首部:

     location:资源的新位置

     allow: 允许对此资源使用的请求方法


 内容相关的首部;

Content-Encoding: 内容编码

Content-Language:语言

Content-Length:长度

Content-Location:

Content-Type:类型

缓存相关:

etag

expires

last-modified

  

一次web资源请求的具体过程(服务器角度):

建立连接

接收请求

处理请求

访问资源

构建响应

发送响应

记录日志

连接:

连接套接字:(client, cport <--> server, sport)

监听套接字:80端口

        

web服务器的I/O结构:

单进程模型:串行

多进程模型:每个进程响应一个用户请求实现并发的效果

复用的I/O机制:一个进程生成多个线程,每个线程响应一个用户请求

复用的I/O机制:多个线程,每个线程响应多个用户请求;

web server:

httpd

nginx

lighttpd

gws


App Server: 

IIS

tomcat, jetty, resin

weblogic

websphere


httpd:

ASF: Apache Software Fundation


httpd, 


a patchy server = apache

httpd, 

httpd的特性:

        高度模块化:core + modules

DSO:Dynamic Shared Object支持共享加载机制

MPM:Multipath Processing Module多道处理模块

统称,事实上又多个实现;

prefork:每个进程响应一个用户请求,预先生成多个空闲进程;

   select():1024

worker:启动多个进程,每个进程生成多个线程,每个线程响应一个用户请求;

event:启动多个线程,每个线程响应N个请求;

  event-driven:事件驱动

  

  

httpd的功能特性:

丰富用户认证:基本认证和摘要认证

CGI:通用网关接口  原生支持perl CGI

虚拟主机:

   基于端口、ip、主机名

反向代理:

   负载均衡

用户站点:

路径别名:

第三方模块:

安装方式:

rpm包

源码编译

centos 6:httpd

配置文件:

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

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

服务脚本:

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

  脚本配置文件:/etc/sysconfig/httpd

  

 模块目录:

/etc/httpd/modules: 链接文件

/usr/lib64/httpd/modules

主程序:

/usr/sbin/httpd: prefork 

/usr/sbin/httpd.event: event

/usr/sbin/httpd.worker: worker

日志文件目录:

/var/log/httpd

access_log: 访问日志

error_log: 错误日志

站点文档根目录:

/var/www/html/images/a.jpg

http://www.magedu.com/images/a.jpg 

 

 

 httpd的配置文件说明:


# grep "Section" httpd.conf


### Section 1: Global Environment

### Section 2: ‘Main‘ server configuration

### Section 3: Virtual Hosts


 主服务器的配置

 虚拟主机配置

   

   主服务器和虚拟主机一般不同时使用,默认仅启用了主服务器;

   指令参数:不区分字符大小写,但其值有可能会区分大小写

   

   1、持久连接

KeepAlive {On|Off}

MaxKeepAliveRequests 100 

KeepAliveTimeout 15

   

   

   2、MPM参数:

  <IfModule prefork.c> 多进程模式

StartServers       8

MinSpareServers    5

MaxSpareServers   20

ServerLimit      256

MaxClients       256

MaxRequestsPerChild  4000

</IfModule>

     

 

 

<IfModule worker.c>多线性模式

StartServers         4

MaxClients         300

MinSpareThreads     25

MaxSpareThreads     75

ThreadsPerChild     25

MaxRequestsPerChild  0

</IfModule>

启动多少空闲进程

所允许最大并发请求用户

最小空闲线性进程

最大空闲线性进程

每个子进程可以生成多少线性

每个线性可以处理多少个进程

 

event:事件驱动模型

 

指定监听的地址和端口

listen [ip:]ro

listen 80

listen 8080

.....

此指令可重复指定多次

4、dso机制指定装载的模块

显示:

#httpd -D DUMP_MODULES

LoadModule Module_Name /path/to/Module_File

“格式 模块名称 模块路径名字”

5指定站点跟目录:网页存放位置

documentroot “/path/to/somewhere"

6、站点路径访问控制

基于本地文件系统路径

<directoty "/path/to/somewhere">

</directory>

基于URL访问路径做访问控制

<Location "/path/to/URL">

</Location>

7、于Directory中可用的访问控制

(1)options :定义访问选项

indexes:当访问的路径下无默认的主页面,将所有资源以列表形式呈现给用户;危险,慎用;

followsymlinks:跳跃符合链接

(2)allowoverride

支持在每个页面目录下创建,htaccess用于实现对此目录中资源访问时的访问控制功能

8、order基于ip做访问控制

order allow,deny(拒绝)

allow from all

deny from172.16.100.17拒绝

allow from172.0.0/16允许访问

  from后面能接受的地址格式

  IP, Network Address

    网络地址格式较为灵活:

    172.16

    172.16.0.0

    172.16.0.0/16

    172.16.0.0/255.255.0.0

  

  

  

9、定义默认的主页面

   directoryindex 

10、配置日志功能

    日志级别:LogLevel {debug|info|notice|warn|error|crit|alert|emerg}


    日志格式 LogFormat 

    访问日志CustomLog "/path/to/access_log" LogFormat_Name

                                

       指定错误日志 ErrorLog "/path/to/error_log"

自定义日志格式名称

logformat日志格式

%h:客户端地址;

%l:远程登录名,

%u:认证时输入的用户名,没有认证时为-

%t:服务器收到 用户请求时的时间

%r:请求报名的起始行;

%>s:响应状态码;

%b:响应报文的长度,单位是字节

%{header_name}i:记录指定首部对应的值

11、路径别名

站点根目录:/www/html

    http://www.magedu.com/images/logo/new.gif

    此文件位置:/www/html/images/logo/new.gif

实现URL路径的映射,从而所访问的资源不再依赖于站点根目录;

Alias /URL/ "/path/to/somewhere/"

12、设定默认字符集

字符集:GB2312,GB18030,GBK

13、CGI脚本  通用网关接口

   CGI脚本路径别名

    /var/www/cgi-bin

http://server/cgi-bin/

   base写CGI脚本

所有文本都使用命令输出:echo,printf,cat

执行程序;命令引用

Content-Type: text/html

<pre>


</pre>

fastCGI:快速CGI协议

14、基于用户访问控制

   用户认证:

   基本认证:basic

摘要认证:digest

虚拟用户:仅用于访问某服务或获取某资源的凭证;

   文本文件:.htpasswd账号是明文,密码是加密的

sql数据库中:

dbm:数据库引擎。提供API。      将用户账号密码

ldap;轻量级服务访问协议

authentication provider:账号和密码存储机制;

authorization provider: 授权

案例:基於文件做訪問控制

1) 基于用户进行认证 


<Directory "/var/www/html/admin">

    Options none

    AllowOverride AuthConfig

    AuthType Basic

    AuthName "Admin Area."

    #AuthBasicProvider file

    AuthUserFile /etc/httpd/conf/.htpasswd

    Require valid-user

</Directory>


Require valid-user: 文件中所有用户均可访问

Require user USERNAME, ...

2)提供認證文件

htpasswd

-C:如果此文件事先不存在,则创建;注意,只能在创建第一个用户使用。

-m:以md5的格式编码存储用户的密码信息

-D:删除指定用户

 

3)組認證

<Directory "/var/www/html/admin">

    Options none

    AllowOverride AuthConfig

    AuthType Basic

    AuthName "Admin Area."

    #AuthBasicProvider file

    AuthUserFile /etc/httpd/conf/.htpasswd

    AuthGroupFile /etc/httpd/conf/.htgroup

    Require group GROUP_NAME

</Directory>

  组名:user1 user2 user3

15、虚拟主机

一个站点提供多个

虚拟主机:使用不同访问路径

    基于端口

基于ip

基于主机名

 

 

1) 使用虚拟的前提:取消主服务器

   注释主服务器的站点根路径指定:documentroot

2)定义虚拟主机

NameVirtualHost IP:PORT


<VirtualHost IP:PORT>

ServerName 

DocumentRoot 

ServerAlias

ErrorLog

CustomLog

</VirtualHost>

配置文件语法检查:

httpd -t

service httpd configtest

配置示例:

<VirtualHost 172.16.100.7:80>

   ServerName www.mageedu.com

   DocumentRoot "/web/hosta"

</VirtualHost>


<VirtualHost 172.16.100.8:80>

   ServerName www.mageedu.com

   DocumentRoot "/web/hostb"

</VirtualHost>


<VirtualHost 172.16.100.8:8080>

   ServerName www.mageedu.com

   DocumentRoot "/web/hostc"

</VirtualHost>

测试:elinks

 -dump:获取到页面数据后直接退出进程

 

 

16、https协议

 ssl(安全的套接字层),tls(传输层安全)

      http协议:文本编码  明文 不安全

 验证:使用telnet发请求

# telnet 172.16.100.7 80

Trying 172.16.100.7...

Connected to 172.16.100.7.

Escape character is ‘^]‘.

GET /index.html HTTP/1.0

Host: www.b.org


HTTP/1.1 200 OK

Date: Fri, 08 Aug 2014 03:03:51 GMT

Server: Apache/2.2.15 (CentOS)

Last-Modified: Fri, 08 Aug 2014 02:14:52 GMT

ETag: "e0009-12-50014c53e753f"

Accept-Ranges: bytes

Content-Length: 18

Connection: close

Content-Type: text/html; charset=UTF-8


<h1> Host B </h1>

Connection closed by foreign host.


 httpd:ssl

   ssl模块

  单独成包

  ssl会话基于IP地址创建,所以,每一个IP仅创建一个SSL会话;

 ssl握手要完成的工作;

 交换协议版本号

 选择双方都支持的加密方式

 客户端对服务器端实现身份验证

 秘钥交换

 

 

 https协议:基于ssl二进制编码,443/tcp

 openssl s_client

 

 客户端验证服务器端证书:

 有效性检测:证书是否仍然在有效期内

 ca的可信度检测

 证书的完整性检查;

 持有者的身份检查

 

 配置httpd工作于https:

 1、安装mod_ssl模块

 # yum install mod_ssl

 2、为服务器端生成私钥,并为其提供证书;

 # mkdir /etc/httpd/ssl && cd /etc/httpd/ssl

# (umask 077; openssl genrsa -out httpd.key 1024)

# openssl req -new -key httpd.key -out httpd.csr


签署后的证书为:/etc/httpd/ssl/httpd.crt

 3、配置使用https的虚拟主机;

 SSLCertificateFile

SSLCertificateKeyFile


<VirtualHost IP:443>

DocumentRoot

ServerName

</VirtualHost>


 4、重新装载配置

 5、测试

# openssl s_client -connect IP:PORT -CAfile /path/to/ca_certificate

17、status页面

httpd内嵌有handler,其中有一个handler用于输出当前httpd服务相关状态信息

handler:server-status

启用handler要使用sethandler指令

18、访问属性配置总结

 

<Directory [~] "">

</Directory>


<File [~] "">

</File>


配置URL访问路径:

<Location [~] "">

</Location>


<LocationMatch "">

</LocationMatch>



/var/www/html/

images/  

 

 

 19、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的常用选项:


   -A/--user-agent <string> 设置用户代理发送给服务器

   -basic 使用HTTP基本认证

   --tcp-nodelay 使用TCP_NODELAY选项

   -e/--referer <URL> 来源网址

   --cacert <file> CA证书 (SSL)

   --compressed 要求返回是压缩的格式

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

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

   --limit-rate <rate> 设置传输速度

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

   -0/--http1.0 使用HTTP 1.0

 

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


SetOutputFilter DEFLATE


          # mod_deflate configuration

    

      

     # 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 has some problems.

     BrowserMatch ^Mozilla/4 gzip-only-text/html

      

     # Netscape 4.06-4.08 have some more problems

     BrowserMatch ^Mozilla/4\.0[678] no-gzip

      

     # MSIE masquerades as Netscape, but it is fine

     BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html  

 

21、httpd程序包自带的工具介绍

httpd:

  Apache服务器程序

  

  -t:测试配置文件

  -l:列表静态模块

  -D:DUMP_MODULES:列出DSO模块

-M:

-D DUMP_VHOSTS: 列出所有虚拟主机

  htpasswd:

为基于文件的basic认证创建和更新用户认证文件


apachectl: 

脚本,httpd服务控制工具;


ab: apache benchmark

httpd的基准性能测试工具; 


apxs: 

httpd得以扩展使用第三方模块的工具;


htcacheclean: 

磁盘缓存清理工具;


htdigest: 

为digest认证创建和更新用户认证文件


httxt2dbm:

为rewrite map创建dbm格式的文件


rotatelogs: 

不关闭httpd而切换其使用日志文件的工具


access_log, access_log.1, access_log.2,


suexec:

User apache

Group apache


当httpd进程需要以另外的用户的身份去访问某些资源时,可以以suexec作临时切换;


22、ab工具的初步使用


同类工具:http_load, webbench, seige


Usage: ab [options] [http[s]://]hostname[:port]/path


-c #: 模拟的并发数;

-n #: 总的请求数


-n的值一定要大于等于-c的值;


  

23、资源限定   

  软限定:可临时超出一定时长的上限

  硬限定:绝对不可以超出上限

  

  管理员可使用ulimit命令临时性的修改各种资源的软限制;

  ulimit -n #:能同时打开文件数

         -u #:能同时启动的进程数

 

 

配置文件:

/etc/security/limits.conf

/etc/security/limits.d/*.conf

24、编译安装httpd-2.4

httpd-2.0, httpd-2.2, httpd-2.4


httpd程序依赖于apr和apr-util

apr: apache portable runtime

httpd-2.4的新特性:

1)MPM支持在运行时装载;

--enable-mpms-shared=all --with-mpm={prefork|worker|event}

2)支持event mpm

3)异步读写

4)在每模块及每目录分别使用不同的日志级别

5)每请求的配置;<If>,<Elseif>

6)增强版的表达式分析器

7)毫秒级的keep alive的timeout

8)基于FQDN的虚拟主机不再需要NameVirtualHost指令;

9)支持用户使用自定义变量


新增了一些模块:mod_proxy_fcgi, mode_ratelimit, mod_request, mod_remoteip


修改了一些配置机制:

不再支持使用order, allow, deny定义基于ip的访问控制;改为require


编译安装httpd-2.4

  # ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --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-mpms-shared=all --with-mpm=event --enable-modules=most

   # make && make install



   基于IP做访问控制:

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

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


控制某特定主机的访问:

Require ip IPADDR

Require not ip IPADDR


IPADDR:

单个ip

Network/Netmask: 

Network/Length: 172.16.0.0/16

Net: 172.16


Require host HOSTNAME

Require not host HOSTNAME


HOSTNAME:

FQDN:具体的主机

DOMAIN: 域内的所有主机



本文出自 “正则表达式” 博客,请务必保留此出处http://hhxxb.blog.51cto.com/9152570/1538290