要经过Internet进行通讯,至少须要一对套接字;其中一个运行在客户端,定义了一个惟一的客户进程,称之为ClientSocket
,另外一个运行于服务器端面,定义了一个惟一的服务器进程,称为ServerSocket
。根据链接启动的方式以及本地要链接的目标,套接字之间的链接过程能够分为三个步骤:服务器监听、客户端请求、链接确认javascript
Socket套接字php
套接(Socket)字做用
进程间通讯(IPC)的一种实现,容许位于不一样主机(或同一主机)上不一样进程之间进行通讯和数据交换css
进程间通讯(IPC,Inter-Process Communication)指至少两个进程或线程间传送数据或信号的一些技术或方法html
Socket组成
IP地址和端口号,合称为套接字地址(socket address)java
开发程序时如何实现Socket通信
调用Socket API(封装了内核中所提供的socket通讯相关的系统调用),须要指定两项内容linux
AF_INET
:Address Family,IPv4 <==经常使用AF_INET6
:IPv6AF_UNIX
:UNIX文件,同一主机上不一样进程之间通讯时使用,不须要封装解封装,经过此文件通信SOCK_STREAM
:流,tcp套接字,可靠地传递、面向链接 <==经常使用SOCK_DGRAM
:数据报,udp套接字,不可靠地传递、无链接SOCK_RAW
:裸套接字,无须tcp或udp,APP直接经过IP包通讯
#API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工做机制的细节nginx
应用程序通信过程
开发一个能够和网络通信的应用程序,客户端和服务端相互通信,须要调用Socket相关的一些函数
web
通信过程正则表达式
套接字相关的系统调用:shell
函数 | 描述 |
---|---|
socket() | 建立一个套接字 |
bind() | 绑定IP和端口 |
listen() | 监听 |
accept() | 接收请求 |
connect() | 请求链接创建 |
write() | 发送 |
read() | 接收 |
close() | 关闭链接 |
HTTP相关术语
http
(Hyper Text Transfer Protocol, 80/tcp)超文本是由信息结点和表示信息结点间相关性的链构成的一个具备必定逻辑结构和语义的网络,可使单一的信息之间相互交叉“引用”
html
(Hyper Text Markup Language )超文本(index.html)显示效果
普通文本显示效果
CSS
(Cascading Style Sheet )js
javascript(与java没有关系)MIME
(Multipurpose Internet Mail Extensions)/etc/mime.types
HTTP协议历史
HTTP 协议不带有状态(记不住访问者是谁),每次请求都必须附上全部信息。请求的不少字段都是重复的,浪费带宽,影响速度
http/0.9:1991,原型版本
功能简陋,只有一个命令GET。GET /index.html ,服务器只能回应HTML格式字符串,不能回应别的格式
http/1.0:1996年5月
支持缓存(cache)
开始执行MIME,
引入更多method
头信息是 ASCII 码,后面数据可为任何格式,服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的做用。
缺点
每一个TCP链接只能发送一个请求,发送数据完毕,链接就关闭,若是还要请求其余资源,就必须再新建一个链接
http/1.1:1997年1月
Spdy:2009年
谷歌研发,解决 HTTP/1.1 效率不高问题
http/2.0:2015年
工做机制
一次HTTP操做称为一个事务,其工做过程可分为四步
Web资源:web resource
一个网页由多个资源构成,打开一个页面,会有多个资源展现出来,可是每一个资源都要单独请求。所以,一个“Web 页面”一般并非单个资源,而是一组资源的集合
HTTP链接方式
URI(Uniform Resource Identifier)
统一资源标识,分为URL和URN,URN使用的较少,因此不少时候说URI就是在说URL
schame
user
password
Host
port
path
params
query
frag
网站访问量
QPS= PV* 页面衍生链接次数/ 统计时间(86400)
并发链接数 =QPS * http平均响应时间
处理步骤
创建链接
客服向服务器发起请求,此请求包括一些数据报文的头部,包括(method:GET、POST/PUT/HEAD/DELECT等)
接收请求(可能会拒绝)
接收客户端请求报文中对某资源的一次请求的过程
处理请求
服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
访问资源
服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源
构建响应报文
一旦Web服务器识别出了资源,就执行请求方法中描述的动做,并返回响应报文。响应报文中 包含有响应状态码、响应首部,若是生成了响应主体的话,还包括响应主体
发送响应报文
Web服务器经过链接发送数据时也会面临与接收数据同样的问题。服务器可能有不少条到各个客户端的链接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录链接的状态,还要特别注意对持久链接的处理。对非持久链接而言,服务器应该在发送了整条报文以后,关闭本身这一端的链接。对持久链接来讲,链接可能仍保持打开状态,在这种状况下,服务器要正确地计算Content-Length首部,否则客户端就没法知道响应何时结束了
记录日志
最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务
元数据:请求报文首部
Web访问响应模型(Web I/O)
http请求报文
http回应报文
http服务器程序
应用程序服务器
提供http服务的应用,能够提供动态程序
市场统计
www.netcraft.com
特性
高度模块化:core(核心模块) + modules(辅助模块)
模块管理方式:
MPM工做模式
m*n
,占用资源少m*n
个,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又容许释放。这样加强了高并发场景下的请求处理能力httpd功能特性
正向代理
一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),而后代理向原始服务器转交请求并将得到的内容返回给客户端;使用缓存特性,能够减小局域网客户端带宽使用率;帮助客户端访问远程服务器
版本:
CentOS 6: 2.2
CentOS 7: 2.4
安装方式:
rpm:centos发行版,稳定,建议使用
编译:定制或特殊需求
相关文件
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
/usr/lib/systemd/system/httpd.service
/usr/lib64/httpd
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
默认http网页数据存放路径
/var/www/html
日志存放路径
软链接:/etc/httpd/logs
真实路径:/var/log/httpd
文件属主为root,Apache运行时会开启子进程,是能够写入的
主进程编号文件存放目录
/etc/httpd/run/httpd.pid
帮助文档包
httpd-manual
检查配置语法:
httpd –t
service httpd configtest
httpd配置文件的组成
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式
directive value
子配置文件之因此优先权高,是由于子配置文件是在主配置文件最后加载的,至关于变量赋值,后面进行的赋值会覆盖前面的
显示服务器版本信息
配置指令
各类级别显示效果,建议使用ServerTokens Prod
查看显示效果,能够经过网站F12查看请求报文,或者在命令行使用curl -I
修改监听的IP和Port
Listen [IP:]PORT
持久链接(Persistent Connection)
链接创建,每一个资源获取完成后不会断开链接,而是继续等待其它的请求完成,默认关闭持久链接
KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
MPM( Multi-Processing Module)多路处理模块
对linux而言,原本就是使用LWP(ligth weight process)机制
/etc/sysconfig/httpd
找到以下行,至关于变量,将值修改成对应模式,重启生效HTTPD=/usr/sbin/httpd.worker
httpd -M
httpd -l
(小L)ab
全面为ApacheBench,-c
表示并发访问个数,-n
最多访问次数DSO(Dynamic Shared Object)动态共享对象
定义’Main’ server的文档页面路径
DocumentRoot指向的路径为URL路径的起始位置
注意:SELinux和iptables的状态
DocumentRoot “/path”
定义站点主页面
主页面显示的内容默认值文件index.html,没有此文件会显示testing 123
站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制:源地址,用户帐号
访问控制路径格式
Options定义行为
Options
后跟1个或多个以空白字符分隔的选项列表,定义了用户在某个目录下的特定行为,在选项前的+,- 表示增长或删除指定选项/etc/httpd/conf.d/welcom.conf
定义的,改变此配置文件后缀,让其失效-Indexes
<Directory>
中“基于源地址”实现访问控制
与访问控制相关的指令能够放在指定目录下的.htaccess
(.htaccess为默认值,能够由AccessFileName在配置文件中自定义)文件中,覆盖以前的配置指令只对<directory>
语句有效
Allow Override
AllowOverride All
:AllowOverride None
:AllowOverride AuthConfig Indexes
:.htaccess
文件,实现目录访问控制,重启生效httpd2.2用于容许或拒绝的语句
directory
, .htaccess
中http2.4基于IP的访问控制
无明确受权的目录,默认拒绝
Require all granted
Require all denied
日志设定
在hpptd中日志分为访问日志和错误日志两类
错误日志:ErrorLog
级别 | 描述 | 示例 |
---|---|---|
emerg | 紧急状况系统没法使用 | “Child cannot open lock file. Exiting” |
alert | 必须当即处理 | “getpwuid: couldn’t determine user name from uid” |
crit | 关键条件,危险状况 | “socket: Failed to get a socket, exiting child” |
error | 错误条件 | “Premature end of script headers” |
warn | 警告信息 | “child process 1234 did not exit, sending another SIGHUP” |
notice | 正常但比较重要的信息 | “httpd: caught SIGBUS, attempting to dump core in …” |
info | 通常信息 | "Server seems busy, (you may need to increase StartServers, or |
debug | 调试级消息 | “Opening config file …” |
访问日志
参考帮助
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
定义日志格式:LogFormat format strings
符号 | 描述 |
---|---|
%h | 客户端IP地址 |
%l | 远程用户,启用mod_ident才有效,一般为减号“-” |
%u | 验证(basic,digest)远程用户,非登陆访问时,为一个减号“-” |
%t | 服务器收到请求时的时间,格式为[18/Sep/2011:19:18:28 -0400] |
%r | First line of request,即表示请求报文的首行;记录了这次请求的“方法”,“URL”以及协议版本 |
%>s | 响应状态码 |
%b | 响应报文的大小,单位是字节;不包括响应报文http首部 |
%{Referer}i | 请求报文中首部“referer”的值;即从哪一个页面中的超连接跳转至当前页面的,用于分析是否链接被盗用,是否由合做网站跳转过来 |
%{User-Agent}i | 请求报文中首部“User-Agent”的值;即发出请求的应用程序,用户使用的为那种浏览器 |
在配置文件中定义使用那种日志格式
CustomLog logs/access_log combined
修改日志时间格式
格式为%{format}t,设置帮助为man 3 strftime
例如:%{%Y-%m-%d %H:%M:%S}t 输出格式为[2018-09-30 09:18:32]
配置文件修改内容
设定默认字符集
中文字符集:GBK, GB2312(简体字), GB18030
定义路径别名
将DocumentRoo以外的目录,显示到网站上
Alias /URL/ "/PATH/"
基于用户的访问控制
认证质询
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供帐号和密码
认证:Authorization
客户端用户填入帐号和密码后再次发送请求报文;认证经过时,则服务器发送响应的资源
认证方式两种:
basic:明文
digest:消息摘要认证,兼容性差
安全域
须要用户认证后方能访问的路径;应该经过名称对其进行标识,以便于告知用户认证的缘由
用户的帐号和密码
虚拟帐号:仅用于访问某服务时用到的认证标识
帐号存储:文本文件,SQL数据库,ldap目录存储,nis等
basic认证配置示例:
提供帐号和密码存储(文本文件)
使用专用命令完成此类文件的建立及用户管理
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
选项 | 描述 |
---|---|
-c | 自动建立文件,仅首次时使用,再次使用会覆盖 |
-p | 明文密码 |
-d | CRYPT格式加密,默认 |
-m | md5格式加密 |
-s | sha格式加密 |
D | 删除指定用户 |
基于用户的访问控制示例
方法一:在配置文件中定义认证范围
方法2
在须要认证的目录下建.htaccess文件,将认证语法写入此文件,而后在配置文件中受权.htaccess
基于组帐号进行认证
远程客户端和用户验证的控制
实现用户家目录的http共享,只是共享其中的某个目录
基于模块’mod_userdir.so’实现
若是SELinux启用须要添加: http_enable_homedirs
ServerSignature On | Off | EMail
当客户请求的网页并不存在时,服务器将产生错误文档,缺省状况下因为打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息
ServerType inetd | standalone
设置独立或非独立服务,只适用于Unix平台
status页面
httpd经过内部的处理器Handler在其内部经过模块status_module
来额外提供服务器状态的页面
虚拟主机
基于一个主机,运行多个网站
实现方案:
注意事项
通常虚拟机不要与main主机混用;所以,要使用虚拟主机,通常先禁用main主机
禁用方法:注释中心主机的DocumentRoot指令便可
虚拟主机的配置方法:
其它可用指令:
ServerAlias:虚拟主机的别名;可屡次使用
ErrorLog: 错误日志
CustomLog:访问日志
<Directory “/path"> </Directory>
:受权
示例
准备工做,设计运行三个网站web1 、web2 、web3
分别为其创建html目录,并建立页面文件
</div> <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet"> </div>