网络体系结构现在主要有OSI的七层协议和TCP/IP协议,其对应关系如下:
资源子网主要是用户进程,运行于用户空间,关注点是应用上的细节,通信子网运行于内核空间,关注通信细节。传输层是确保进程到进程间通信,IP地址是确保主机到主机通信,MAC地址是确保设备到设备通信。主机到主机与设备到设备有何不同呢?主要是网络中间要经过多台网络设备,如交换机、路由器等,MAC地址是确保在两台网络设备间通信的。当然,在这个概念里,主机也是一台设备。
应用层实现应用协议,主要运行于用户空间,像前面学到的dns,ssh都是应用层协议,本事是一种协议,而这种协议的实现需要一个载体,这就是bind和openssh。因为应用层应该关注的是本身的实现,其要与其他主机通信,只需要调用通信子网功能就可以了,套接字就是为了简化这种调用而实现的功能,起到一个上下沟通的作用。Socket是IPC的一种实现,允许位于不同主机(甚至同一主机)上不同进程之间进行通信。
Socket有三种类型:
tcp套接字:SOCK_STREAM、
udp套接字:SOCK_DGRAM、
裸套接字(不借助tcp、udp,直接用IP):SOCK_RAW。
套接字,不是很精确的说法就是IP+端口的组合。
端口:tcp和udp协议端口号都是0~65535
0~1023:众所周知,永久分配给固定应用使用,22/tcp(ssh)、80/tcp(http)、443/tcp(https);
1024~41951:注册端口,要求不是特别严格,分配给程序注册为某应用使用,3306/tcp(mysql);
41952+:客户端程序随机使用的端口(内核随机分配),叫做动态端口或私有端口;其范围的定义:/proc/sys/net/ipv4/ip_local_port_range;
TCP协议特性:
- 建立连接:三次握手
- 将数据打包成段:校验和(CRC-32)
- 确认、重传以及超时;
- 排序:逻辑序号
- 流量控制:快发慢收时;通过滑动窗口算法实现。(主要针对主机的接收能力)
- 拥塞控制:慢启动和拥塞避免算法;(主要针对网络带宽)
Socket Domain:(根据其所使用的地址进行的另一种分类方法)
- AF_INET:Address Family,IPv4
- AF_INET6:IPv6
- AF_UNIX:同一主机上不同进程间通信使用
每类套接字都至少提供了两种socket:流和数据报,即tcp和udp
流:可靠地传递、面向连接、无边界;
数据报:不可靠传递、有边界、无连接;
套接字相关的系统调用:
socket():创建一个套接字(相当于创建一个模板);
bind():绑定(即将上一步的模板进行填充,与特定IP和端口联系起来)
listen():监听
accept():接收请求
connect():请求连接建立(一般是客户端发起)
write():发送数据,即向套接字写数据
read():接收数据,即从套接字读数据(从缓冲读)
send()、recv()、sendto()、recvfrom()
HTTP协议:Hyper Text Transfer Protocol,其实现监听于80端口
html:编程语言,超文本标记语言;
MIME:Multipurpose Internet Mail Extensions(将非文本格式数据转换成文本格式传输后在转换回非文本数据)
工作机制:
http请求
http响应
Web资源:web resource
静态文件:.html,.jpg
动态文件:在服务器中执行后才能形成最终结果,.php,.jsp
媒体:媒体类型(MIME类型):major/minor
text/html、text/plain、image/jpeg、image/gif
URI:Uniform Resource Identifier,统一资源标识符
URL:Uniform Resource Locator,统一资源定位符,是URI的子集,用于描述某服务器某特定资源的位置。
Scheme://Server:port/path/to/resource,(path/to/resource最终通过映射,映射到具体文件系统中的特定文件)
URN:Uniform Resource Naming,统一资源命名符
HTTP协议版本:
HTTP/0.9:原型版本
HTTP/1.0:第一个广泛使用的版本,支持MIME
HTTP/1.1:增强了缓存功能
spdy:Google开发的基于TCP的会话层协议,SPDY是对HTTP协议的增强。
HTTP/2.0:
一次完整的http请求过程:
(1)建立或处理连接;
(2)接收请求,接收来自于网络的请求报文中对某资源的一次请求的过程。
并发访问响应模型(Web I/O):
单进程I/O结构:只启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应;
多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
复用I/O结构:一个进程响应n个请求;
多线程模型:一个进程生成n个线程,每个线程响应一个用户请求;
事件驱动机制,event-driven:基于事件回调机制,进行事件状态的追踪。
复用的多进程I/O结构:启动多个进程,每个进程响应n个请求;
(3)处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息。
元数据:请求报文首部
<method> <URL> <VERSION>
host:请求的主机名称
Connection:
(4)访问资源:获取请求报文中请求的资源。
web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot
/var/www/html/
images/1.jpg
http://www.test.com/images/1.jpg
web服务器资源路径映射方式:
a)docroot
b)alias
c)虚拟主机docroot
d)用户家目录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 Module。事先创建进程,按需维持适当的进程
prefork:多进程模型,每个进程响应一个请求;进程模型,两级结构,主进程master负责生成子进程,每个子进程负责响应一个请求。
一个主进程,负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;主进程负责监听80端口和接收请求,但不负责处理请求,交给子进程处理。主进程的是监听套接字,子进程的是连接套接字。
worker:多线程模型(多进程生成),每个线程响应一个请求;一个主进程生产多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求。m进程,n线程:m*n个请求。
线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求。
event:事件驱动模型,一个线程响应多个请求。每个线程响应N个请求;一个主进程生成m个子进程,每个子进程负责n个请求。
线程模型,三级结构,主进程master负责生成子进程,每个子进程响应多个请求(有一个监控线程)监听线程。
httpd-2.2:event为测试使用
httpd-2.4:event可生产使用
支持运行时配置,支持单独编译模块
支持多种方式的虚拟主机配置
虚拟主机: 物理服务器一台, Web程序一个,却可以服务多个不同的站点
Socket IP:Port
基于IP的虚拟主机;基于端口的虚拟主机;基于域名的虚拟主机
httpd的安装配置:
CentOS 6 :2.2
CentOS 7 : 2.4
CentOS 6:程序环境
配置文件:/etc/httpd/conf/httpd.conf、 /etc/httpd/conf.d/*.conf
服务器脚本: /etc/rc.d/init.d/httpd
配置文件:/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd :prefork模型
/usr/sbin/httpd.event :event模型
/usr/sbin/httpd.worker :worker模型
日志文件目录:
/var/log/httpd
access_log:访问日志
error_log:错误日志
站点文档目录:
/var/www/html
配置文件的组成:主配置文件/etc/httpd/conf/httpd.conf
[root@study610-f1 CentOS]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式:directive value
directive:不区分字符大小写;
value:为路径时,取决于文件系统;
常用配置:
1、修改监听的IP和Port:Listen [IP:]PORT
忽略IP表示监听本机所有IP;Listen可重复出现多次;
2、持久连接:
Persistent Connection:连接建立,每个资源取完后不会断开连接,而是继续等待其他的请求完成;
如何断开?数量限制:100;时间限制:可配置
副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到响应;
折衷:使用较短的持久连接时间;
httpd-2.4 支持毫秒级持久时间
非持久连接:
KeepAlive on|off 、 MaxKeepAliveRequests # 、KeepAliveTimeout #
测试:
telnet HOST PORT
GET / HTTP/1.1
Host:HOSTNAME or IP
3、MPM
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=/usr/sbin/httpd.worker
修改成httpd.worker或httpd.event,重新启动就可以了。
prefork的配置:/etc/httpd/conf/httpd.conf
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8 # 服务启动时启动的服务器进程数
MinSpareServers 5 # 最小空闲服务器进程数
MaxSpareServers 20 # 最大空闲进程数
ServerLimit 256 #
MaxClients 256 # 最大并发请求数量
MaxRequestsPerChild 4000 # 每个进程最大处理的请求数量
</IfModule>
worker的配置:
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
网站评测:
PV:Page View,UV:User View,独立IP量;
4、DSO机制,Dynamic Shared Object,/usr/lib64/httpd/modules
配置指令实现模块加载:LoadModule <mod_name> <mod_path>
模块路径可使用相对地址:
相对于ServerRoot(其值为/etc/httpd)指向的路径而言,ServerRoot在/etc/httpd/conf/httpd.conf中定义,模块的路径为:/etc/httpd/modules/
如:LoadModule auth_basic_module modules/mod_auth_basic.so
就是加载/etc/httpd/modules/mod_auth_basic.so
/etc/httpd/modules与/usr/lib64/httpd/modules是同一个位置,是一个硬链接。
5、定义“Main”server的文档页面路径, DocumentRoot
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置:
DocumentRoot “/var/www/html”
test/index.html --> http://HOST:PORT/test/index.html 用户访问路径
test/index.html --> /var/www/html/test/index.html 文件系统路径
修改DocumentRoot测试,先关闭SELINUX:修改/etc/httpd/conf/httpd.conf
6、站点访问控制,可基于两种类型的路径指明对哪些资源进行访问控制:
文件系统路径:
<Directoty ""> </Directory>
<File ""> </File>
<FileMatch ""> </FileMatch>
URL路径:
<Location ""> </Location>
......
访问控制机制:
基于来源地址:
基于用户账号:
7、Directory中“基于来源地址”实现访问控制
(1)Options
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None,All
Indexes:索引,没有定义DirectoryIndex,则列出目录下所有文件,很危险的行为,对于下载站很适用。不定义,则拒绝。
实操:
httpd.conf中修改<Directory "/var/www/html"></Directory>如下:
<Directory "/www/htdocs">
Options Indexes FollowSymLinks
AllowOverride None # 是否覆盖目录下的.htaccess定义的访问权限
Order allow,deny
Allow from all
</Directory>
将 Options Indexes FollowSymLinks中的indexes去掉,改为 Options FollowSymLinks,重新加载后再次访问:
FollowSymLinks:允许跟踪符号链接文件访问,如ln -sv /etc/issue /www/htdocs/issue.html,用户可访问issue.html,否则拒绝访问。
实操:
将Options FollowSymLinks改为Options None
(2)基于来源地址的访问控制机制
Order:检查次序
Order allow,deny 白名单,后面的deny是默认处理动作
Order deny,allow 黑名单
Allow from
Deny from
来源地址:
IP:
NetAddr:172.16 、172.16.0.0 、172.16.0.0/16 、172.16.0.0/255.255.0.0
实操:
Order allow,deny
Allow from 192.168.138.137
从137主机访问:
其他主机访问:
8、定义默认主页面
DirectoryIndex index.html index.html.var # 可定义多个,从左往右依次查找,没有找到且Options定义了indexes,则列出目录下的所有文件。
9、日志设定
错误日志:
ErrorLog logs/error_log,是相对路径,相对ServerRoot,即/etc/httpd目录,即/etc/httpd/logs目录,此目录文件是/var/log/httpd的软链接文件。
LogLevel warn
几种级别: debug、info、notice、warn、error、crit、alert、emerg
访问日志:
CustomLog logs/access_log combined,#combined是格式名,定义日志格式,用LogFormat定义,默认配置文件中还定义了common,referer,和agent:
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
%t:服务器接收到请求的时间
%r:First line ofrequest,请求报文的首行信息(method url version)
%>s:响应状态码;
%b:响应报文的大小,单位是字节,不包含响应报文首部;
%{Referer}i:请求报文当中“referer”首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来的;
%{User-Agent}i:请求报文当中“User-Agent”首部的值;即发出请求用到的应用程序;
10、路径别名
DocumentRoot “/www/htdocs”
http://www.mytest.com/download/soft.rar ---> /www/htdocs/download/soft.rar 路径映射
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /bbs/ "/forum/htdocs"
http://www.mytest.com/bbs/index.html --> /forum/htdocs/bbs/index.html 别名
实操:
在/www/htdocs下创建bbs目录,其下创建index.html,访问:http://192.168.138.139/bbs/index.html
在/etc/httpd/conf/httpd/conf中增加:Alias /bbs/ "/forum/htdocs/"
创建/forum/htdocs目录,在此目录下创建index.html。同样访问:http://192.168.138.139/bbs/index.html
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_PASSWORD_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_PASSWORD_FILE"
AuthGroupFile “/PATH/TO/HTTPD_GROUP_FILE”
Require group group1 group2 ......
</Directory>
要提供:用户账号文件和组文件:
组文件:每行定义一个组:GRP_NAME:user1 user2 user3 .......
实操:
<1>创建目录及文件:/www/htdocs/admin目录及index.html文件
<2>在配置文件/etc/httpd/conf/httpd.conf中配置定义域:
<3>测试访问http://192.168.138.139/admin/index.htnl,需要用户和密码了:
访问其他路径则不需要用户密码。
<4>创建用户、密码文件,使用htpasswd命令工具:
再次测试:
测试指定具体可登陆用户名,将配置文件中的:require valid-user改为require user tom
使用jerry无法登录,使用tom可以登录
<5>基于组进行认证:
修改配置文件:
添加一个用户test1,创建组文件/etc/httpd/conf.d/.htgroup
即允许webadmin组的用户登录访问/admin下的资源。
测试访问:test1和jerry可以访问,tom不可以访问。
13、虚拟主机
有三种实现方案:
基于IP:为每个虚拟主机准备至少一个ip地址;
基于端口:为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname(主机名):为每个虚拟主机至少准备一个专用hostname;
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机不要与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释掉DocumentRoot
每个虚拟主机都有专用配置:
<VirtualHost "IP:PORT">
ServerName
DocumentRoot “”
</VirtualHost>
ServerAlias:虚拟主机的别名:
ErrorLog
CustomLog
<Directory ""></Directory>
实操:
1) 基于IP
先注释掉主服务器的DocumentRoot,配置虚拟主机项:
检测语法是否错误,创建相关目录、文件
主机增加增加IP:
服务重载后测试访问:
2)基于端口的虚拟主机:配置文件修改
3)基于hostname
先在配置文件中启用NameVirtualHost *:80配置项
测试:客户端修改hosts文件:
访问测试:
4)测试日志:
14、内置的status页面
配置文件:
此时访问http://192.168.138.139/server-status:显示服务器的状态信息
配置文件中配置:ExtendedStatus On,将看到更多服务器状态:
对这个URL进行认证保护,配置方法: