您好,游客选择字体:繁體
首页 >> 服务器教程 >> 从Web服务器说起

从Web服务器说起

amdin 2020-07-14 0
浏览次数89

Web服务器是一个很简单的事情,很简单的工作,监听端口80,以解决客户给我发了一个HTTP请求,然后将相应的HTML文件,图片等回客户端就可以了。像这样:

       Wweb 服务器首先创建一个子进程 setenv (“ query” ,“ user xxx & pwd xxx”) ,然后将子进程的标准输出重定向到 socket fd。 在输入 db-query 之后,getenv (“ query”)然后查询数据库以将结果输出到 stdout

       这是一个静态内容服务器,即所谓的静态内容,即,内容服务器作为HTML不改变,每个请求是相同的。除非人们手动更改。

       实现这样一个“玩具Web服务器”并不难,只要能充分了解企业服务器端Socket编程技术就可以了,主要研究工作是编程语言处理HTTP协议的细节。

       动态内容方面,但是,如果你想多走一步,从而使Web服务器可以生成动态内容,这将是困难的。

       比如说来了作为一个HTTP请求,在其中携带者用户名和密码,要求你去数据库可以做一个查询,看看学生用户管理是否能够存在。

       POST  /login,user=xxxx&pwd=xxx

       这个静态网络服务器无法处理它,它甚至不应该查找数据库。我们该怎么办,可以用某种语言(比如 c)编写一个程序来查询数据库,假设程序的名称是 db-query。

       但是,将面临一个非常棘手的问题:Web服务器是一个过程,DB查询还需要一个过程,也许如何货物之间的沟通?

       首先是参数的传递,一种管理办法是这样:对于我们每个学生动态请求,Web服务器进程创建一个db-query的子进程,然后就是通过学习环境分析变量把参数信息传递过去。

       web服务器:

       SETENV ( "QUERY_STRING", "user = XXXX & PWD = XXX")

       db-query子进程:

       Param GETENV "query string" .

       还有个问题:DB-查询孩子的方法以获得用户名和密码,查询数据库,如何查询结果返回给浏览器?

       有个很巧妙的办法,每个工作程序设计都有自己所谓的标准进行输出(STDOUT),db-query只要通过调用printf这个目标函数,数据信息就会输出到STDOUT,我们教师就可以在黑乎乎的控制台上看到了一个数据输出了。

       但是,输出到控制台绝对不行,我们要输出到一个插座可以发送回浏览器。

       每个不同浏览器和服务器的连接方式都是通过一个Socket, 每个socket都有自己一个重要文件描述符fd, 如果把学生查询系统数据库管理程序db-query的STDOUT重定向到那个fd,会发生发展什么?

       所有的客户端插座输出DB查询直接发送时,Web服务器可以撒手。当然,如果浏览器要看到 html 页面,那么 db-query 需要输出 html。

       通过GET / index.html,然后Web服务器软件交换过程浏览器返回的index.html。最终的指数是由Web服务器软件,HTML读给你的硬盘驱动器

       这种教学方式就就是一个大名鼎鼎的CGI,当你可以看到网址中有cgi-bin字样的时候,很有发展可能存在就是用CGI实现的。  只要我们遵循CGI协议, 可以用其他任何一种语言来实现企业动态的网站。

       然而,CGI是非常复杂和笨拙,主要体现在:

       第一,对每个学生请求,都得通过创建一个子系统进程去执行,这是个非常大的开销。

       第二,对程序员一般来说,编程能力极为痛苦,要操作系统环境分析变量,还需要进行直接在编程语言中输出HTML!

       麻烦不是麻烦,痛苦不是痛苦,上个世纪的程序员痛苦不是被迫的吗?

       Servlet如何到达痛苦的了呢?我们要做的关注点分离!

       程序员的关注点是:拿到Http 请求中的数据,执行企业业务, 然后进行输出Http 响应。

       它操作简单,并允许程序员编写一个类,里面的业务逻辑,那么我们必须找到办法来构建一个HttpRequest对象,HttpResponse对象传递给程序员使用的类,以便对象,他是不是就行了?

   谁来进行创建这个HttpRequest和Response 对象,  然后通过调用一个程序员写的类?

       静态Web服务器可以表示企业不愿意,就想管好这一亩三分地,把静态工作内容给大家提供服务好。

       等不及要出去了。 我知道了。 我知道了。 农夫朋友代码,我给你发了一个规范,叫做 servlet 你根据 servlet 规范写程序,就放在这里运行,没别的了。 还有,浏览器使用获取索引。 Html 和 web 服务器软件之间的交换返回索引。 Html. 最后,网络服务器软件读取索引,html 到硬盘

       程序员高兴,只写就行,HttpRequest的一个简单的Servlet和HttpResponse对象对象由Tomcat的创建,能够获得标头,饼干,查询字符串和从的HttpRequest,HttpResponse对象从输出流中获得的,对直接输出到浏览器的其它信息,简单而直接。

       Tomcat还郑重向大家进行声明:对于我们的每个请求,只会用自己一个工作线程来出来,线程的开销可比进程小多了。

       如何处理与混合HTML代码的问题?

       Tomcat也有管理办法, 可以在HTML混杂系统代码!这就是JSP。执行期风险其实我们会被直接编译成Servlet。

       WSGI

       CGI哀求道:按照我的协议,任何语言可以来实现动态的网站,你只是Java Servlet规范,不管对方的语言?

       Servlet 规范并不是真正的跨语言,所以如果 python 也想成为一个动态网站呢?

       现在,你已经认识到了网站的动态特性,您可以用类似的想法来解决它!我们还定义为Python的规范,被称为WSGI(Web服务网关接口)。

       让程序员可以写个类或者一个函数(称为wsgi application),在其中实现逻辑。让某个发展动态管理服务器(称为wsgi server)把Http Request和Response传递我们给它,就可以执行了。

       但是Python的说:我不喜欢的Java您设置详细类,HttpRequest的不就是一些关键价值呢?最喜欢的地方字典有多好!我把它叫做环境,HttpResponse对象并不需要直接使用该函数的返回值(准确的一个迭代)就好了。通过GET / index.html,然后Web服务器软件交换过程浏览器返回的index.html。最终的指数是由Web服务器软件,HTML读给你的硬盘驱动器

       从本质上来说,都是我们为了一个关注点的分离:

       1. 用一个企业动态研究内容进行服务器(wsgi server,Tomcat等)来接受能力并且通过封装HTTP 请求,降低对于程序员的负担。

       2.程序员只需要按照约定(servlet时,WSGI),您可以轻松地实现自己的事业,不要集中处理系统的细节。

文章来源:http://www.rakceping.com/j25/

全部评论:0