Apache服务搭建与详解
0.Internet与中国
1885年台湾建省,首任巡抚刘铭传派人与福州船政联系,使用船政电报学堂毕业生为技术人员,于1887年铺设成功台湾淡水至福州川石海底电缆,
全长117海里。这是我国自行设计安装的第一条海底电缆。此电缆毁于第二次世界大战
我国于1989年开始投入到全球海底光缆的投资与建设中来,并于1993年实现了首条国际海底光缆的登陆(中日之间C-J海底光缆系统);随后在
1997年,我国参与建设的全球海底光缆系统(FLAG)建成并投入运营,这也是第一条在我国登陆的洲际海底光缆
中国连接世界目前共有8条光缆,四个登陆站允许入境,目前我国的登陆站设立在三个城市的四个地区,分别是山东青岛登陆站(隶属中国联通)、
上海崇明登陆站(隶属中国电信)、上海南汇登陆站(隶属中国联通)和广东汕头登陆站(隶属中国电信)
1987年9月20日,在北京ICA王运丰教授和西德卡尔斯鲁厄大学维尔纳·措恩教授的主导下,中华人民共和国大陆地区与外界互联网创建了首个连接。
而中国第一封成功对外发出的电邮则是在1987年9月14日发出,内容为“Across theGreat Wall, we can reach every corner in the world”(越
过长城,走向世界每个角落)
北京时间1987年9月20日,钱天白建立起一个网络节点,通过电话拨号连接到国际互联网,向他的德国朋友发出来自中国的第一封电子邮件:
Across the Great Wall we canreach every corner in the world,自此,中国与国际计算机网络开始连接在一起。
1990年10月
钱天白教授代表中国正式在国际互联网络信息中心的前身DDN-NIC注册登记了我国的顶级域名CN,并且从此开通了使用中国顶级域名CN的国际
电子邮件服务。由于当时中国尚未正式连入Internet,所以委托德国卡尔斯鲁厄大学运行CN域名服务器
1993年3月2日
中国科学院高能物理研究所租用AT&T公司的国际卫星信道接入美国斯坦福线性加速器中心(SLAC)的64K专线正式开通,专线开通后,美国政府
以Internet上有许多科技信息和其它各种资源,不能让社会主义国家接入为由,只允许这条专线进入美国能源网而不能连接到其它地方。尽管如此
,这条专线仍是我国部分连入Internet的第一根专线
1994年4月20日
中国实现与互联网的全功能连接,被国际上正式承认为有互联网的国家
1994年5月21日
在钱天白教授和德国卡尔斯鲁厄大学的协助下,中国科学院计算机网络信息中心完成了中国国家顶级域名(CN)服务器的设置,改变了中国的CN顶级域
名服务器一直放在国外的历史
1996年1月
中国互联网全国骨干网建成并正式开通,开始提供服务
1.http通信原理
基本TCP客户/服务器程序的套接字函数
套接字相关的系统调用:
socket():创建一个套接字 ----- bind():绑定IP和端口 ------ listen():监听 ------ accept():接收请求
connect():请求连接建立 ------ write():发送 ------ read():接收 ------ close():关闭连接
Socket通信示例:服务器端tcpserver.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()
Socket通信示例:服务器端tcpclient.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()
http服务通信过程
Http相关术语
http: Hyper Text Transfer Protocol, 80/tcp
html: Hyper Text Markup Language超文本标记语言,编程语言
示例:
<html>
<head>
<title>html语言</title>
</head>
<body>
<h1>标题1</h1>
<p><a href=http://www.cnblogs.com/heiye123/.com>黑夜</a>欢迎你</p>
<h2>标题2</h2>
</body>
</html>
CSS: Cascading Style Sheet层叠样式表
js: javascript
MIME: Multipurpose Internet Mail Extensions 多用途互联网邮件扩展 (在/etc/mime.types)
格式:major/minor
text/plain
text/html
text/css
image/jpeg
image/png
video/mp4
application/javascript
2.http协议介绍
http/0.9:1991,原型版本,功能简陋,只有一个命令GET。GET /index.html ,服务器只能回应HTML格式字符串,不能回应别的格式
http/1.0: 1996年5月,支持cache, MIME, method,每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须
再新建一个连接引入了POST命令和HEAD命令,头信息是 ASCII码,后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式,即
Content-Type字段的作用。这些数据类型总称为MIME多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义的类型,也可自定义类型。
常见Content-Type值:text/xml 、image/jpeg 、audio/mp3等。
http/1.1:1997年1月,引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive
。对于同一个域名,大多数浏览器允许同时建立6个持久连接;引入了管道机制(pipelining),即在同一个TCP连接里,客户端可以同时发送多个请求,
进一步改进了HTTP协议的效率
新增方法:PUT、PATCH、OPTIONS、DELETE,同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,
会有许多请求排队,造成"队头堵塞"(Head-of-line blocking)
为避免上述问题,两种方法:一是减少请求数,二是同时多开持久连接。网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片等
HTTP 协议不带有状态,每次请求都必须附上所有信息。请求的很多字段都是重复的,浪费带宽,影响速度
Spdy:2009年,谷歌研发,解决 HTTP/1.1 效率不高问题
http/2.0:2015年,头信息和数据体都是二进制,称为头信息帧和数据帧复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回
应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通信称为多工(Multiplexing)
引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存
入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
HTTP/2允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
http工作机制:
静态文件:无需服务端做出额外处理,文件后缀:.jpg, .html, .txt, .js, .css, .mp3, .avi
动态文件:服务端执行程序,返回执行的结果,文件后缀:.asp, .php, .jsp
提高HTTP连接性能:
并行连接:通过多条TCP连接发起并发的HTTP请求
持久连接:keep-alive,长连接,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
管道化连接:通过共享TCP连接发起并发的HTTP请求复用的连接:交替传送请求和响应报文(实验阶段)
URI: Uniform Resource Identifier统一资源标识,分为URL和URN
URN: Uniform Resource Naming,统一资源命名-----示例: P2P下载使用的磁力链接是URN的一种实现
magnet:?xt=urn:btih:660557A6890EF888666
URL: Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置
两者区别:URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。
URN仅用于命名,而不指定地址
URL组成:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- schame:方案,访问服务器以获取资源时要使用哪种协议
- user:用户,某些方案访问资源时需要的用户名
- password:密码,用户对应的密码,中间用:分隔
- Host:主机,资源宿主服务器的主机名或IP地址
- port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
- path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
- params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
- query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
- frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
网站访问量
IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,
是衡量网站流量的重要指标。
PV(访问量):即Page View,页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,
PV并不是页面的来访者数量,而是网站被访问的页面数量
UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。
网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的
网站统计:http://www.alexa.cn/rank/
Web服务请求处理步骤:(一次完整的http请求处理过程)
Web访问响应模型(Web I/O)
单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求
复用I/O结构:启动一个进程,同时响应N个连接请求
实现方法:多线程模型和事件驱动
多线程模型:一个进程生成N个线程,每线程响应一个连接请求
事件驱动:一个进程处理N个请求
复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
3.http服务器应用
http服务器程序: ----- httpd apache-----nginx-----lighttpd
http:特性:
高度模块化:core + modules
DSO: Dynamic Shared Object动态加/卸载
MPM:multi-processing module多路处理模块
MPM工作模式
prefork:多进程I/O模型,每个进程响应一个请求,默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作work
进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,
并发响应请求:m*n
event:事件驱动模型(worker模型的变种)一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管
理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
httpd-2.2: event测试版,centos6默认 httpd-2.4:event稳定版,centos7默认
Httpd安装
版本:CentOS 6: 2.2 CentOS 7: 2.4
安装方式: rpm:centos发行版,稳定,建议使用 编译:定制或特殊需求
CentOS 6程序环境:httpd-2.2
配置文件:/etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
检查配置文件语法:
httpd –t
站点网页文档根目录:
/var/www/html
日志文件目录:/var/log/httpd 下 access_log:访问日志 error_log:错误日志
Httpd 2.2常见配置
httpd配置文件的组成:
# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式:directive value (directive:不区分字符大小写,value:为路径时,是否区分大小写,取决于文件系统)
yum -y install httpd
service httpd start
出现这种情况并不是什么错误,可以不用理会,就是配置文件里面缺名造成的,如果看着不顺眼可以修改以下
最好也把/etc/hosts也改了,就是在/etc/hosts 的127.0.0.1后面把主机名加上。
1.在这里把apache的版本号也显示出来了,这样是极不安全的,可以照下面的方法隐藏:改ServerToken那一行,默认full全显示
2.修改监听的IP和Port
Listen [IP:]PORT
(1)省略IP表示为0.0.0.0;(2) Listen指令至少一个,可重复出现多次;(3)修改监听socket,重启服务进程方可生效
Listen 172.18.64.106:80
Listen 192.168.64.106:8080
3.持久连接
4.更改httpd的MPM机制方式etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker重启服务生效 用pstree -p|grep httpd查看进程和线程
Httpd 2.4与之不同
以动态模块方式提供,配置文件:/etc/httpd/conf.modules.d/00-mpm.conf
httpd –M |grep mpm重启服务生效 pstree -p|grep httpd查看进程和线程
###查看静态编译的模块httpd -l
###查看静态编译及动态装载的模块httpd –M
###动态模块加载:不需重启即生效
###动态模块路径/usr/lib64/httpd/modules/
httpd-tools 里有个ab工具,可以测httpd性能,经测试prefork的效果比wrker更好(默认)ab -c 100 -n 1000 172.18.64.106/index.html
5. 定义路径别名
<directory /var/www/html/secret>
authtype basic
authname "secret directory"
authuserfile "/etc/httpd/conf.d/.httpusers"
require user centos
</directory>
测试登录,认证成功
<VirtualHostIP :PORT>
ServerName
FQDN
DocumentRoot
“/path"
</VirtualHost>
<VirtualHost172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost172.16.100.7:80>
ServerNamewww.b.net
DocumentRoot"/www/b.net/htdocs"
</VirtualHost>
<VirtualHost172.16.100.8:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
listen 808
listen 8080
<VirtualHost172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost172.16.100.6:808>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost172.16.100.6:8080>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
NameVirtualHost*:80 主配置文件中这一行需要打开,或者写在头部,httpd2.4不需要此指令
<VirtualHost*:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost*:80>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost*:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
8.status页面
把主配置文件中上面那段注释去掉,然后定义号合适的域信息,重启服务就能通过浏览器访问status界面。显示apache的各种status信息。
4.http协议详解
http协议 :http/0.9, http/1.0, http/1.1, http/2.0
- 1xx:100-101 信息提示
- 2xx:200-206 成功
- 3xx:300-305 重定向
- 4xx:400-415 错误类信息,客户端错误
- 5xx:500-505 错误类信息,服务器端错误
- 200:成功,请求数据通过响应报文的entity-body部分发送;OK
- 301:请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
- 302:响应报文Location指明资源临时新位置Moved Temporarily
- 304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
- 401:需要输入账号和密码认证方能访问资源;Unauthorized
- 403:请求被禁止;Forbidden
- 404:服务器无法找到客户端请求的资源;Not Found
- 500:服务器内部错误;Internal Server Error
- 502:代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway
- 503–服务不可用,临时服务器维护或过载,服务器无法处理请求
- 504网关超时
http协议首部
5.httpd调整优化
1.mod_deflate模块:使用mod_deflate模块压缩页面优化传输速度
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
把上面代码加到/etc/httpd/conf.d/目录下以conf结尾的文件中,如test.conf重启服务即可(默认的压缩比例为9,最高)
测试:源文件1.7M,实际压缩后只有150k左右,压缩效果非常明显
Header always set Strict-Transport-
Security "max-age=15768000"
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]
<VirtualHost *>
ServerName www.heiey.com
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
补充
1.若主配置文件和conf.d/下的文件各自都有定义且冲突,则主配置文件生效,nginx也是如此
2.若httpd中有啊allow和deny,则后者默认优先级高
3.若多个域名对应一个IP,到达同一主机,则服务器可通过识别请求指令的头部信息中的host信息把相应的虚拟主机信息回应给客户端。
4.curl工具