先上结论:Web服务器和应用服务器都是HTTP服务器,即提供http服务的服务器。
什么是服务器(server)
一般来说,server 有两重意思:
- 有时候 server 表示硬件,也就是一台机器。它还有另一个名字:「主机」。
- 更多时候,server 表示软件程序。这种程序主要用来对外提供某些服务,比如邮件服务、FTP 服务、数据库服务、网页服务等
作为开发者,我们说 server 的时候,一般指的后者,也就是一个 24 小时运行的软件程序。
一台主机上面可以运行多个这样的程序。
什么是 Web Server
顾名思义,Web Server 就是提供 Web 服务的 Server
e.g. 我们访问http://baidu.com,其实就是在使用百度的 Web Server 提供的服务
一般来说, Web Server 的作用是对外提供 HTTP 服务,这就是为什么我们的网址都以「http://」开头。
所以,我们可以认为Web Server就是HTTP服务器
。
提供 HTTP 服务的程序 - 实例
下面是由 Node.js 写的一个最简单的 http server:
var http = require('http')
var server = http.createServer( function (request, response){
response.end('这是页面内容,你请求的路径是:' + request.url)
})
server.listen(8080, function(){
console.log("正在监听 %s 端口", 8080);
});
这段程序监听了当前机器的 8080 端口,一旦外部访问当前机器的 8080 端口,这段程序就会返回一段文字。
很多语言都支持创建http server
Web Server总结
Web Server,也即HTTP服务器,本质上是一种应用程序。——它通常运行在服务器之上,绑定服务器的IP地址并监听某一个tcp端口来接收并处理HTTP请求,这样客户端(一般来说是IE, Firefox,Chrome这样的浏览器
)就能够通过HTTP协议来获取服务器上的网页(HTML格式)、文档(PDF格式)、音频(MP4格式)、视频(MOV格式)等等资源。
下图描述了这一过程:
浏览器
浏览器的作用是认识js和html【参考浏览器引擎 vs 浏览器内核 vs JavaScript引擎,“一个典型的浏览器有一个图形引擎和一个独立的JavaScript引擎”】。
浏览器本身并没有起http服务器的作用。
浏览器的作用是向http服务器发送请求,获得相应的HTML和js资源,然后显示成网页。
所以,如果想要实现“通过网址访问相应网站”的作用,就必须依靠其他工具生成http服务器:
- 在本地项目中运行命令npm run start启动代码时,看npm的源码可知,会生成一个http服务器。所以,可以从客户端访问。
- 如果在客户现场部署代码的话,就必须把代码放在http服务器上运行,才可以客户端被访问。
Web服务器和应用服务器
HTTP 服务器分类
HTTP 服务器分为两类:
- 静态文件服务器
这种服务器简单地根据访问路径,返回对应的文件。
比如用户访问 http:// 123.123.123.123:8080/a/b/c/d.html,那么这种服务器就会在网站根目录找到 a/b/c/d.html 文件,原样返回给用户。 - 动态内容服务器
这种服务器返回的内容一般不是文件,而是动态生成的字符串(比如从数据库中获取的字符串)。
比如用户访问 http:// http://weibo.com/home,那么这种 http://weibo.com 的服务器则会返回当前用户最新的微博消息。显然每个用户得到的内容是不一样的。
Tomcat 与 Nginx,Apache的区别是什么
这三者都是HTTP Server。
Apache指的应该是Apache软件基金会下的一个项目——Apache HTTP Server Project;
Nginx同样也是一款开源的HTTP服务器软件。
不仅仅是Apache HTTP Server和Nginx,绝大多数编程语言所包含的类库中也都实现了简单的HTTP服务器方便开发者使用。比如,Java中的HTTP Server和Python中的SimpleHTTPServer。使用这些类库能够非常容易的运行一个HTTP服务器,它们都能够通过绑定IP地址并监听tcp端口来提供HTTP服务。
Tomcat则是Apache基金会下的另外一个项目,与Apache HTTP Server相比,Tomcat能够动态的生成资源并返回到客户端。
Apache HTTP Server和Nginx都能够将某一个文本文件的内容通过HTTP协议返回到客户端,但是这个文本文件的内容是固定的——也就是说无论何时、任何人访问它得到的内容都是完全相同的,这样的资源我们称之为静态资源。
动态资源则与之相反,在不同的时间、不同的客户端访问得到的内容是不同的,例如:包含显示当前时间的页面显示当前IP地址的页面。
Tomcat
Apache HTTP Server和Nginx本身不支持生成动态页面,但它们可以通过其他模块来支持(例如通过Shell、PHP、Python脚本程序来动态生成内容)。如果想要使用Java程序来动态生成资源内容,使用这一类HTTP服务器很难做到。Java Servlet技术以及衍生的Java Server Pages技术可以让Java程序也具有处理HTTP请求并且返回内容(由程序动态控制)的能力,Tomcat正是支持运行Servlet/JSP应用程序的容器(Container)。
Tomcat运行在JVM之上,它和HTTP服务器一样,绑定IP地址并监听TCP端口,同时还包含以下职责:
- 管理Servlet程序的生命周期将URL映射到指定的Servlet进行处理
- 与Servlet程序合作处理HTTP请求——根据HTTP请求生成HttpServletResponse对象并传递给Servlet进行处理,将Servlet中的HttpServletResponse对象生成的内容返回给浏览器
Tomcat和Nginx
虽然Tomcat也可以认为是HTTP服务器,但通常它仍然会和Nginx配合在一起使用:
- 动静态资源分离——运用Nginx的反向代理功能分发请求:所有动态资源的请求交给Tomcat,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力。
- 负载均衡——当业务压力增大时,可能一个Tomcat的实例不足以处理,那么这时可以启动多个Tomcat实例进行水平扩展,而Nginx的负载均衡功能可以把请求通过算法分发到各个不同的实例进行处理
小结
- tomcat和nginx、Apache一样,也具有提供http服务的功能,也是一种http服务器。
- tomcat的优点:
只是tomcat可以结合Java程序,返回动态资源。
tomcat的缺点:
对HTTP协议部分仅仅是支持,一般不会做特别优化。像是nginx的一些特性(比如负载均衡等),tomcat是不具备的。 - 可以把nginx、Apache这样应用于前端的叫做Web服务器;把tomcat这样应用于后端的叫做应用服务器。
数据流动总结
- 在本地的代码编辑器启动前端项目时,会自动起一个http server
比如node的npm run start命令,内部执行时会创建一个WebpackDevServer,作为http服务器 - 如果将代码部署到某一台物理主机上,那么该主机要部署一个http server,来响应浏览器的请求。
数据流向如图: