HTTP协议与WebServer

描述点

  • HTTP协议包括请求报文和相应报文,请求报文说明想要请求的资源路径,响应报文将指定路径下的资源返回。
  • WebServer指的是运行WebServer程序的服务器,这个程序监听服务器的某个端口。
  • 资源在一开始就只得是文件,也就是客户端请求服务器某个路径下的一个文件,然后服务器读取这个文件的内容,然后封装成为响应报文发送回去。因此响应报文最重要的是一个路径,响应报文最重要的是资源内容。
  • 单纯的静态页面文件不能满足需求,之后Web服务器在接收到请求报文之后,将请求的资源路径当作参数传递给另外一个运行在服务器上的程序,这个程序返回一个二进制的流当作资源的内容给WebServer程序,进而返回给客户端。

结论

  • WebServer本质的作用是接收客户端的请求报文,然后根据请求的资源路径获取资源内容,生成响应报文发送给客户端。至于如果获得资源的内容,或者直接读取服务器上的某个文件,或者交由另外一个程序负责。

HTTP报文例子

  • 下面是一个request的头部信息。
GET /gn/shipin/2018/07-13/news777755.shtml HTTP/1.1
Host: www.chinanews.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: cnsuuid=f1514510-f50b-ed5d-e3c8-79bdc4d3ddf810149.71358966217_1531461114252
  • 从首行可以看出,浏览器请求的是服务器中的/gn/shipin/2018/07-13/news777755.shtml文件,请求的是一个具体的文件,服务器找到这个文件之后,将文件的内容包装导response报文中,返回给浏览器。早期的网页都是静态的,也就是说服务器端的文件的内容是固定的,每次浏览器请求得到的页面相同,也就是用html编写的一些文本文件。服务器通过监听机器的一些端口号,当有请求的报文到达这个端口的时候,服务器根据报文中的参数中指定的文件的路径,在服务器中寻找该文件并返回。web server也可以看成是一种文件服务器,只不过利用的是http协议将文件的内容发送到浏览器端。浏览器还扮演了一个文件阅读器的角色,因为浏览器对一些已知类型的文件知道怎么读,知道怎么显示,因此从服务器端获取文件的内容之后就直接显示出来的。
  • 早期因为需求并不多,放在服务器上的文件都是编写好的,当浏览器请求该文案的时候,服务器中的处理进程根据配置在制定的目录下寻找浏览器请求的文件。但是随着需求的发展,经常手动更改一个网页文件变得繁琐。有没有一种可能,当服务器收到一个请求时,把必要的参数传递给另- - 一个程序,另一个程序根据参数生成一个页面文件,然后服务器把这个文件返回。例如有个页面需要包含当前时间,不可能每次都手动更改时间。如果写一个shell程序,这个shell程序的工作就是更新指定目录下的指定文件,把当前时间以字符串的形式写入到文件中。当服务器收到请求之后,首先调用这个shell程序,然后将请求的文件返回到浏览器。后面多出来的这个程序可以多种多用,可以是java,可以是python, php等脚本语言,只要能实现动态生成一个文件的语言都可以。

    浏览器的种类多种多用,编程语言也多种多样,他们之间的调用需要有个规范进行约束。所谓的规范,就是说浏览器在调用其他的程序的时候,必须传递那些参数,参数名是什么,值是什么。服务器在调用其他的程序的时候,只要满足指定的参数就可以。这样的一个规范就是CGI,也就是通用网关接口。服务器端按照接口标准进行传参,后端程序接受参数,但是这些参数是不是后端程序真正使用的不一定。如果后端的程序的功能就是向一个文件中写hello world,传递什么参数无所谓,虽然这是没有意义的。
  • cgi 和fastcgi虽然在工作原理上有区别,但是和服务器端的对接都是一样的,都要符合cgi标准。
  • 还有一种需求,在一台服务器上部署多个项目。从端口的角度来说,就是所有的到一个端口的认为是一个项目,另一个端口认为是另一个项目。例如192.168.0.1:80是一个网站,192.168.0.1:81是另一个网站,因为http协议似乎在tcp协议之上的,因此有端口的概念,不同的端口认为是不同的请求。因此当服务器接收到一个请求的时候,需要根据这个请求是从哪个端口来的,到指定的目录去寻找请求的文件。这就是apache2上的虚拟主机的概念,一个虚拟主机就是一个指定的目录,在配置上文件中,每个虚拟主机都指定一个端口,一个根目录。在nginx的配置文件中就是使用server指定声明的一个context。

