1 Internet
Internet 最早来源于美国国防部高级研究计划ARPA建立的AEPANET,1969年投入运行,1983年,ARPnet分裂为两部分:ARPnet和纯军事用的MILNET,当年1月,ARPA把TCP/IP协议作为ARPAnet的标准协议,这个以ARPAnet为主干网的网际互联网便被称为Internet.1986年,美国国家科学基金会建立计算机通信网络NSFnet.从此NSFnet逐渐取代ARPAnet的Internet的地位.1990年,ARPAnet正式关闭
跨Internet的主机间通讯
在建立通信连接的每一端,进程间的传输有两个标识:
IP地址和端口号,合称为套接字地址 socket address
客户端套接字地址定义了一个唯一的客户进程
服务器套接字地址定义了一个唯一的服务器进程
2 SOCKET概念
Socket: 套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换,SocketAPI出现于1983年,4.2 实现
Socket API: 封装了内核所提供的socket通信相关的系统调用
Socket Domain: 根据其使用的地址
AF_INET: addresss Family,IPv4
AF_INET6: IPv6
AF_UNIX: 同一主机上不同进程之间通信时使用的
Socket Type: 根据使用的传输层协议
SOCK_STREAM: 流,tcp套接字,可靠地传递,面向连接
SOCK_FGRAM: 数据报,udp套接字,不可靠传递,无连接
SOCK_RAW: 裸套接字,无须tcp或udp,APP直接通过IP包通信
Socket API 相关的系统调用
socket(); 创建一个套接字
bind(); 绑定IP和端口
listen(); 监听套接字
accept(); 接受请求
connect(); 请求连接建立
write(); 发送消息
read(); 接受消息
close(); 关闭连接
python 写的简单的基于socket
server.py
import socket
HOST='127.0.0.1'
PORT=9527
BUFFER=4096
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind((HOST,PORT))
sock.listen(3)
print('tcpServer listen at: %s:%s\n\r' %(HOST,PORT))
while True:
client_sock,client_addr=sock.accept()
print('%s:%s connect' %client_addr)
while True:
recv=client_sock.recv(BUFFER)
if not recv:
client_sock.close()
break
print('[Client %s:%s said]:%s' %(client_addr[0],client_addr[1],recv))
client_sock.send('tcpServer has received your message')
sock.close()
client.py
import socket
HOST='127.0.0.1'
PORT=9527
BUFFER=4096
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((HOST,PORT))
sock.send('hello, tcpServer!')
recv=sock.recv(BUFFER)
print('[tcpServer said]: %s' % recv)
sock.close()
3 http协议
http相关的术语
http: Hyper Text Transfer Protocol,80/tcp
html: Hyper Text Markup Language 超文本标记语言
CSS: Cascading Style Sheet 层叠样式表
js: javascript
MIME: Multipurpose Internet Mail extensions 多用途互联网邮件扩展
常用的MIME类型在 /etc/mime.types
格式: major/minor
常见类型:
text/plain 文本文件
text/html html文件
text/css css文件
image/jpeg jpeg图片文件
image/png png 文件
video/mp4 mp4音频文件
application/javaScript javascript文件
http工作机制
http请求: http request
http相应: http response
一次http事务: 请求<-->相应
web资源: web source
一个网页由多个资源构成,打开一个页面,会有多个资源展示出来,但是每一个资源都要单独请求.因此,一个"web" 页面通常并不是一个单独资源,而是一组资源的集合
静态文件: 无需服务端做出额外处理
文件后缀:.jpg, .html, .txt, .js, .css, .mp3, .avi
后端文件: 服务端执行程序,返回执行的结果
文件后缀: .asp, .php, .jsp
URI: Uniform Resource Identifier 同一资源标识符,分为URL和URN
URN: Uniform Resource Naming,统一资源命名,如P2P磁力链接
URL: Uniform Resource Location,统一资源定位符,用于描述某一服务器特殊资源位置
两者区别: URL如同一个人的名称,而URL代表一个人的地址.换而言之,URN定义某事物的身份,而URL提供查找该事物的方法.URN仅用于命名,而不指地址
网站访问量
IP(独立IP):即Internet Protocol,指独立IP.一天内来自相同客户端IP地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
PV(访问量):即Page View,页面浏览量或点击,用户每一次刷新即被计算一次,pv反应的是浏览某个网站的页面数,pv与来访者数量成正比,pv并不是页面的来访者数量,而是网站被访问的页面数量
UV(独立访问): 即Unique Visitor,访问网站的一台电脑为一个访客.一天内的客户端被计算一次,可以理解成访问摸个网站的电脑的数量.网站判断来访电脑的身份是通过来访者cookies实现的.如果更换了IP后但不清楚cookies,在访问相同网站,该网站的统计中UV数是不变的
web访问的响应模型(web I/O)
单进程I/O模型:启动一个进程处理用户请求,而且一次只请求一个,多个请求被串行响应
多进程I/O模型: 并行启动多个进程,每一个进程响应一个连接请求
复用I/O结构: 启动一个进程,同事响应N个连接请求
实现方法: 多线程模型和事件驱动
多线程模型: 一个进程生成N个线程,每线程响应一个请求
事件驱动: 一个进程处理N个请求
复用的多进程I/O模型: 启动M个进程,每一个进程响应N个连接请求,同时接受M*N个请求
一次访问网页的过程
1 客户端建立连接tcp(三次握手)
2 服务器端接受请求
根据服务器端的运行模式(httpd服务的三种工作模式prefork,worker,event
prefork 就是响应模型中的多进程IO模型
worker 就是响应模型中的复用多进程IO模型
event 是worker进程的变种,添加监控机制
3 根据客户端的请求方法,服务器端处理请求
http/1.1 常用的请求方法
GET, POST, HEAD, PUT, DELETE, TRACE, OPTIONS
4 根据请求进行访问资源
如果是静态资源,直接找到返回客户端,动态资源,经过处理返回客户端
5 构建访问报文,以便返回客户端
1xx 100-101 信息提示
2xx 200-206 成功类的响应
3xx 300-305 请求重定向
4xx 400-415 错误类信息 客户端错误 如请求的资源不存在
5xx 500-505 错误类信息 服务器端错误
常用的状态码
200 成功 请求的所有请求所有数据通过响应报文的entity-bidy 部分发送 ok
301 请求的URL 指向的资源已经被删除,但在响应报文中通过首部location指明了资源现在所处的新位置:moved permanently
302 与301相似,但在响应报文中通过location指明资源现在所处临时新位置;found
304 客户端 发出了条件式请求,但服务器上的资源未曾发生变化,则通过响应状态通知客户端,not modified
401 资源存在 但是需要输入账号和密码 需要认证
403 请求被禁止
404 访问的资源不存在
500 服务器内部错误 internal server error
502 代理服务器后端服务器收到一个伪响应 Bad Gateway
6 发送响应报文给客户端
7 记录日志
http 请求报文包括三部分
开始行,首部行,主体
<method> <url> <version>
字段名: 值
...
主体
http 响应报文的三部分
开始行, 首部行,主体
<version> <status> <reason-phrase>
字段名: 值
...
主体
httpd介绍
20世纪90年代初,国家超级计算机应用中心NCSA开发
1995年开源社区发布apache(a patchy server)
ASF: Apache Software Foundation apache软件基金会
FSF: Free Software Foundation 自由软件基金会
特性:
高度模块化: core + modules
DSO: Dynamic Shared Object 动态共享模块(动态加载)
MPM: Multi-Processing Module(多路处理模块)
httpd 的主配置文件 /etc/httpd/conf/httpd.conf
httpd 的辅助配置文件 /etc/httpd/conf.d/*.conf
httpd 模块管理
默认/usr/sbin/httpd 其使用prefork
查看静态编译编译的模块
httpd -l
查看静态编译及动态加载的模块
http -M
修改httpd程序 默认是prefork 模式
vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{event,worker}
注意: 需要重新启动生效
主配置文件
prefork工作模式的设置
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256 如果 最大连接数大于maxclient 还可以生成的 进程数
MaxClients 256
MaxRequestsPerChild 4000 一个子进程 响应多少个之后 停止响应
</IfModule>
worker工作模式的设置
<IfModule worker.c>
StartServers 4
MaxClients 300 最大连接数
MinSpareThreads 25 最小空闲线程
MaxSpareThreads 75 最大空闲线程
ThreadsPerChild 25 每个进程可以启动的线程进数
MaxRequestsPerChild 0 每一个线程 响应的最大次数 0 表示不限制
</IfModule>
DSO(Dynamic Share module) 动态加载模块
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
模块路径可使用相对地址,相对于可使用相对地址
相对于ServerRoot(/etc/httpd)指向的路径而言的
/etc/httpd/modules/
定义 'Main' server 的文档页面路径起始位置
DocumentRoot "/var/www/html"
test/index.html --> http://domain:port/test/index.html
站点访问控制
可基于两种类型的路径指明对那些资源进行访问控制
文件系统路径:
<Directory ""></Direcotory>
<File ""></File> 可以使用通配符
<FileMatch ""></FileMatch> 可以使用pattern
URL 路径
<Location ""></Location>
<LocationMatch ""> </LocationMatch>
访问控制机制 httpd自带两种方式
基于来源地址 ip 可以伪装 不是太安全
基于账号
同时也可以使用satisfy any|all
any 指地址或用户认证任何一个通过都可以
all 指地址和用户认证都要通过
Directory的参数
1 Options
所有可以使用的设置 Indexes Includes FollowSymLinksSymLinksifOwnerMatch ExecCGI MultiViews
Indexs 索引 没有主页面 会把所有东西列出来 别人会把你的源码拖走的
FollowSymlinks 允许是跟踪符号链接文件
SymLinksifOwnerMatch 对上一个进行更严的限制 符号链接的文件和原文件 是同一个用户时
ExecCGI 是否允许 CGI
MultiViews 内容协商机制 一般不开启 进行浏览器显示协商 中文 英文
默认 -indexes -followsymlinks
2 AllowOverride all none 是否允许覆盖每目录 的访问控制
authconfig 关于认证的实现
Satisfy any 权限控制,ip 和用户账号 有一个验证通过,就可以访问
设置目录下的.htaccess
由主配置文件进行<file ^\.ht>order allow,deny deny from all</file> 进行控制
父目录中的.htaccess设置会影响子目录中的.htaccess设置
3 基于来源地址访问控制机制
order 检查次序,后面的先生效
Order allow,deny 白名单
Order deny,allow 黑名单
allow form
Deny form
来源地址
IP
NetAddr
172.18
172.18.0.0
172.18.0.0/16
172.18.0.0/255.255.0.0
<locationmatch "^/bbs/.*\.conf$">
</locationmatch>
定义默认主页面
DirectoryIndex index.html index.html.var 所有
配置httpd 的日志功能
错误日志
ErrorLog logs/error_log
LogLevel 日志级别
debug,info,notice,warn,error,crit,alert,emerg
访问日志
设定的日志设定
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
referer 从哪个页面跳转过来的,可以防盗链
%U url %f filename 磁盘路径的位置
调用上面的日志格式
CustomLog logs/access_log combind
路径别名
DocumentRoot "/www/htdocs"
http://www.johniu.top/download/bash-4.4.2-3.el6.x86_64.rpm
-->/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias /URL/ "/path/to/somewhere/" 前后的/ 要对应
Alias /bbs/ "/forum/htdocs/" 后面的路径为绝对路径 指系统的存在位置
http://www.johniu.top/bbs/inde.html
-->http://www.johniu.top/forum/htdocs/index.html
设定默认字符集
AddDefaultCharset UTF-8 设定默认的字符集
基于用户的访问控制
认证质询
WWW-Authenticate 响应码为401 拒绝用户端请求,并说明要求客户端提供账号和密码
认证
Authentication 客户端用户填入账号和密码后再次发送请求报文,认证通过,则服务器发送响应的资源
认证方法
basic 明文认证方案 http 自己的认证 还有 开发的app 也有认证 表单
digest 基于消息摘要认证 MD5 加密
安全域 需要用户认证后方能访问的路径
应该通过名称对其进行标识,并基于告知用户认证的原因
basic认证
1 定义安全域 定义要进行访问控制的设定
<Directory>
Options None
AllowOverride None
Authtype Basic
AuthName "String"
AuthUserFile "/path/to/some/file"
Require User username1 username2 或者 Require valid-user
</Directory>
允许账号文件中的所有账号登录
Requier valid-user
2 提供账号和密码文件 文本文件
使用htpasswd 命令创建 .htpasswd 文件
htpasswd [option] passwordfile usernaem
-c 第一次使用 创建 文件
-m md5 加密用户密码
-s sha 加密用户密码
-D username 删除用户
htpasswd -c -m /etc/httpd/conf.d/.htpasswd username
htpasswd -m /etc/httpd/conf.d/.htpasswd username
3 基于组账号认证
<Directory>
Options None
AllowOverride None
Authtype Basic
AuthName "String"
AuthUserFile "/path/to/some/file"
AuthGroupFile "/path/to/file"
Require group groupname1,groupname2
</Directory>
要提供 用户账号文件和组文件
组文件 每一行定义一个组,后面跟用户
groupname:username1 username2
虚拟主机
三种方式
1 基于IP
为每一个虚拟主机准备至少一个ip地址
2 基于port
为每一个虚拟主机至少一个专用的port 实践中很少用 port 一般就是80
3 基于host 封装 host 请求报文
可以混合使用上述三个方式中的任意方式
注意 一般虚拟主机不要和中心主机混用,所以,一般要是用虚拟主机,就先禁用中心主机
注释 DocumentRoot
每一个虚拟主机都有专用配置
<VirtualHost IP:PORT>
ServerName ""
DocumentRoot ""
ServerAlias 虚拟主机别名
ErrorLog
CustomLog
<Directory ""> 亦可以做认证
Options none
AllowOverride none
Order deny,allow 黑名单
Allow from IP/IPnet
Deny from IP/IPnet
AuthType basic dgest
AuthName "String" 提示信息
AuthUserFile
AuthGroupFile
Require group|user
</Directory>
</VirtualHost>
注意 httpd-2.2 要 使用虚拟主机基于主机名的话 要开启 NameVirtualHost *:80
httpd-2.4 不需要
如果开启虚拟主机,中心主机将会失效
内置的status 页面 一般在全局设置 查看服务器的 一些状态信息
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all 一般设置固定的 ip 可以访问这个页面
Allow from .example.com
</Location>
可以修改 ExtendedStatus On 查看更多的详细信息
可以通过curl http://ip/server-status echo $0 来查看服务器是否运行正常
welcome.conf 的设置
可以设置根的错误进行定义错误回复的页面