一、跨网络的主机间通讯

两个主机之间通讯需要一个接口,这个接口就叫做套接字,而套接字就是IP地址和端口号,合称为套接字地址socket address,在客户端套接字地址定义了一个唯一的客户进程,在服务器套接字地址也定义一个唯一的服务器进程,从而建立通讯。

socket(套接字)是进程间通讯IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通讯和数据交换,socket API封装了内核中所提供的socket通讯相关的系统调用。

socket类型:

根据使用的地址

AF_INET:ipv4

AF_INET6:ipv6

AF_UNIX:同一个主机间的不同进程之间通讯时使用

根据使用的传输层协议

SOCK__STREAM:流,tcp套接字,可靠传递,面向连接

SOCK_DGRAM:数据报,udp套接字,不可靠的传递,无连接

SOCK_RAW:裸套接字,无须tcp或udp,app直接通过ip包通讯,如mysql.sock

socket():创建一个套接字

bind()绑定ip和端口

listen():监听

accept():接受请求

connect():请求连接建立

write():发送

read():接受

close():关闭连接

二、http服务通讯过程

1.服务器端创建新的套接字,将IP地址和80端口绑定,并且允许套接字进行监听,等待连接

2.客户端获取IP地址和端口号,创建新的套接字,连接到服务器IP地址和端口80上去

3.服务器端通过应用储层序连接过来的请求,考试读取请求

4.客户端连接成功,发送http请求,并且等待http响应请求

5.服务器端处理http响应报文,红石回应http响应

6.客户端端等待完成数据传送,向服务器发送断开连接请求

7.服务器端响应断开请求,并且断开连接

三、http工作机制

提高http连接性能

1.并行连接:通过多条tcp连接发起并发的http请求

2.持久连接:keep-alive,长街连接,重用tcp连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接

3.管道化连接:通过共享tcp连接发起并发的http请求

4.复用的连接:交替传送请求和响应报文(实验阶段)

四、URI

URI:统一资源标识符,而URI分为URL和URN

URN:统一资源名

URL:工艺资源定位符,用于描述某服务器某特定资源位置

URL组成

scheme://<user>:<password>@<host>:<prot>/<path>;<params> ?<query>#<frag>

scheme:方案,访问服务器已获取资源时要使用哪种协议

user:用户,某些方案访问资源时需要的用户

password:密码,用户对应的密码,中间用:分隔

host:主机,资源宿主服务器的主机名或IP地址

port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号

path:路径,服务器资源的本地名

params:参数,指定输入的参数,多个参数,用;分隔

query:查询,传递参数给程序,如数据库,用?号,多个查询用&分隔

frag:片段,一小片或一个部分资源的名字,用#分隔

五、网站访问量

IP:指的是一天内来自相同客户端IP地址只计算一次

PV:页面浏览量,用户每一次刷新则被记录一次

UV:网站的一台电脑为一个访客,和IP地址无关

六、一次完整的http请求处理过程

1.建立连接:根据用户发过来的请求判断请求是否允许请求连接,如果允许,则建立连接

2.接受请求,根据客户端请求报文中对某资源的一次请求的过程

web访问响应模型

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

多进程I/O模型:并行启动多个进程,每个进程响应一个连接

复用I/O结构:启用一个进程,同时响应N个进程请求

        实现方法:多线程模型和事件驱动

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

            事件驱动:一个进程请求N个请求

复用的多进程I/O模型:启动M个进程,每个进程响应N个进程请求,同时接受M*N个请求

3.处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,常见的method:GET、POST、HEAD、PUT、DELETE等

4.访问资源,服务器根据客户端请求报文中的访问目录去服务器端查找响应的资源,因为普通的进行是不可以直接去硬盘中读取数据,所以就需要让内核代替去对应的硬盘中读取资源,内核将资源访问到,并且将资源缓存到内存中,然后将资源复制给应用进程的内存中

5.构建响应报文:从硬盘中读取的资源,需要封装响应报文,包括类型的首部,主体的长度,实际报文长度等

    相应实体:如果事物处理产生的响应主体,就将内容放在响应报文中回送过去,响应报文中通常包括:描述了响应主体MIME类型的Content-Type首部,描述了响应主体长度的Content-Length,实际报文的主体内容

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

    MIME类型:web服务器要负责确定响应主体的MIME类型,多种配置服务器的方法可将MIME类型与资源管理起来

魔法分类:apache web服务器可以扫描每个资源的内容,并将其与一个已知模式表进行匹配,已决定每个文件的MIME类型,

