Web Server
http:超文本传输协议,传输超文本文档的(html语言)
在早期html文档都是文本的形式,所以以ASCII码的形式来传输的,但是我们知道计算机是8个位为一个字节,而ASCII只用7个位就能够表示所有的字符,所以在ASCII中最高位永远是0,这也就是为什么一个文件在传输之后会变的大一点原因,这是因为 我们在传输的时候在最高位加了一个0.
而html在传输图片,音乐文件的时候,是以2进制形式传输,不过在早期所有的图片、音乐
也都是要先转换成文本文件才能传输,1Mb的2进制文件---->ASCII(7位有效,最高位为0)
而我们的文本传输8位有效。
http协议: 0.9 ---->1.0(基于TCP80) ---->1.1
我们的http在传输时,是使用文本传输,但是它依靠 MIME来传输2进制SMTP(sample mail tarnsfer protocol ):也是只能传输文本文件,后来为了传输2进制文件,将其做了改变成了MIME (Multipurpose internet mail extension)我们在浏览一些网页的时候会听到音乐,这主要是我们的浏览器以插件的形式来调用本地的音乐播放器,但是这是不安全的,如果对方发来某种形式的文件,能够调用你本地的shell,那岂不危险,所以插件是不能随意安装的。注意我们的浏览器本身是没有播放音乐的功能的,只是你的本机上的音乐播放器被调用的。
我们的一个网页(webpage)往往是有多个页面(object)所组成的,在http 1.0 以后引入了keepalive 保持连接使得我们的多个页面不用每次传输时都进行3次握手,也就是当第一个页面3次握手之后不是立刻断开连接,而是准许后续的页面来进行tcp的连接,一般来说我们通常会定义仅准许N个用户keepalive,而后面的用户让其等待并告诉他说服务器繁忙,所以对于非keepalive的用户,一旦自己断掉,后面的用户就会很容易的挤进来,而对于keepalive的用户来说他就会一直在一段时间内占用服务器的资源,这样往往会导致服务器的负载能力的下降,所以也是有一个值大概5秒的时间内是对用户进行保护连接的。所以说我们是否保持连接,是看我们的情况的,也就是说我们不会一直保持连接(防止空闲连接的占用资源),也不会让每个用户在访问每一个页面的时候都需要3次握手重新进行连接。但是有一种情况:如果一个连接在接上之后一直传输文件,这也是不好的(所以定义了一个参数来规定一次keepalive所能传输的文件个数,也就是说即便你没有超出5秒钟,但是传输的文件超过了要求的个数,就会立刻断掉连接,让其重新排队),所以在高压,高并发的服务器上一般关闭keepalive。
在CS 模式的web中。每一个用户的一个连接都是要使用一个独立的进程来响应在我们的web服务中使用apache (现在已经成为ASF基金会http://www.netcraft.com)全球60%的网络服务使用 httpd 在httpd ,中有一个MPM(multi processing module)多道进程模块,是专门来处理服务器与用户间的连接控制的。MPM对用户的连接控制有两种 1。是基于进程的 2.是基于线程的process 在基于进程模式中,b1 b2对相同网页的连接请求会打开两个不同的进程,这使的一个用户的进程的毁坏不会影响到其他用户的使用,注意一般我们apache中的MPM是基于进程的形式来对每一个用户的请求作出响应的,但是进程占用服务器的资源比较高,所以就出现了一种基于线程的模式来问多用户的访问提供响应,thread,使用线程的模式(我们知道进程是分配资源的单位,进程是有多个线程组成的,并且这些线程共享同一个进程的资源(打开的文件文件句柄、进程号、cpu时间片等)),也就是说多个用户b1 b2同时访问一个网页的时候,如果是基于进程实现,即便b1 b2访问的是同一个页面index.html,这个index.html也会在内存中被打开两次并且赋予给b1 b2不同的进程,如果我们是基于线程的话,我们只需要一个进程打开一次index.html文件,b1 b2则分别是打开index.html进程的线程,所以文件在内存中只需打开一次,且只有一个进程,并且关闭进程的时间也就缩短了,不过有一个问题,假如b1所在的线程崩溃了,或b1这个用户修改index.html文件,b2用户也是会受到影响的,基于线程的会大大的提高服务器的并发能力。所以说,我们的服务器是基于线程的还是基于进程的,主要看我们在搭建服务器的时候是看重并发能还是稳定性。
MPM: 包含有两种模块 面试很重要
prefork 完全基于进程的模式来进行会话,每一个会话都会基于一个独立的进程来响应的
一般来讲,当我们的http启动的时候,启动一个httpd进程,
1. 这是一个父进程专门为当用户建立会话的时候生成新的httpd的进程,
2. 并当用户访问进程结束的时候回收其资源
worker 完全基于线程的模式来进行会话
很可能会启动2个或者多个父httpd的进程,每一个httpd进程的多个线程对多个用户的请求进行分配,这样:
1。实现负载均衡,也就是每个进程都可以将其线程分配给用户请求响应,提高响应的速度
2. 可以防止一个进程崩溃、毁坏导致所有用户的崩溃
但是在我们的linux主机是基于进程控制的,也就是说线程和进程没有太大的区别它的线程不是真的线程,线程的实现并不明显,所以在linux的服务器上prefork和worker的性能区别不大,所以在我们的linux主机上多使用prefork ,但是对于原生就能很好支持线程的操作系统solarus或windows,在上面worker比prefork强很多!
URL:统一资源定位符,就是用来定义从很多的网页页面中选取某个特定的页面
protocol://FQDN/path/to/file
eg: http://www.isc.org/index.html
http协议有8种动作对指定资源不同操作的方式:这里讲写主要的
OPTIONS(测试服务器的功能性的请求)
HEAD (每次向服务器发起请求,只显示协议响应本身,不下载index数据, ]#curl -I http://www.sohu.com 在这个命令的显示信息中有一个FSS-Cache,叫做缓存命中 ,这说明我们获取的www.sohu.com的资源不是从主机过来的,而是从同你在一个区域内的服务器上获得的,也就是说sohu已经将数据缓存到你家门口了,你访问的是一个sohu的缓存服务器,这样加快访问速度,所以说构建一个高并发的服务是很复杂的,需要用到智能DNS,缓存啊,等等)
GET(向对方服务器发起请求,并将数据下载下来)
POST(我们提交的表单数据会被Server处理的,但是服务器为了安全必须对提交的数据进行安全检查)
PUT(向远程服务器上传网页数据用的,这很危险和ftp的put一样,所以在网络中一般禁用)
CONNECT(能够将连接改为管道方式的代理服务器)
DELETE(删除指定的资源)
TRACE(回显服务器受到的请求)
所以通过上面的方法,我们在架站的时候可以定用户可以使用什么样的请求,这样也可以加强安全
注意:http仅仅是一种web协议
web server software
apache httpd
sun sws(sun web server)
nginx 后起之秀,站在前人的肩膀上,对于静态网页响应的非常的快
但是在动态网页方面就不太好了(因为这个速度是取决于后台处理器的速度)。所以在web服务中nginx一般做前端以非常小的内存提供很强大的高并发web服务,有人做过实验4G内存apache最多提供3000用户的同时连接,而同样条件的nginx能够实现30000个同时连接。 但是apache还是比较强的,现在2011年11月份打开占到市场65%而nginx占到8.5%,在国内qq 、腾讯的前端好像是nginx的
microsoft IIS IDC领域用到的多
NCSA 美国高性能计算 1999年解散,但是之前研发出来的一款产品就是apache的前身,所以在加上个样的补丁就成了今天的apache
google GWS
lighttpd 德国的据说和nginx差不多,据说性能相当的好
但是这些都是纯粹的html服务器,只是解析.html文档的软件
中间件 Web application server web应用服务器
IBM: Websphere 市场占用率40% 部署,安装,操作都是很困难的 商业软件
BEA:Weblogic---->Oracle(拉力尔森)市场占有率 30% 商业软件
Oracle: oc4j 商业软件
Apache: Tomact 小弟,严格来讲只能是后端的容器 开源的软件
Resin: 小企业在部署的时候都是用到这个软件 开源的软件
静态网页:
动态网页:基于不同用户的不同要求(基于用户的地域、用户名)响应不同的页面,这主要是靠服务器端根据用户的不同先处理一下,临时生成的网页,本身是靠一个程序在服务器端执行一下,然后把执行的结果格式化(formard)成html文档 c,c++,perl,python都是可以开发的动态网页的,例如用c语言开发的一个网页主页index.c,当用户来请求的时候,这个ndex.c需要运行起来,但是我们存放index.c的仅仅是一个只能够解析html文档的web server如apache、nginx,但是通过我们在配置文件配置(apache中/etc/httpd/conf/httpd.conf 中添加Addtype)成在某种情况下(包含了某种程序源代码的)将这个程序提交给能够执行改程序的2进制文件运行一下,所以这时我们apache会调用本地的C执行工具,将其加载到内存中运行(执行程序,将结果先格式化为html的文档),然后再将格式化的html结果返回给web服务器,最后在返回给用户。这个apache调用本地的c执行程序师通过CGI(common gateway interface)来实现的,注意web server不能随意调用本地程序的,万一web server被黑掉,能够执行、调用你本地程序,先给你传递一个bash脚本,运行一下,我们的主机就完了 。所以CGI就是一个能够跟本地的可执行程序,一个语言解释器进行交互,一旦发现在网页的源代码中包含了某种特定的语言,就会启动一个对应的语言解释器进程来进行解释,并将解释后得到的结过取回来交给web server.但是C C++都是编译型语言,不过实现的功能强大,执行效率高,源代码是现需要编译然后才能运行的,所以大多数网页的编写都是使用脚本语言(解释型语言,不需要编译就能够直接执行的)来编写的,这种速度快,易于修改,但是功能低,所以jsp(java server pages)将一些语言生成中间字节码,执行效率高,功能强大,我们通常不用c\c++\perl来开发网页,1。这些语言需要先编译在执行 2.这种语言在执行的时候需要的系统权限比较高,风险性大
动态页面中web server 和语言解释器之间连接方式:
1.CGI
因为动态的网页的响应速度要比静态网页响应速度慢10倍以上 ,并且需要web server 和语言解释器联系,对应语言的解释器要首先从磁盘中读入内存中,在内存中在同过新的进程执行,然后将结果返回给web server,并且100用户的动态网页请求,要在内存中启动100个语言解释器进程,在进程结束时,还要收回进程,这样动态语言就会在执行起来的时候很慢,
2.fast CGI,FastCGI:就是将CGI做成某种服务,并工作在某个特定的端口上,这个服务有点像我们的httpd一样首先差生多个子进程专门等待用户的动态访问请求
3.直接将对应的语言做成模块嵌入到apache中去,这样对应的语言是作为apache的一部分存在,在需要的时候模块被装载进去进入apache的地址空间当中运行,而不是在外面调用运行的
web application server :就是将我们的web server和我们的语言解释器结合起来,整合在了一起,只不过很多用来解释java语言,而我们的中间件就是将web server和 CGI、fastCGI、模块 整合在一起。
cms 静态化技术,将我们的动态的网页转化为静态页面。
如果我们的用户量提高
我们会在前面的多台 web sever 我们使用rsync 实现类似DNS主从服务器的同步
只要在一台主机上修改其他全部的服务器都能实现同步
数据库:
关系性数据库
LAMP 简单的介绍
http://www.apache.org
apache 是一个软件基金会,现在已经不仅仅是在维护httpd
http://httpd.apache.org 是一个关于站内httpd的一个连接
apache httpd 两个系列
1.x 2.x(2.0 2.2)
1.x :以稳定为准,每有添加进来新的功能
2.x :简化了配置,使得我们维护起来比较简单,有很多的新的功能。2.2比2.0更注重产品的新功能。 2.2 2.0是连个都在维护的版本
yum install httpd 注意对yum不能同时开启两个进程
httpd 进程名
apache 是用户名,是运行httpd的身份
/etc/init.d/httpd 主程序文件
/etc/httpd/ 是配置文件目录
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/*.conf 配置文件,可以在主配置文件以include包含进来,这里是存放着apache模块所在的位置,如ssl。且在这里有一个welcome.conf的apache测试页面
/var/www/html ,默认网页的存放位置,我们可以转换的,但是这个httpd服务受到selinux 的控制
httpd.i386 主程序包 ,我们只需要安装这个包就行了
httpd-manual 手册包
httpd-devel 这是开发包
apache 在启动的时候会自动探测主机名的,只有主机名能够解析成ip 或ip反解成主机名就行了,否则会报错,不过我们可以更改/etc/sysconfig/network和/etc/host这个文件的记录,同时需要我们将httpd.conf这个文件中ServerName进行修改
apache 配置文件:/etc/httpd/conf/httpd.conf文件
httpd.conf 这个文件中的格式:parameter value
parameter(指令) 通常是不区分大小写的,但是在redhat官方一般每一个单词的首字母是要大写的 eg:ServerRoot
value (参数值) 这个要注意大小写
httpd.conf 文件包含3部分组成
section 1 Global Envirment
section 2 Main server configuration
section 3 Virtual Host
Section 1 Global Environment
ServerRoot "/etc/httpd" 注意这个不要修改,这是redhat官方巧妙设计的
Pidfile 大多数启动服务的进程号都是保存在/var/run/中的,例如httpd.pid,这个文件用来标示我们服务运转正常,是我们的服务脚本用来判断此进程是否处在正常运行的一种手段,例如我们使用 service httpd status 来查看
httpd进程状态的时候就是来查看/var/run/httpd.pid这个文件的,我们的/etc/init.d/httpd启动脚本就是依靠
pidfile来启动、关闭、重启httpd进程的
TimeOut tcp三次握手超时时间
keepalive off keepalive的功能是否开启 不过keepaliveoff之后,下面的两项就没有意义了
maxkeepaliverequests 100 当用户在保持连接的时候下载、读取文件的个数
keepAliveTimeOut 15 用户保持连接的时间长度
MPM (multi process modules)这里我只讲prefork,不讲worker,因为redhat提供的httpd是不支持worker模式的
StartServers 8 服务刚启动时产生相应用户httpd请求的进程,
但是这8个apache进程是由一个root产生的,这8
个进程如何监听用户请求的?这8个进程都是处在
静止状态,但是这个进程没有结束,时刻等待着接受请求
ps aux | grep httpd 查看我们主机上启动了多少个httpd进程
strace -p 12736 追踪12736进程的状态
apache 的测试工具 ab(apache benchmark)
]#ab -c 1000 -n 10000
]#swatch -n.5 `ps aux | grep httpd` 在服务器端每个0.5s刷新一次后面执行的命令结果,
MinSpareServers 5 最少空闲几个等待连接请求
MaxSpareServers 20 最大空闲几个
ServerLimit 256 对maxclients上在有限的时限内最多开启254个进程
MaxClients 256 准许启动的最大的并发个数,也就是说最多256个用户同时连接进来,这个值是不小的 254*86400/10 这也是一天10万以上的请求了
MaxRequestsPerChild 4000 一个服务器进程能够响应用户4000次之后就关掉了。
http协议是一种无状态协议:因为每个用户连接请求完之后就立刻断了,用户并发同时连接就是采取了在某一时刻总共有
多少用户同时连进来个数的峰值。
Lsiten 80 监听的端口 如果我们写成 Listen 192.168.0.181:80 只监听192.168.0.181服务器特定80端口,listen是可以指定多个listen的
LoadModule apache是模块化设计的,这里就定义了我们apache所装载的模块
Include conf.d/*.conf
User apache 运行httpd的用户
Group apache 运行httpd的组
Section 2 Main server configuration
默认一个刚装好的httpd,只能提供一个http服务
如果我们想在一台主机上提供多个不同的站点如:www.yayu.com;www.a.com;www.b.com,在web serverhttpd上,这就是虚拟主机。
注意任何一个独立完整的服务都是要一个套接字socket: IP:PORT来提供
但是我们的虚拟主机和mainServer不能同时使用
mainServer
Serveradmin [email protected] 服务器管理员邮箱地址
ServerName www.yayu.com 当前服务器站点的名称
DoumentRoot "/var/www/html" 存放网页的位置的
不过这个受selinux的控制。
#chcon -R --reference=/var/www/html /www 将我们的/www目录的标签进行照/var/www/html的标签进行修改,这样我们就不用修改selinux就可以实现网页目录不同的存放位置
#ll -dZ /www 这样可以查看/www的标签
Option 这是一个容器,这个容器的意思就是说,这里面定义的东西只是对我们容器Directory后面跟的目录生效
Options 表示用户访问的时候是以什么样的形式来进行访问的
index 将我们的/var/www/html下的文件在没有主页的时候所以索引的方式显示个大家,注意这个很危险,一般关掉index
Multiviews 自动协商的,就是用户的浏览器如果是支持中文的,就将中文的显示给他,如果是英文的就将英文的显示给他,很多高级服务器都会开启这个选项的
FollowSymlinks 表示将我们的/var/www/html下如果有符号连接的文件,就将连接到的文件显示个用户
AllowOverride none none表示不准许覆盖,提供文件的访问控制并覆盖掉下面(Order Allow的两行)的访问控制
Order allow,deny Order表示次序的意思,先allow后deny,放在后面的是默认法则,allow 是准许下面定义的allow from 192.168.0.0/24网段中的主机(所有的)来访问,而其他的决绝访问
Allow from 192.168.0.0/24 这样就实现了基于ip地址的访问控制
DocumentRoot "/var/www/html"
ServerName
AllowOverride AuthConfig 这里我们是使用了AuthConfig的基于虚拟用户的访问控制,覆盖掉了Order和Allow的两行访问控制
AuthName "hdhddhdd"
AuthType basic
AuthUserFile /etc/httpd/.htpasswd
Require valid-user (准许所有合法的用户)
CustomLog /var/log/httpd/access_log combined 显示谁访问过http服务日志的记录格式是combined的形式
ErrorLog /var/log/httpd/error_log 指定访问出现错误的日志信息
htpasswd -c (第一次用) -m(md5) passwdfile username eg:#htpasswd -c -m /etc/httpd/.htpasswd tom 将tom用户添加到/etc/httpd/.htpasswd文件中并使用MD5的加密方式为其密码加密
htpasswd 用来生成/.htppasswd文件
Order allow,deny 基于ip地址的访问控制
Allow from 192.168.0.0/24 172.16.0.0/24
DiretoryIndex home.html index.html 第一个被匹配到的就被当做主页,不过注意一点在安装完php的时候定义php主页index.php的文件会被Include将其提前包含进来
ErrorLog logs/error_log 错误日志记录的位置,注意这里是一个相对于ServerRoot定义的目录/etc/httpd/,在/etc/httpd/下有很多的连接文件是链接到/var/log/httpd/目录下的文件的
LogLevel warn 日志级别,warn以上级别的日志要被记录,注意错误日志的记录级别不能低了,否则对于一个繁忙的站点,会产生大量的磁盘读取,降低系统性能的
logformat 日志格式,有combined common agent,(从详细到简单,注意这些日志模式仅被CustomLog所使用)
CustomLog logs/access_log(日志路径) combined(日志格式)
有的时候对于繁忙的站点 错误的日志,访问日志会被放在一个单独的磁盘上,供以后进行日志挖掘,但是我们的需要注意的是,记录日志的文件、目录的属组、属主都是root,并不需要apache
这是因为任何小于1024的端口都是root身份才能开启的,只不过是在启动完httpd之后切换到apache来运行httpd服务的
Alias 可以帮助用户使用简单的模式访问不在DircetoryRoot路经中的文件
Alias /bbs "/test/bbs" 路径别名,主要作用是将不在本网站服务器中引用的路径下的目录中的网页文件,能够基于当前网站的url的格式实现引用的 例如:当前DocumentRoot “/www” 而我们想访问
的网页文件是/www/bbs,我们只需要输入http://172.16.100.1/bbs就行了,因为http://172.16.100.1等于/www.不过现在想象一下,假如我们的bbs不是在/www下,而是在/test/bbs,如果我们这里
不定义别名的话,我们是无法访问的,因为我们定义了DocumentRoot "/www".所以alias就可以帮助我们使用http://172.16.100.1/bbs的格式来访问一个不在DocumentRoot中所指定路径位置
ScriptsAlias /cgi-bin/ "/var/www/cgi-bin/" 脚本别名 表示使用http://172.16.100.1/cgi-bin/就可以访问存放在/var/www/cgi-bin/目录下cgi格式的动态网页文件,例如我们用C c++ perl python
写的网页就可以这样表达,不过我们一般在使用cgi的时候一定会跟上一个
AddDefaultCharset UTF-8 指定默认字符集的编码,这个一般往往会造成网页乱码的,因为我们有的时候装进去的网页不是用UTF-8编码写的,所以最好我们注释掉
AddType application 在apache的基础上增加一些新的文件编码
service httpd configtest======httpd -t 检查语法错误的
Section 3 Virtual Hosts
在同一个物理机上实现多个主机服务
任何一个网站都是需要一个独立的套接字Socket IP:PORT
基于IP地址的方式提供
192.168.106.3:80
192.168.106.4:80
基于端口的方式:
172.168.106.3:80
172.168.106.3:8080
基于主机头的方式:172.168.106.3:80 靠应用层中的请求url的不同路径来实现不同的服务器服务
www.yayu.com
ftp.yayu.com
不过我们的main主机不能和虚拟主机共同使用的
只要#DriectoryRoot就行了
基于IP
1 listen 80
2 注释DocumentRoot
3
Servername
DocumentRoot "/web/yayu.com"
Servername
DocumentRoot "/web/a.com"
基于端口
1 Listen 8080
listen 80
2 注释DocumentRoot
3
Servername
DocumentRoot "/web/yayu.com"
Servername
DocumentRoot "/web/a.com"
基于主机头的虚拟主机
1 Listen 80
2 架设DNS
3 NameVirtualHost *:80
4 注释DocumentRoot
5
Servername
DocumentRoot "/web/yayu.com"
Servername
DocumentRoot "/web/a.com"
ErrorLog /var/log/httpd/a.com/error_log
CustomLog /var/log/httpd/a.com/access_log
……
……
DocumentRoot "/web/yayu.com" 定已使用默认虚拟主机
如果我们的
SSl会话过程,基于ssl的https 注意http https是两个不相关的服务,只不过大多数web server都是能够支持这两种服务存在的
https= http+ssl/tls 443端口
http 80端口
ssl建立会话的过程
1.C---->S ssl/tls
2.双方协商加密的算法如3des
3.S-(Certificate)--->C
4.C-(verify Cert 验证证书,在C本机上都是有一个手信任的根证书列表,里面有本机信任的CA的证书)->S
5.C--->send passwd ---->S
6.S--->用passwd将page加密--->C
1.ssl会话只能建立基于ip来实现,也就是说ssl会话不能为每一个虚拟主机提供,也就是说只能支持一个主机或一个虚拟主机提供
2.httpd 默认是不支持ssl 需要安装mod_ssl 这样才可以使用
]#yum install mod_ssl
这样安装完之后会在/etc/httpd/conf.d/目录下有一个ssl.conf的文件
然后自建CA
生成私钥 /etc/pki/CA/private/CA.pem
生成子签证书:
生成证书 /etc/pki/CA/CA.crt
在/etc/httpd/ 下创建ssl目录又来存放httpd服务的证书(crt)、私钥(pem)
生成httpd的私钥
在 /etc/httpd/ssl/httpd.pem
生成httpd的证书
在 /etc/httpd/ssl/httpd.crt
修改/etc/httpd/conf.d/ssl.conf文件
1 DocumentRoot "/" 这里填写你要使用ssl 存放网页的目录地方
2 ServerName
3 SSLCertificateFile /etc/httpd/ssl/httpd.crt
4 SSLCertificateKeyFile /etc/httpd/ssl/httpd.pem
5 SSLCertificateChainFile 这个是服务器验证客户端用的,
6 SSLCertificateFile 这也是服务器用来验证客户端用的。