从操作系统内核到产品部署(二)

Web服务

Posted by Jingming on November 12, 2020

上篇介绍到了Docker,docker里面可以部署应用程序。

这篇以Web服务部署继续讲解。Web程序运行,需要部署到服务器,而服务器依赖操作系统,操作系统打包到Docker。

一、Web程序

所谓Web程序,其实就是通过Http协议来提供服务的程序。一般来说,浏览器请求网页就是请求Web程序给自己服务。

服务提供的内容,按功能特色分为静态资源(就是一些静态的网页文本)和动态资源(一些可以动态交互的信息)。

静态资源强调的是固定不变的资源。例如文本,无论那个客户端向服务器请求一段文本,那么服务器都返回一样的文本。

动态资源强调动态变化的资源。例如请求一个买票的链接、查询天气的链接等,Web服务器是会对不同用户的不同输入进行处理,返回不一样的内容。

也就是说,动态资源相比静态资源,在url触发了后台的更复杂的服务程序为自己工作。

最后,无论是静态资源还是动态资源,走的都是Http协议,也就是说,返回的东西是HttpResponse(PS. HttpResponse可能是一个 包含更多http请求链接的html文件,在浏览器解析的时候就会触发他们,关于解析的理解,以后会出)。

###二、Web服务器

Web程序需要通过Web服务器提供这些动静态资源服务。

Web服务器的基本功能:(1)提供对外的url;

(2)提供CGI程序,作用是针对不同的url请求,将它们绑定到业务处理逻辑程序并运行(将它们安排成进程或线程)。

CGI程序的输入是HttpRequest信息,输出是HttpResponse。

CGI是语言无关的,服务器调用CGI去处理业务逻辑的方式是fork一个CGI程序。服务器先把http request解析成键值对,作为main函数的参数传入cgi程序中,其中环境变量参数也 包括服务器的环境变量。如何知道传入的键值对的具体意义呢?答案是存在CGI标准,例如标准规定环境变量第一项是content-type。

三、Java Web服务器

Servlet是JAVA自己实现CGI标准的CGI程序,特点是使用多线程。

JSP定义了新的标签<%%>,表示在静态页面中插入了动态JAVA代码,但本质还是使用servlet技术(第一次访问jsp的时候,jsp会被编译成servlet)。
好处是让程序员更好的编码,也就是说,更好的了解插入的代码的上下文环境。

Java Web的应用服务器,也就是面向业务逻辑的服务器:Tomcat。 Tomcat包括Java程序的运行环境,例如JVM。 Tomcat提供CGI服务,程序员使用Spring等Java框架,写出基于CGI的业务逻辑代码,然后放入Tomcat相应的目录就能自动接入CGI。

四、代理服务器

代理的意思是,本来客户要亲力亲为的事,现在丢给中介(代理)去做,中介(代理)返回结果给客户就好。

网络服务中,如果代理是给客户端代理的,那就称正向代理;如果代理是给服务器端代理的,那么称反向代理。

反向代理服务器的作用就是,代表Web应用服务器去接全部的活,到时候把对应的活分给具体Web应用服务器去处理。

Nginx作为反向代理服务器:作用是把接到的http request发给对应的Web应用服务器例如Tomcat。

也就是说,一次请求会建立4个链接:客户端到Nginx,Nginx到Tomcat,Tomcat到Nginx,Nginx到客户端。

Nginx的作用是强调了服务器的接收http request和返回http response的功能,至于业务逻辑处理,交给Web应用服务器做。

这样的专注好处就是效率高,利用epoll模型、IO多路复用的技术,做到高并行地处理巨量的请求的效果。

PS.Nginx的其他应用特色:(1)动静分离;有些静态服务,Nginx自己就能直接处理,就不会去Tomcat里面取了。

(2)负载均衡,也就是说,Nginx反向代理时候,可以以一种均衡的方式发送到Tomcat。

Apache是类似于Nginx的服务器,它并不像Tomcat那样强调应用逻辑,Apache称为Http服务器,而Tomcat称为应用服务器。