显式分类:可以对web服务器进行配置,使其不考虑问价的扩展名或内容。强制特定文件或目录内容拥有某个MIME类型

类型协商:有些web服务器经过配置,可以以多种文档格式来储存资源,在这种情况下,可以匹配web服务器,使其可以通过与用户的协商来决定使用哪种格式

6.响应报文:web服务器通过连接数据时也会面临与接收时 一样的问题,服务器可能会很多条到客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些服务器向客户端回送响应数据,对于客户端来说,有时候不是发送一次数据请求,可能会有很多次,这样每次发送都需要发送请求连接,这样会浪费很多资源,这样建立一个持久连接就很重要,但是建立持久连接也有一个问题,如果客户端一直开着建立一个空链接也是浪费资源,这样就需要有一个超时时间,不然就会一直占用服务器资源

7.记录日志:最后当事物结束时,web服务器会在日志文件中添加一个条目,来描述已执行的事物

七、httpd的介绍

特性:高度模块化

DSO:动态加载卸载模块

MPM:多路处理模块

        prefork:多进程I/O模型。每一个进程响应一个请求,默认模型,多个子进程:工作work进程每个子进程处理一个请求,系统初始时,预先生成多个空闲进程,等待请求,最多不超过1024个

        worker“复用的多线程I/O模型,多进程多线程,一个主进程生成多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求,并发请求为子进程*线程

        event:事件驱动模型。一个主进程生成多个子进程,每个进程生成多个线程,还有一个线程专门来管理这些线程,用来调用这些线程来响应服务

httpd功能特性

虚拟主机:httpd可以实现基于ip、port、域名来实现一个系统多个网站

CGI:通用网关接口,用于连个软件之间的连接

反向代理:外网访问内网时,访问的内网代理

负载均衡

路径别名

用户认证机制

支持第三方模块

八、httpd2.2版本的常用配置文件说明

httpd2.2版本

相关的配置文件

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

/etc/httpd/conf.d/*.conf:扩展配置文件

/var/www/html/:主站点目录

/etc/httpd/modules:有关httpd的模块文件

/usr/lib64/httpd/modules

/etc/httpd/run/httpd.pid:主进程文件

/var/log/httpd/:日志目录

httpd相关文件

1.显示服务器的版本信息即在客户端查看的server后面的版本信息,

servertokens os:默认选项,prod|major|minor|min|os|full:几个选项显示版本信息卓次增加,为了安全考虑建议prod选项

2.监听端口

listen 80:默认监听所有IP地址的80端口

listen IP地址:端口,该选项不可以不写,不写代表不监听端口,服务将不可使用

3.持久连接

keepalive on|off:开启和关闭持久连接,默认关闭

keepalivetimeout 15:超时时间

maxkeepaliverequests 100:最大连接数

4.MPM两个模式,在2.2版本中,event属于测试版本

perfork和worker两种模式的切换目录/etc/sysconfig/httpd

#HTTPD=/usr/sbin/httpd.worker  #使用worker模式取消注释即可

 

#prekork模式,一个进程多个子进程,没有一个进程有一个线程,也可以表示没有线程
<IfModule prefork.c>  # prefork模式
StartServers       8  #默认开的进程数
MinSpareServers    5  #始终保持的空闲连接
MaxSpareServers   20 #最大保持的连接数
ServerLimit      256 #最大的连接数
MaxClients       256 #允许多少个客户端连接
MaxRequestsPerChild  4000  #最近城最多能处理的请求数量
</IfModule>

#worker模式,一个进程,多个子进程,一个子进程有多个线程
<IfModule worker.c> #worker模式  
StartServers         4  #该模式下启动几个子进程
MaxClients         300 #最多的客户端连接数
MinSpareThreads     25 #最小线程
MaxSpareThreads     75 #最多开多少个线程,该参数默认和上述最小进程和子进程的乘积冲突
ThreadsPerChild     25 # 每个服务器的进程
MaxRequestsPerChild  0  #服务器最大请求数
</IfModule>

5.DSO:动态加载模块

直接根据LoadModule auth_basic_module modules/mod_auth_basic.so

Loadmodule 模块名 模块路径格式写即可,及时生效,不需要重启服务

6.定义网页的目录

documentroot "/var/www/html" 指定服务默认的目录,该目录修改需要注意selinux

7.定义站点主页面

directoryindex index.html index.html.var #默认选项,若需要支持其他后缀,则需要增加,该选项也可以指定在directory中,单独对一个目录及其子目录有效

8.站点访问控制常见机制

 

1.指定作用目录
<Directory "/var/www/cgi-bin">  #指定文件系统路径
</Directory>
2.指定作用文件,可以使用通配符
<Files ~ "^\.ht">  #指定文件,其中可以使用通配符
</Files>
3.指定URL路径
<Location "">  #指定URL路径,也可以直接在Directory中指定
</Location>
4.指定文件名,可以使用正则表达式
<FilesMatch ""> #文件名可以使用正则表达式
</Filesmatch>
5.指定文件名,支持文件路径并且支持正则表达式
<LocationMatch ""> #支持文件路径和正则表达式
</LocationMatch>

 9.基于原地址的设置

options选项

在参数前面添加+表示增加指定选项,默认可以不加,-表示删除指令

indexes:指名的URL路径不存在或自定义的主页面不存在将相符的资源文件以列表的方式返回至网页

FllowSymlinks:允许访问符号链接文件所指向的原文件,默认不会显示

None:全部禁用

All:全部允许,包括fllowsfymlinks,

 

<directory "/web">
        options indexes
</directory>

allowoverride:将访问控制相关指令可以存放在目录下的.htaccess文件中,

indexes:AddDescription, AddIcon, AddIconByEncoding, AddIconByType,DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, etc.

limit:order,allow,deny:设置权限

options :indexes,fllowsymlinks,none,all

 

配置文件
<directory "/web">
        allowoverride   indexes all  #指定该操作可以在.htaccess文件中覆盖配置文件中
</directory>
.htaccess文件 
directoryindex index.html.bak
配置文件,
<directory "/web">
        allowoverride limit
</directory>
.htaccess文件
order allow,deny
allow from 192.168.86.1

order:设置访问权限

order allow,deny :若没有明确的允许则拒绝,若两条都匹配则拒绝优先

order deny,allow :若没有明确的拒绝则允许,若两条都匹配则允许优先

allow from IP地址或网段

网段的表示形式有

192.168.86.0/24

192.168.86.0/255.255.255.0

192.168.86

10.日志

 

ErrorLog logs/error_log  #指定错误日志文件
LogLevel warn  #指定日志级别
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log combined  #指定正确访问的日志及记录信息

11.字符集,一般都是UTF-8,支持中文的字符集有GB3212,GBK,GB18030

 

 AddDefaultCharset UTF-8   #默认字符集,GB2312,GBK,GB18030

12.定义别名,常用与跳转其他目录,该目录可以和配置文件中指定的目录不一样,也可以将原文件删除,注意:别名定义的根和系统中的根没有关系 ,而是配置文件中指定的输入地址跳转的目录

alias URL路径 别名路径

 

alias /test/  /test/  #alias 原路径(该原路径是在配置文件中指定的根,不是系统中的根) 别名

13.用户验证机制

创建用户列表的方法 ,创建的用户列表和组列表最好是隐藏文件

htpasswd 选项 列表文件 用户名

-c:自动创建文件,若第二次创建则不需要

-m:md5格式加密,默认方式

-s:sha格式加密

-D:删除指定的用户

配置文件说明

 

#根据用户验证
 <directory "/app/webser/test">
        authtype basic   #验证类型 basic(明文加密)|digest(兼容性差)
        authname "hihihihi"    #在客户端显示字符串,有些浏览器可以显示,有些浏览器不显示
        authuserfile "/etc/httpd/conf.d/.htuser"   #用户和密码存放的位置
        require user haha #允许列表中那一个用户可以登录
        authgroupfile "/etc/httpd/conf.d/.htgroup"  #用户组的列表
        require group 组名1 组名2 #定义哪一个用户组可以访问
        require valid-user #允许用户列表中的所有用户全都可以访问
</directory>
用户验证机制有两种方法,一种基于IP地址验证,一种基于用户名验证吗,若需要两者满足其一则修改配置
Satisfy all|any #all表示两个都要满足才可以,any表示两个满足一个即可

实现

 

指定设置好的用户列表中某几个用户可以查看特殊文件
<Directory "/web/guanli/">
        options indexes
        authtype basic
        authname "test"
        authuserfile "/web/.htuser"
        require user zhangfei
</Directory>
        require valid-user  #指定用户列表所有用户可以登录系统
    实现指定组用户访问特殊文件
创建用户文件和组文件
组文件格式
zu1:zhangfei sunshangxiang
<Directory "/web/guanli/">
        options indexes
        authtype basic
        authname "test"
        authuserfile "/web/.htuser"
        authgroupfile "/web/.htgroup"
        require group zu1
</Directory>

实现基于IP地址和账户密码认证

 

<Directory "/web/guanli/">
        order allow,deny
        allow from 192.168.86.1
        options indexes
        authtype basic
        authname "test"
        authuserfile "/web/.htuser"
        require valid-user
</Directory>


14.web服务器的装状态页面

配置文件说明

 

<Location /server-status>  #定义查看状态时的名称
    SetHandler server-status  #表名开启状态页面
    Order deny,allow  
    Deny from all
    Allow from .example.com  #填写允许列表
    
</Location>
ExtendedStatus  on  #显示更多web服务的装填信息,默认关闭

实现

 

<Location /webserver-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.86.1
</Location>
    ExtendedStatus On

15.虚拟主机

虚拟主机有三种实现方式

基于IP地址:不同IP地址,相同主机,一般少用

基于端口号:不同端口,相同ip地址

基于域名:不同域名,相同ip地址,相同端口

 

有关虚拟主机相关文件配置说明
NameVirtualHost *:80 打开虚拟主机名,当使用一个IP地址和一个端口号时,需要打开
<VirtualHost 192.168.86.10:80>
    ServerAdmin admin@lin.com  #管理员邮箱
    DocumentRoot /app/webser1/  #网页地址
    ServerName www.a.com   #域名
    ErrorLog logs/www.a.com-error_log  #错误日志
    CustomLog logs/www.a.com-access_log common #正确日志
</VirtualHost>

基于IP地址实现虚拟主机

 

<VirtualHost 192.168.86.10:80>
    ServerAdmin admin@lin.com
    DocumentRoot /web/webser1/
    ErrorLog logs/192.168.86.10-error_log
    CustomLog logs/192.168.86.10-access_log common
</VirtualHost>
<VirtualHost 192.168.86.20:80>
    ServerAdmin admin@lin.com
    DocumentRoot /web/webser2/
    ErrorLog logs/192.168.86.20-error_log
    CustomLog logs/192.168.86.20-access_log common
</VirtualHost>
<VirtualHost 192.168.86.30:80>
    ServerAdmin admin@lin.com
    DocumentRoot /web/webser3/
    ErrorLog logs/192.168.86.30-error_log
    CustomLog logs/192.168.86.30-access_log common
</VirtualHost>

基于端口号实现

 

listen 8070
listen 8080
listen 8090
<VirtualHost 192.168.86.10:8070>
    ServerAdmin admin@lin.com
    DocumentRoot /web/webser1/
    ErrorLog logs/192.168.86.10:8070-error_log
    CustomLog logs/192.168.86.10:8070-access_log common
</VirtualHost>
<VirtualHost 192.168.86.10:8080>
    ServerAdmin admin@lin.com
    DocumentRoot /web/webser2/
    ErrorLog logs/192.168.86.10:8080-error_log
    CustomLog logs/192.168.86.10:8080-access_log common
</VirtualHost>
<VirtualHost 192.168.86.10:8090>
    ServerAdmin admin@lin.com
    DocumentRoot /web/webser3/
    ErrorLog logs/192.168.86.10:8090-error_log
    CustomLog logs/192.168.86.10:8090-access_log common
</VirtualHost>

基于域名实现虚拟主机,基于域名的虚拟主机指定后,原本的/var/www/html主页将失效

 

NameVirtualhost 192.168.86.10:80
<VirtualHost 192.168.86.10:80>
    ServerAdmin admin@lin.com
    DocumentRoot /web/webser1/
    ServerName www.a.com
    ErrorLog logs/www.a.com-error_log
    CustomLog logs/www.a.com-access_log common
</VirtualHost>
<VirtualHost 192.168.86.10:80>
    ServerAdmin admin@lin.com
    DocumentRoot /web/webser2/
    ServerName www.b.com
    ErrorLog logs/www.b.com-error_log
    CustomLog logs/www.b.com-access_log common
</VirtualHost>
<VirtualHost 192.168.86.10:80>
    ServerAdmin admin@lin.com
    DocumentRoot /web/webser3/
    ServerName www.c.com
    ErrorLog logs/www.c.com-error_log
    CustomLog logs/www.c.com-access_log common
</VirtualHost>


九、http报文

http请求报文由开始行、首部行、实体主体

http响应报文由状态行、首部行、实体主体

http协议常用状态码

200:成功

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

302:临时指向新位置

304:客户端发出了条件式请求即服务器上的资源未发生改变

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

403:请求被禁止

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

500:服务器内部错误

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

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

504:网关超时

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

使用使用场景:

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

压缩适于压缩的资源

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

deflatecompressionlevel 9:默认为最高压缩