Apache和http服务

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 请求报文包括三部分
  开始行,首部行,主体
     
  字段名: 值
   ...

  主体
http 响应报文的三部分
  开始行, 首部行,主体
    
  字段名: 值
  ...
  
  主体
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工作模式的设置

  StartServers       8
  MinSpareServers    5
  MaxSpareServers   20
  ServerLimit      256 如果 最大连接数大于maxclient 还可以生成的 进程数
  MaxClients       256
  MaxRequestsPerChild  4000 一个子进程 响应多少个之后 停止响应

worker工作模式的设置

  StartServers         4 
  MaxClients         300   最大连接数
  MinSpareThreads     25    最小空闲线程
  MaxSpareThreads     75 最大空闲线程
  ThreadsPerChild     25 每个进程可以启动的线程进数
  MaxRequestsPerChild  0 每一个线程 响应的最大次数 0 表示不限制

DSO(Dynamic Share module) 动态加载模块
  配置指令实现模块加载
    LoadModule  
    模块路径可使用相对地址,相对于可使用相对地址
    相对于ServerRoot(/etc/httpd)指向的路径而言的
    /etc/httpd/modules/
定义 'Main' server 的文档页面路径起始位置
  DocumentRoot "/var/www/html"
  test/index.html --> http://domain:port/test/index.html
站点访问控制
  可基于两种类型的路径指明对那些资源进行访问控制
  文件系统路径:
    
      可以使用通配符
     可以使用pattern
  URL 路径
    
     
访问控制机制 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
    由主配置文件进行order allow,deny deny from all 进行控制
    父目录中的.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
    
    
定义默认主页面  
  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 定义安全域  定义要进行访问控制的设定

  Options None
  AllowOverride None
  Authtype Basic
  AuthName "String"
  AuthUserFile "/path/to/some/file"
  Require User username1 username2 或者  Require valid-user

允许账号文件中的所有账号登录
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 基于组账号认证

  Options None
  AllowOverride None
  Authtype Basic
  AuthName "String"
  AuthUserFile "/path/to/some/file"
  AuthGroupFile "/path/to/file"
  Require group groupname1,groupname2 

要提供 用户账号文件和组文件
  组文件 每一行定义一个组,后面跟用户
  groupname:username1 username2
虚拟主机
  三种方式
    1 基于IP
      为每一个虚拟主机准备至少一个ip地址
    2 基于port
      为每一个虚拟主机至少一个专用的port 实践中很少用 port 一般就是80
    3 基于host  封装 host 请求报文
      可以混合使用上述三个方式中的任意方式
    注意 一般虚拟主机不要和中心主机混用,所以,一般要是用虚拟主机,就先禁用中心主机
    注释 DocumentRoot

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

  ServerName ""
  DocumentRoot  ""
  ServerAlias 虚拟主机别名
  ErrorLog
  CustomLog
    亦可以做认证
    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

  
注意 httpd-2.2 要 使用虚拟主机基于主机名的话 要开启 NameVirtualHost *:80
httpd-2.4 不需要
如果开启虚拟主机,中心主机将会失效
内置的status 页面 一般在全局设置 查看服务器的 一些状态信息

  SetHandler server-status
  Order deny,allow
Deny from all  一般设置固定的 ip 可以访问这个页面
Allow from .example.com

可以修改 ExtendedStatus On 查看更多的详细信息
可以通过curl http://ip/server-status echo $0 来查看服务器是否运行正常
welcome.conf 的设置
  可以设置根的错误进行定义错误回复的页面

你可能感兴趣的:(Apache和http服务)