[随笔][胡思乱想][唠叨][web server]的更多相关文章

  1. Jexus Web Server 完全傻瓜化图文配置教程(基于Ubuntu 12.04.3 64位)[内含Hyper-v 2012虚拟机镜像下载地址]

    1. 前言 近日有感许多新朋友想尝试使用Jexus,不过绝大多数都困惑徘徊在Linux如何安装啊,如何编译Mono啊,如何配置Jexus啊...等等基础问题,于是昨日向宇内流云兄提议,不如搞几个配置好 ...

  2. Flash: An Efficient and Portable Web Server

    Introduction This paper presents the design of a new Web server architecture called the asymmetric m ...

  3. C#中自己动手创建一个Web Server(非Socket实现)

    目录 介绍 Web Server在Web架构系统中的作用 Web Server与Web网站程序的交互 HTTPListener与Socket两种方式的差异 附带Demo源码概述 Demo效果截图 总结 ...

  4. 本机ip+端口不能访问web server,外部却可以访问

    本机ip+端口不能访问web server,外部却可以访问! 这个奇葩的问题困扰了我好久,别人通过ip访问我的server一切正常,自己却访问不了,一度怀疑win10的问题,久寻无果! 最后关闭ads ...

  5. Difference between web server ,web container and application server

    In Java: Web Container or Servlet Container or Servlet Engine : is used to manage the components lik ...

  6. vs默认VS Development Sever和用IIS Web Server的一点差别

    关于VS Development Server(vs调试默认运行环境)和IIS Web Server 做运行服务器时,请求处理的一点区别. 将请求粗略分为两类:静态资源请求和动态资源请求. 静态资源请 ...

  7. [SDK2.2]Windows Azure Virtual Network (4) 创建Web Server 001并添加至Virtual Network

    <Windows Azure Platform 系列文章目录> 在上一章内容中,笔者已经介绍了以下两个内容: 1.创建Virtual Network,并且设置了IP range 2.创建A ...

  8. The Web server is configured to not list the contents of this directory.

    部署一个ASP.NET MVC网站至一个全新的服务器Windows Server 2008 R2, 数据为MS SQL Server 2014 64bit Expression版本. 运行时,它第一次 ...

  9. 【转】推荐介绍几款小巧的Web Server程序

    原博地址:http://blog.csdn.net/heiyeshuwu/article/details/1753900 偶然看到几个小巧有趣的Web Server程序,觉得有必要拿来分享一下,让大家 ...

随机推荐

  1. spring jpa 语法

    摘自http://www.cnblogs.com/BenWong/p/3890012.html Table 2.3. Supported keywords inside method names Ke ...

  2. while循环与 for循环,函数定义与调用

    import turtle turtle.setup(600,400,0,0) turtle.bgcolor('red') turtle.color('yellow') turtle.fillcolo ...

  3. shell练习题7

    需求如下: 输入一串随机数字,然后按千分位输出. 例如:输入随机数字为"123456789",输出为123,456,789 参考解答如下 -方法1 [root@lanquark s ...

  4. Hyperledger Fabric 建立一个简单网络

    Building you first network 网络结构: 2个Orgnizations(每个Org包含2个peer节点)+1个solo ordering service 打开fabric-sa ...

  5. 马凯军 周强 张季跃《面向对象与程序设计 Java》第十四周学习总结

    实验十四  Swing图形界面组件 实验时间 20178-11-29 一.知识部分 1.模型-视图-控制器模式 模型:储存内容 视图:显示内容 控制器:处理用户输入 2.布局管理 2-1.流布局管理器 ...

  6. 马凯军201771010116《面向对象与程序设计Java》第十三周学习总结

    实验十三  图形界面事件处理技术 实验时间 2018-11-22 理论知识与学习部分 事件处理基础  事件源(event source):能够产生事件的对象都可 以成为事件源,如文本框.按钮等.一个事 ...

  7. python学习笔记3-函数

    一.函数高级特性 1)列表生成式,列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. eg: >>> list(r ...

  8. vue-router路由传参

    da给我们点击父组件之后跳转到子组件之后,需要携带参数,便于子组件获取数据.传参方式有三种:一. getDescribe(id) { // 直接调用$router.push 实现携带参数的跳转 thi ...

  9. Socket通信方面

    服务端 Console.WriteLine("Starting "); Socket listener = new Socket(AddressFamily.InterNetwor ...

  10. Shell编程(2)

    1 (1) (2) (3) 一.二都是显示数组所有元素,*是作为一个长字符串输出,@是作为数组一个一个输出 三.四都是输出数组的长度 五.六都是输出数组中第一个元素的长度 (4) unset是name ...