精华内容
下载资源
问答
  • web服务器、应用服务器和常见的服务器概念

    千次阅读 多人点赞 2020-04-17 16:36:01
    什么是web服务器,什么是应用服务器? 浏览器的编译原理是什么? http的头文件为何要这样配置? Nginx,Apache等为何要这样操作? 不同的服务器软件有什么作用? 而网上关于http的实战讲解一般都是以操作为主,涉及...

    http协议解析–绪篇

    在做开发的过程中,总是能感觉到自己对http相关的各种概念模糊不清。

    什么是web服务器,什么是应用服务器?

    浏览器的编译原理是什么?

    http的头文件为何要这样配置?

    Nginx,Apache等为何要这样操作?

    不同的服务器软件有什么作用?

    而网上关于http的实战讲解一般都是以操作为主,涉及到原理的部分大多模糊不清,自己又很少花时间去系统的学习http协议相关的内容,大多数时候都是照着配一配就行了,所以明明写了挺多代码了,对于http还是知之甚少。所以,决定写一个专题,留作笔记也以此来督促自己深入的看看http,后续有什么地方说错了,也欢迎大家指出。
    在这里插入图片描述


    热点问题

    在之前的学习中,曾经困扰我许久的问题便是:web服务器,http服务器,服务器软件,网站后台,应用服务器这些都有什么区别,与Apache,Nginx究竟是什么关系,Tomcat又是什么?

    在绪篇中首先便先讲一下这些容易混淆的概念性问题。

    web服务器

    一般我们把发出http请求的一方称作请求分,比如浏览器就是http的请求方,那么应答方就是我们常说的web服务器(web Server)。

    应该说web服务器在某些时候是一种很广泛的概念,比如在web代表一项应用软件是,web服务器有时候会被理解为软化的后台,也正是因为这样,很多人会混淆这个概念。

    在硬件层面上,web服务器可以简单的理解为另一台性能更好的主机。不过在现实生活中,不仅仅只是一台主机,而是利用反向代理、负载均衡等等技术组成的一大群机房。

    在软件层面上指的是提供web服务的应用程序。我的理解就是响应http请求,返回超文本文件等数据,或者把请求转发给后面的Tomcat、node.js等应用服务器。因此,web服务器是静态服务器。

    常见的web服务器有Apache,Nginx,Tomcat等,其实Tomcat更多的做为应用服务器使用,一般不会直接用Tomcat做web服务器。

    在这里插入图片描述

    在这里插入图片描述
    当然目前Nginx等也经常用来做反向代理服务器和负载均衡等

    http服务器

    http服务器就是指使用http协议传输资源提供服务,由于应用层通讯协议主要就是http协议,所以在普遍情况下,web服务器==http服务器

    网站后台

    可以提供数据接口等服务的应用层软件。常说的就是应用的后端,进行数据和逻辑处理。

    应用服务器

    应用程序服务器通过各种协议把商业逻辑暴露给客户端应用程序。能实现动态网页技术,也称之为应用容器,web容器等

    应用服务器不等于网站后台,但是在应用服务器上可以部署网站后台。通常,Web服务器会有插件来支持脚本语言,比如PHP、ASP等,也可以生成动态的HTTP内容。那为什么要使用应用服务器呢?

    应用服务器可以更好的相应超大用户量的访问,并杜绝sql注入等安全问题,提供动态功能的支持。

    常见的应用服务器有,Tomcat、Jetty、Undertow等。应用服务器也包含http服务

    在这里插入图片描述

    但是一般不会做为http服务器也就是web服务器使用,经常是搭配使用

    浏览器>>>>>>web服务器>>>>>应用服务器>>>>>>数据库

    在这里插入图片描述

    总结

    1. 服务器分静态服务器和动态服务器,web服务器是静态服务器,应用服务器是动态服务器
    2. 应用服务器也可以处理静态需求,但是由于没有web服务器那么专业,所以一般搭配使用,常见如(Nginx+Tomcat)
    3. Apache,Nginx等是静态服务器,是web服务器,也是web服务器软件
    4. tomcat是动态服务器,也可以称之为web容器、应用容器等
    5. 网站后台不是web服务器,但是当web做为一种应用来表达的时候,web服务器可能在口头上会被理解为后台。

    下一篇将正式开始进入http协议的学习

    展开全文
  • Web服务器工作原理详解(基础篇)

    万次阅读 多人点赞 2018-08-14 17:12:00
    概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而设计的...

    概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而设计的网络应用程序都可以是Web客户端。

    Web服务器和HTTP服务器可以说是同一个东西,当然非得细分的话,HTTP服务器是建立在HTTP协议之上的提供文档浏览的服务器,更多的是提供静态的文件。而Web服务器涵盖了HTTP服务器(这一点可以自行百度百科), Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。
    Web服务器 约等于 HTTP服务器 + 其他服务

    目前所熟知的Web服务器有很多,其最主流的是 Apache, Nginx, IIS
    各大Web服务器的实现细节都不同,是为了某种情形而设计开发的。但是它们的基础工作原理是相同的,这也是本次基础篇所讲解的内容。

    一、Web服务器工作原理图解

    这里写图片描述
    首先我们暂时不考虑HTTP协议的各种请求方式,我们先跟着**(Web服务器工作原理总体描述01)这张图,将一次Web服务的工作流程过一遍,我们假设以浏览器作为客户端
    (1) 用户做出了一个操作,可以是填写网址敲回车,可以是点击链接,可以是点击按键等,接着浏览器获取了该事件。
    (2) 浏览器与对端服务程序建立TCP连接。
    (3) 浏览器将用户的事件
    按照HTTP协议格式**打包成一个数据包,其实质就是在待发送缓冲区中的一段有着HTTP协议格式的字节流。
    (4) 浏览器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到对端服务程序。
    (5) 服务端程序拿到该数据包后,同样以HTTP协议格式解包,然后解析客户端的意图。
    (6) 得知客户端意图后,进行分类处理,或是提供某种文件、或是处理数据。
    (7) 将结果装入缓冲区,或是HTML文件、或是一张图片等。
    (8) 按照HTTP协议格式将(7)中的数据打包
    (9) 服务器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到客户端。
    (10) 浏览器拿到包后,以HTTP协议格式解包,然后解析数据,假设是HTML文件。
    (11) 浏览器将HTML文件展示在页面
    以上为Web服务器工作基本原理。其实不难发现,这仅仅只是一个简单的网络通信。我们应该深信,作为一个服务器,其根本的工作无非有三个

    1. 接收数据 2. 发送数据 3. 数据处理
      而Web服务器的本质就是 接收数据 ⇒ HTTP解析 ⇒ 逻辑处理 ⇒ HTTP封包 ⇒ 发送数据
      高级的服务器无非就是将这三个部分更加细致的设计了。

    二、Web服务器之提供静态文件工作原理图解

    Web服务器最主要的功能是提供静态的文件。日常的上网浏览大多是网页浏览,少数时候才会有一些数据的提交操作。因此,我们结合上一张图示来重点讲解在GET请求下的Web服务器工作原理。
    这里写图片描述
    其他流程基本不变,着重在于红色与蓝色部分。
    (1) 当用户点击一个网页链接或浏览器加载一些资源(css,jpg …)时产生。
    (6) 服务程序解包后,确定其为GET请求,并且是对该服务器上的某一资源的请求。首先服务程序会去确认该路径是否存在,再确定该路径的文件是否可以获取。
    (7-1) 如果请求的路径有误,或者该资源不能被用户获取,则返回错误提示页面。很多服务器的错误页面只有404,更专业的应该是将错误分类并返回对应的错误代码页面。
    (7-2) 如果该路径合法且文件可以被获取,那么服务程序将根据该文件类型进行不同的装载过程,记录其类型作为(8)中HTTP协议中对应的返回类型,并加入响应头。

    假设以点击一个页面链接为例,浏览器首先将HTML文件请求过来,再以同样的流程对HTML文件中包含的资源文件路径进行依次请求。
    这里写图片描述

    三、Web服务器之数据提交工作原理图解

    仅仅只是网页的浏览并不能满足所有人的需求,客户端与服务器应当是有数据交互的。
    即使单方面的资源请求任然是网络的主力军。
    我们应该清楚的知道,数据提交对于用户来说有什么作用。
    (1) 资源上传 (2) 登陆验证 (3) API接口调用 (4) 远程指令等
    数据提交使得用户的操作性有了质的飞跃,它使得HTTP短连接获取静态文件的方式提升到了动态交互的层次上。该性质也催化出各式各样的编程语言、框架。例如PHP,JavaWeb。
    如果你留意目前主流的那些大型服务器,你会发现再高级再牛逼的东西实际是也是最基础的东西建造的。那么我们还可以顺便学习一下最古老的动态技术CGI
    这里写图片描述
    其他流程基本不变,着重在于红色与蓝色部分。
    (1) 用户提交数据,假设用户点击一个按键提交填好的信息。在(3)中将以POST格式写入,并填入提交至服务端的可执行程序的路径。
    (6) 服务端将参数与该CGI绑定,复制进程,用管道传递参数和接收结果
    (7) 子进程执行CGI,接收(6)父进程传来的参数,运算完成返回结果。
    最后父进程将结果装入静态模板文件,放入缓冲区

    四、动态技术

    我们得明白,Web服务器是以短连接为主,并且获取的数据到达浏览器的那一刻一定是静态的不变的。那么所谓动态实际是指两种情况

    1. 服务端产生
      (1) 用户POST提交数据到某个程序,程序根据该数据作为参数运行,得出结果并装入静态的模板页面中,返回该静态页面。但对于用户来说,同一个页面,做了一个操作后数据不一样了。好了,这就是动态页面。(CGI原理)
      (2) PHP的原理是,用户GET请求一个php后缀的文件,服务器先执行该php后缀文件中的PHP代码,将结果填入代码的位置,再返回。当然也可以提交数据参与运算再返回。
    2. 客户端产生
      (1) 用户GET请求一个JavaScript文件,服务端不做任何运算返回该静态文件。浏览器收到该JS文件,在本地执行并更新页面。
      (2) 用户POST提交数据到服务端,服务端根据该提交的数据指令返回静态文件,浏览器收到后执行并更新。
    展开全文
  • web服务器 并发 基本概念

    千次阅读 2016-04-10 20:17:11
     Web服务器的吞吐率是指其单位时间内所能处理的请求数。更关心的是服务器并发处理能力的上限即最大吞吐率。  Web服务器在实际工作中,其处理的Http请求包括对很多不同资源的请求即请求的url不一样。正因为这种...
    序:
    

        这里指的服务器是指提供HTTP服务的服务器,人们通常衡量一台web服务器能力的大小为其在单位时间内能处理的请求数的多少。

    3.1 吞吐率

        Web服务器的吞吐率是指其单位时间内所能处理的请求数。更关心的是服务器并发处理能力的上限即最大吞吐率。

        Web服务器在实际工作中,其处理的Http请求包括对很多不同资源的请求即请求的url不一样。正因为这种请求性质的不同,Web服务器并发能力的强弱关键在于如何针对不同的请求性质设计不同的并发策略。有时候一台Web服务器要同时处理许多不同性质的请求,在一程度上使得Web服务器性能无法发挥。

        并发用户数为某一时刻同时向服务器发送请求的用户数。注意,100个用户同时向服务器各发10个请求与1个用户同时向服务器发1000个请求对服务器造成的压力是不一样的,显然是前者造成的压力更大,原因是此时服务器网卡接收缓冲区中的请求同时有100个等待处理。

        最大并发数是有一定利益前提的,是用户和服务器各自期望利益的一个衡量点。一般是服务器保持了比较高的吞吐率同时用户对等待时间比较满意时的并发数即可定为最大并发数。

        在并发用户数较大的情况下,服务器采用什么样的并发策略是影响最大并发数的关键。

        用户访问web站点通常是使用浏览器,而浏览器在下载一个网页及网页中的组件是采用多线程下载的。但其对同一域名下的URL并发下载数是有限制的,具体限制因浏览器及其版本和http版本不同。

        服务器支持的最大并发数具体到真实用户并不是一对一的关系。一个真实的用户可能给服务器带来两个或更多的并发用户数的压力。

        从web服务器的角度看,实际并发用户数可理解为服务器维护不同用户的文件描述符总数即并发连接数。不是同时有多少用户,服务器就为其建立多少连接,服务器一般会限制同时服务的最多用户数。

        web服务器工作的本质是以最快的速度将内核缓冲区中的用户请求数据拿回来并尽量尽快处理完这些请求,并将响应数据放到发送数据的缓冲区中,再去处理下一拨请求,如此反复。

        用户平均请求等待时间用于衡量服务器在一定并发用户数下对单个用户的服务质量。而服务器平均请求处理时间用于衡量服务器的整体服务质量,它是吞吐率的倒数。如果并发策略得当,每个请求的平均处理时间可以减少。

        并发策略的设计就是在服务器同时处理较多请求的时候合理协调并充分利用CPU和IO计算 ,使其在较大并发用户数下保持较高的吞吐率。但并不存在一个对所有请求性质都较高的并发策略。

    3.2 CPU并发计算

        服务器之所以可以同时处理多个请求,在于操作系统通过多执行流体系设计多个任务可以轮流使用系统资源,包括CPU、内存、IO等。

        多执行流的一般实现便是进程,多进程的好处可以对CPU时间的轮流使用,对CPU计算和IO操作重叠利用。这里的IO主要是指磁盘IO和网络IO,对CPU而言,它们慢的可怜。大多数进程的时间主要耗在IO上。

        进程的调度由内核执行,进程的目的是担当分配资源的实体。每个进程都有自己的内存地址空间和生命周期。子进程被父进程创建后便把父进程地址空间的所有数据复制到自己的内存地址空间。完全继承父进程的上下文信息,它们之间可以互相通信,但不互相依赖,无权干涉。

        进程的创建使用fork()系统调用,服务器频繁地创建进程会引起不小的性能开销。Linux 2.6对fork()进行了优化,减少了一些多余的内存复制。

        进程的优越性体现在其稳定性和健壮性,其中一个进程崩溃不会影响到另一个进程。但采用大量进程的web服务器(如:Apache prefork模型)在处理大量并发请求时其内存开销将成为性能的瓶颈。

        轻量级进程由系统调用clone()来创建,由内核管理,独立存在,允许这些进程共享数据,轻量级进程减少了内存开销,为多进程应用提供了数据共享,但其上下文切换开销还是避免不了。

        一般多线程的管理在用户态完成,线程切换的开销比轻量级进程切换开销要小,但它在多CPU服务器中表现较差。

        进程调度器维护着一个可运行队列以及一个包括所有休眠和僵尸进程的列表。进程调度器的工作就是决定下一个运行的进程。如果队列中有多个可运行的进程,此时进程调度器可根据进程的优先级及其它策略进行选择。

        CPU时间片的长度要具体权衡,时间片太短,那么CPU在进程切换上的时间浪费就比较大,如果时间片太长,那么多任务实时性和交互性就无法做到保证。

        系统负载越高代表CPU越忙,也就越无法很好地满足所有进程的需要。系统负载的计算是根据单位时间内运行队列中就绪等待的进程数平均值。当运行队列中的就绪进程不需要等待就可以立即得到CPU说明系统负载比较低,系统响应速度也就快。

        查看系统负载可以通过cat /proc/loadavg、top、w等命令工具查看。

        进程的切换就是进程调度器挂起正在运行的进程,恢复之前挂起的某个进程。

        每个进程只能共享CPU寄存器,一个进程被挂起的本质就是将其在CPU寄存器中的数据取出来暂存到内核堆栈中,恢复一个进程的本质就是将其数据重新载入到CPU寄存器中,其实这种硬件上下文切换的开销也是挺大的。

        要服务器支持较大的并发数,就要减少上下文切换的次数,最简单地做法是减少进程数目,尽量使用线程配合其它IO模型来设计并发策略。

        除了关注CPU使用率外,还要关注IOWait,它是指CPU空闲并等待IO操作完成的时间比例。IOWait不能真实地代表IO操作的性能或工作量,它是衡量CPU性能的。即使IOWait为100%也不代表IO出现性能瓶颈,IOWait为0时IO也可能很忙。此时,最好是测试磁盘IO和查看网络IO的流量。

    3.3 系统调用

        进程有用户态和内核态两种运行模式。进程可以在这两种模式中切换,存在一定的开销。进程通常运行在用户态,当进程需要对硬件操作的时候就要切换到内核态。这两种模式的分离是为了底层操作的安全性和简化开发模型。所有进程都必须通过内核提供的系统调用来操作硬件。进程从用户态到内核态存在一定的内存空间切换,这种开销是比较昂贵的,应尽量减少不必要的系统调用。

    3.4 内存分配

        Web服务器在工作的过程中需要大量的内存,这使得内存的分配和释放很重要。服务器处理成千上万的http请求,其内存堆栈的分配和复制次数变得更加频繁。

        Apache在运行时内存使用量非常惊人,它一开始就申请大量内存作内存池,为防止以后频繁的内存再分配带来的性能开销,内存池的使用使用Apache管理更安全,但内存池的使用也没有弥补其性能,其内存池的释放是在Apache关闭的时候。

        Lighttpd使用单进程模型,其内存使用量比较小,同样是使用单进程的Nginx其内存使用量更小,Nginx使用多线程处理请求,这些多线程可以共享内存资源,它使用分阶段按需分配内存、及时释放策略。

    3.5 持久连接

        持久连接是指一次TCP连接中持续处理多个请求而不断开连接。建立TCP连接操作的开销可不小,在允许的情况下,连接次数越小越有利于性能提升。

        长连接对于密集型的图片或网页等小数据量的请求有明显的加速作用。

        Http长连接的实施需要浏览器和服务器的配合,缺一不可。

        浏览器要支持http长连接可以在http请求头中加入:Connection: Keep-Alive,目前主流web服务器都默认使用长连接,除非显式关闭。

        对于长连接的使用要注意长连接的有效时间多长,即什么时候关闭长连接,浏览器和服务器都有默认的有效时间,也都可以设置有效时间,都可以主动关闭,若两者设置的时间长度不一致,以短的为准。例如:

        请求:Connection:Keep-Alive

         响应:Connection:Keep-Alive

                    Keep-Alive:timeout=5,max=100

        持久连接的目的就是减少连接次数,重用已有的连接通道,减少连接开销。

    3.6 IO模型

        IO有内存IO、网络IO和磁盘IO等。

        可以使用RAID磁盘阵列来加速对磁盘IO的访问,使用独立网络带宽和高带宽网络适配器可以搞网络IO速度,但IO操作都要由内核系统调用完成,系统调用需要CPU调用,无疑存在CPU快和IO慢的不协调。

        我们所关注的IO操作主要是网络数据的发送、接收和磁盘文件的访问。不同IO模型的本质在于CPU参与的方式。

        DMA:直接内存访问。即不需要通过CPU即可以进行内存到磁盘的数据交换。这样就可降低对CPU的占有率,节省系统资源。

        IO等待是不可避免的,既然有等待,就会有阻塞。这里的阻塞是指当前发起请求的进程IO被阻塞,并不是CPU被阻塞,CPU是没有阻塞的,它只有拼命地计算。

        同步阻塞IO是指当前进程调用某些IO操作的系统调用或库函数时,进程便暂停下来,等待IO操作完成后再继续进行,这种模型可以和多进程结合起来有效利用CPU资源,但其代价就是多进程的大内存开销。这种模型的等待时间包括等待数据的就绪和等待数据的复制。

        同步非阻塞IO是指调用不会等待数据的就绪,当没数据可读或可写时立即告诉进程,让其函数及时返回。通过反复轮询来尝试数据是否就绪,防止进程被阻塞,最大的一个好处就是可以在一个进程内同时处理多个IO操作。但是反复轮询会大量占用CPU时间,使得进程处于忙碌等待状态。非阻塞IO只对网络IO有效,对磁盘IO无效。

        多路IO就绪通知允许进程通过一种方法同时监视所有文件描述符,并可以快速获得所有就绪的文件描述符,然后只针对这些文件描述符进行数据访问。当然,要注意,这种模型在数据访问时仍然要采用阻塞或非阻塞方式进行。

        select:通过一个select()系统调用来监视并返回就绪的文件描述符,从而对这些文件描述符进行后续的读写。几乎所有的平台都支持这种方式,可以跨平台,但它的缺点是单个进程可监视的文件描述符数量有最大限制,Linux上一般为1024,它对所有socket进行一次性扫描也存在开销。

        poll:与select没有本质区别,只是poll没有最大文件描述符数量限制。它的缺点也是将大理文件描述符的数组在用户态和内核态来回复制,而不管文件描述符是否就绪,开销会成线性增长。

        epoll:Linux2.6才出现,具有其它方式的一切优点,是Linux2.6下性能最好的多路IO就绪通知方法。它基于事件的就绪通知方式。

        kqueue:性能和epoll差不多,它是FreeBSD下的,但它的API在许多平台下不支持。

        内存映射是指将内存中某块地址空间和我们指定的磁盘文件相关联,从而把对这块内存的访问转换为对磁盘文件的访问。内存映射可以提高磁盘IO性能,像访问内存一样地访问磁盘文件。有两种内存映射,共享型和私有型。共享型是指对任何内存的写操作都同步到磁盘文件,而所有映射同一个文件的进程都共享任意一个进程对映射内存的修改。私有型是指映射的文件只能是只读文件,不可以将内存的写同步到文件,多个进程不共享修改。显然,共享型的内存映射效率偏低。

        直接IO就是指绕过内核缓冲区,打开的文件可直接访问,避免CPU和内存的多余时间开销。

        sendfile系统调用可将磁盘文件的特定部分直接送到客户端的Socket的描述符,加快静态文件的请求速度,减少CPU和内存的开销。

        阻塞和非阻塞是指当进程访问的数据尚未就绪,进程是否等待即是立即返回还是继续等待。同步是指主动请求并等待IO操作完成,当数据就绪后读写时必须阻塞。异步是指主动请求数据后可以继续处理其它任务,随便等待IO操作完成的通知,即读写时进程不阻塞。

    3.7 服务器并发策略

        设计并发策略的目的就是就是让IO操作和CPU计算尽量重叠进行。一方面要让CPU在IO等待不要空闲,另一方面要让CPU在IO调度上尽量花最少的时间。

        (1)一个进程处理一个连接,非阻塞IO

            这样会存在多个并发请求同时到达时,服务器必然要准备多个进程来处理请求。这种策略典型的例子就是Apache的fork和prefork模式。对于并发数不高的站点同时依赖Apache其它功能时的应用选择Apache还是可以的。

        (2)一个线程处理一个连接,非阻塞IO

            这种方式允许在一个进程中通过多个线程来处理多个连接,一个线程处理一个连接。Apache的worker模式就是这种典型例子,使其可支持更多的并发连接。不过这种模式的总体性能还不如prefork,所以一般不选用worker模式。

        (3)一个进程处理多个连接,非阻塞IO

            适用的前提条件就是多路IO就绪通知的应用。这种情况下,将处理多个连接的进程叫做worker进程或服务进程。worker的数量可以配置,如Nginx中的worker_processes 4

        (4)一个线程处理多个连接,异步IO

            即使有高性能的多路IO就绪通知,但磁盘IO的等待还是无法避免的。更加高效的方法是对磁盘文件使用异步IO,目前很少有Web服务器真正意义上支持这种异步IO

    展开全文
  • web服务器

    千次阅读 多人点赞 2021-03-24 00:34:17
    web服务器 服务器的相关概念 服务器与客户端 服务器的概念:提供网络服务的一台机器,通过在自己的电脑上安装特殊的软件(或者是运行某段特殊的代码)来提供服务 服务器 = 电脑 + 可以给其他电脑提供服务的软件 ...

    web服务器

    1.服务器的相关概念

    1.1服务器与客户端

    服务器的概念:提供网络服务的一台机器,通过在自己的电脑上安装特殊的软件(或者是运行某段特殊的代码)来提供服务

    • 服务器 = 电脑 + 可以给其他电脑提供服务的软件

    • 服务器:提供服务的是服务器

    • 客户端 = 电脑 + 软件(平时个人使用的软件)

    • 客户端:享受服务的是客户端

    1.2服务器的类型

    根据服务不同,服务器的类型也不同:

    • web服务器:安装apache, tomcat, iis, 或者在 node.js 环境写代码 来提供:图片浏览,新闻浏览…等服务的服务器。
    • ftp服务器:安装serv-U软件,为其它电脑提供文件下载,共享服务。
    • 数据库服务器:安装mysql软件,为其它电脑提供数据库服务。

    1.3web服务器

    • 用户通过浏览器来享受web服务器提供的服务
    • 我们用url地址来访问某个web服务器上的资源
    • 浏览器端发起请求,web服务器收到请求后,响应这请求,并将处理结果返回给浏览器
    • 浏览器端与web服务器是通过http(或者是https)协议来进行请求和响应的

    在这里插入图片描述

    1.4IP地址

    全称:I ntternet P rotocol Address

    作用:标识一个网络设备在某个具体的网络当中的地址。我们要想访问某个电脑上的资源,首先要找到它对应的IP

    分类:IPV4 IPV6

    格式:**[0255].[0255].[0255].[0255] ** 例如ipv4:127.0.0.1 (这个地址是本机的ip地址)

    即四个0~255的数字组成(在同一个网络中,计算机的IP地址是不允许重复的,都是唯一的)

    1.5域名

    域名:ip地址的别名,由于ip地址不好记忆,就取了一个好记的别名。

    localhost这个域名特指127.0.0.1这IP地址。

    localhost = 127.0.0.1 (一样,都表示本机的地址,只是换了一个好记的名称)

    域名解析系统:把域名翻译成IP地址的系统

    1.6端口

    一个IP地址可以有65536个端口(范围是从[0,65535])。

    不同的端口被不同的软件占用,以提供不同的服务。

    一台电脑可以通过安装多个服务器端软件来提供服务,比如web服务器,ftp服务器…。

    仅仅通过ip地址是无法区分不同的服务的,所有需要 IP地址 + 端口号 来区分不同的服务

    在这里插入图片描述

    1. 服务器要提供服务必须通过指定的端口
    2. 服务器与客户端都需要通过端口进行通信
    3. 端口是可以编程分配的
    4. 有一些端口是被约定的了

    可以通过 小黑窗输入命令: netstat -a -n -o 查看端口的使用情况

    在这里插入图片描述

    1.7协议(http)

    制定客户端与服务器之间的通讯规则。不同的协议的作用也不同。

    http协议

    • HTTP(HyperText Transfer Protocol)是超文本传输协议

    • 协议双方:浏览器与web服务器都要遵守的协议

    • 请求通常是由浏览器发起的

    • HTTP协议中明确规定了 请求数据响应数据 的格式(报文)

      • 浏览器 请求 资源 要遵守http协议:请求报文 (请求行,请求头,请求体)

      • 浏览器 返回 资源 要遵守http协议:响应报文 (响应行,响应头,响应体)

    2.用http模块写一个简单的web服务器

    2.1用http实现一个简单的虚拟服务器(效果如下)

    // 1.引入 http 模块
    const http = require('http');
    // console.log(http);
    
    // 2.创建服务// request:本次请求// res : 本次响应
    const server = http.createServer((req,res)=>{
        // 回调函数 : 每一次收到请求,他就执行一次
        // 设置响应体
        res.setHeader('content-type','text/html;charset=utf-8')
        // 结束本次请求
        // 设置响应体:返回给用户看的
        res.end('你好,虚拟服务器完成');
    });
    
    // 3.启动服务
    server.listen(8000,()=>{
        console.log('虚拟服务器启动成功','端口是8000');
    });
    

    运行结果:

    在这里插入图片描述

    2.2操作步骤

    1. 创建一个文件,名为 http模块实现虚拟服务器.js的文件(文件名路径可以自行设置,建议不要使用中文命名,这里为了演试就用中文的名字)。

    2. 在js文件中写入如下(如上图效果图)

      • 1)引入http核心模块
      • 2)使用createServer来创建服务
      • 3)使用listener来启动服务
    3. 运行js代码

      在js文件目录,打开小黑窗,键入命令 node http.js,此时会弹出一个小黑窗,不要关。

    4. 本地验收

      打开一个浏览器页面,输入’http://localhost:8000’,观察效果:

    5. 共享地址

      localhost改成你自己电脑的ip地址,再把这个路径发你的朋友(同一个局域网)来访问。

    6. 停止服务( ctrl + c )

    2.3工作原理

    使用http模块在本机中创建一个虚拟的服务器,用来接收浏览器的请求,并给出响应

    在这里插入图片描述

    注意:小黑窗不要关,它就是服务器,它不会有主动行为(看起来没有任何变化),它在时刻等待客户端的访问。

    2.4代码解析

    1. 引入核心模块,得到的http是一个对象。

    2. http.createServer方法创建一个http服务。

      参数是一个回调函数:当有http请求进来时,它会自动被调用。请求一次,它就被调用一次

      第一个参数:客户端的请求

      第二个参数:设置对本次请求的响应

      res.end() :设置响应体,结束请求。

    3. server.listen() 用来监听端口。

      格式:server.listen(端口号,[回调函数])。回调是可选的。

      说明:

      • 如果监听成功,则回调函数会执行一次。

      • 如果不成功(例如端口被占用),会报错。

    在这里插入图片描述

    2.5修改代码之后要重启服务器

    更改res.end()的内容,重启后,再次观察

    • 停止服务: 在小黑窗中按下ctrl+c 停止服务。
    • 重启服务:就是重新运行程序(按下向上的箭头,再回车)。

    3.理解请求与响应

    3.1请求

    当web服务器就绪之后,如果没有客户端来访问,它是不会有任何效果的。那么回调函数就不会被执行了。

    然而每一次的请求,都会导致回调函数要执行一次。

    3.2服务器的响应内容格式

    res.end()的格式只能是 stringbuffer

    4.根据不同的url返回不同的内容-认识URL

    4.1URL全称

    Uniform Resource Locator,统一资源定位符。

    4.2作用

    定位资源

    4.3格式

    协议://主机地址[:端口]/路径?查询字符串#锚点

    • 协议:http 或者是 https

    • 主机地址:IP地址 或者 域名

    • 端口号:

      • http请求,默认端口80(可以省略)

      • https请求,默认端口443(可以省略)

      • MySQL默认端口3306

    • 路径:服务器文件夹上的资源。(.html/.css/.images/.js/接口)

    • 查询字符串(参数):? 后面的部分,是键值对的形式

    • 锚点:网页内部的锚点链接

    5.不同的URL返回不同的内容-req.url

    5.1目标:

    通过 req.url来获取当前请求的url地址 ,并做出相应处理

    5.2req.url 用来获取本次请求的资源地址。

    //引入http模块
    const http = require('http');
    
    // 创建服务
    const server = http.createServer(function(req, res) {
      console.log(req.url)
      res.end(req.url)
    });
    // 启动服务
    server.listen(8081, function() {
      console.log('success');
    });
    

    req.url一定是以**/**开头的。

    在现代浏览器中,它们会自动去请求服务器上的favicon.ico(先不用理这个)

    6.不同的URL返回不同的内容-读取文件内容并返回

    6.1目标

    用户在访问服务器上不同的url时,能返回不同的内容

    目录结构

    |-index.html
    |-style.css
    |-01.png
    |-js/jquery.js
    |-server.js
    

    请求与响应的对应的关系

    用户的请求地址 服务器的动作
    http://localhost:8000 读出index.html的内容并返回
    http://localhost:8000/index.html 读出index.html的内容并返回
    http://localhost:8000/style.css 读出style.css的内容并返回
    http://localhost:8000/01.png 读出01.png的内容并返回
    http://localhost:8000/js/jquery.js 读出jquery.js的内容并返回
    http://localhost:8000/xxxx 或者不是上面的地址 返回404

    代码示例:

    // 1.引入 http 模块
    const http = require('http');
    // console.log(http);
    const fs = require('fs')
    const path = require('path')
    // 2.创建服务
    // request:本次请求
    // res : 本次响应
    const server = http.createServer((req,res)=>{
        // 回调函数 : 每一次收到请求,他就执行一次
    
        // 读出文件
        // fs.readFile('')
        const {url} = req;
        console.log(url);    
        if(url === '/' || url === '/index.html'){
            const pathFile = path.join(__dirname,'index.html');
            // console.log(pathFile);
            // 同步读取文件
            const content = fs.readFileSync(pathFile,'utf8');
            // console.log(a);
            // 结束请求
            res.end(content)
        } else if(url === '/style.css'){
            const pathFile = path.join(__dirname,'style.css');
            // console.log(pathFile);
            // 同步读取文件
            const content = fs.readFileSync(pathFile,'utf8');
            // console.log(a);
            // 结束请求
            res.end(content)
        }
       else if(url === '/01.jpg'){
    
            const pathFile = path.join(__dirname,'01.jpg');
            console.log(pathFile);
            // 同步读取文件
            const content = fs.readFileSync(pathFile);
            
            console.log(content);
            // console.log(content);
            // 结束请求
            res.end(content)
        }
       else if(url === '/js/jQuery.js'){
    
            const pathFile = path.join(__dirname,url);
            console.log(pathFile);
            // 同步读取文件
            const content = fs.readFileSync(pathFile);
        res.setHeader('content-type','text/html;charset=utf-8')
            
            console.log(content);
            // console.log(content);
            // 结束请求
            res.end(content)
        }
        else{
            res.end('ok')
        }
    
       
    });
    
    // 3.启动服务
    server.listen(8000,()=>{
        console.log('服务器启动成功');
    })
    

    6.2什么是静态资源

    静态资源指的是html文件中链接的外部资源,如.html, css、js、image文件等等),服务器的处理方法就是:读出文件内容,返回给用户。

    7.不同的URL返回不同的内容-设置content-type

    7.1目标

    会根据不同的文件类型来设置不同的content-type

    7.2content-type的作用

    在http协议中,content-type用来告诉对方本次传输的数据的类型是什么。

    • 在请求头中设置content-type来告诉服务器,本次请求携带的数据是什么类型的
    • 在响应头中设置content-type来告诉服务器,本次返回的数据是什么类型的

    通过使用res对象中的setHeader方法,我们可以设置content-type这个响应头。这个响应头的作用是告诉浏览器,本次响应的内容是什么格式的内容,以方便浏览器进行处理。

    7.3常见的几种文件类型及content-type

    • .html:res.setHeader('content-type', 'text/html;charset=utf8')
    • .css:res.setHeader('content-type', 'text/css;charset=utf8')
    • .js:res.setHeader('content-type', 'application/javascript')
    • .png:res.setHeader('content-type', 'image/png')
    • json数据:res.setHeader('content-type', 'application/json;charset=utf-8')

    其它类型,参考这里:https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types

    7.4代码示例:

    目录结构:

    |--pubic
    |-public/index.html
    |-public/stye.css
    |-public/1.png
    |-server.js
    
    // 1.引入http模块
    const http = require('http');
    // console.log(http); //输出的一个对象
    
    const path = require('path');
    
    const fs = require('fs');
    
    // - .html:` res.setHeader('content-type', 'text/html;charset=utf8') `
    // - .css:`res.setHeader('content-type', 'text/css;charset=utf8')`
    // - .js:`res.setHeader('content-type', 'application/javascript') `
    // - .png:`res.setHeader('content-type', 'image/png')`
    // - json数据:`res.setHeader('content-type', 'application/json;charset=utf-8')`
    
    // 2.创建服务
    const server = http.createServer((req, res) => {
    
        // 解构赋值
        const { url } = req;
        // console.log(url);
    
        // 获取路径
        const pathFile = path.join(__dirname, 'public', url);
        // console.log(pathFile);
    
        // 获取后缀名
        const ext = path.extname(pathFile);
        // console.log(ext);
        try {
            if (ext === '.html') {
                res.setHeader('content-type', 'text/html;charset=utf-8')
                const conter = fs.readFileSync(pathFile);
                res.end(conter);
            }else if(ext === '.css'){
                res.setHeader('content-type', 'text/css;charset=utf-8')
                const conter = fs.readFileSync(pathFile);
                res.end(conter);
            }
            else if(ext === '.js'){
                res.setHeader('content-type', 'application/javascript')
                const conter = fs.readFileSync(pathFile);
                res.end(conter);
            }
            else if(ext === '.jpg'){
                res.setHeader('content-type', 'image/jpg')
                const conter = fs.readFileSync(pathFile);
                res.end(conter);
            }
            else{
                res.end('404');
            }
        } catch (err) {
            res.statusCode = 404;
            res.end("请求不到数据", '404')
        }
    });
    
    // 3.启动服务
    server.listen(8000, () => {
        console.log('启动服务器成功', '端口号', 8000);
    });
    

    8.不同的URL返回不同的内容-设置statusCode

    在这里插入图片描述

    代码演示:

    res.statusCode = 404;
    res.end("请求不到数据", '404')
    

    9.处理.html文件的二次请求

    从服务器获取html文件之后,如果这个html文件中还引用了其它的外部资源(图片,样式文件等),则浏览器会重新再发请求。

    假设在index.html中还引入了 style.css 1.png 或者 .js文件,则:浏览器请求localhost:8000/index.html之后,得到的从服务器反馈的内容,解析的过程中还发现有外部的资源,所以浏览器会再次发出第二次请求,再去请求相应的资源。

    10.统一处理静态资源

    文件目录:

    |-public
    |-public/index.html
    |-public/stye.css
    |-public/1.png
    |-server.js
    

    代码演示:

    // 1.引入 http 模块
    const http = require('http');
    // 引入模块
    const fs = require('fs');
    const path = require('path');
    // console.log(http);
    
    const extToContentType = {
        '.html': 'text/html;charset=utf-8',
        '.css': 'text/css;charset=utf-8',
        '.js': 'application/javascript',
        '.jpg': 'image/jpg',
    }
    
    
    // 2.创建服务
    // request:本次请求
    // res : 本次响应
    const server = http.createServer((req, res) => {
        // 回调函数 : 每一次收到请求,他就执行一次
        // const { url } = req;
        // console.log(url);
        // const pathFile = path.join(__dirname, 'public-content-type', url);
        // console.log(pathFile);
        // const conter = fs.readFileSync()
    
        // 解构赋值
        const { url } = req;
        // console.log(url);
    
        // 获取路径
        const pathFile = path.join(__dirname, 'public', url);
        // console.log(pathFile);
    
        // 获取后缀名
        const ext = path.extname(pathFile);
        // console.log(ext);
        if (extToContentType[ext]) {
            // const conter = fs.readFileSync(pathFile);
            res.setHeader('content-type', extToContentType[ext])
            res.end(conter);
        } else {
            res.statusCode = 404;
            res.end("请求不到数据", '404')
        }
    });
    
    // 3.启动服务
    server.listen(8001, () => {
        console.log('服务器启动成功');
    })
    

    11.理解静态资源与接口的区别

    服务器上有很多的资源,每个资源都有自己的url。客户端浏览器想要访问某个资源就要向服务器发起对应的请求。

    11.1资源的分类

    • 静态资源
      • 它们一般表现为一个一个的文件。例如index.html, style.css, index.js, mp4, .png…。
      • 处理请求静态资源时,服务器一般就直接读出资源的内容,再返回给客户端浏览器
    • 动态资源:接口
      • 它们不是以某个具体的文件存在的,而是服务器上的一段代码,访问接口时,服务器会执行这段代码,然后把代码的执行结果返回给客户端浏览器。

    11.2发送请求的途径

    • 在地址栏中直接访问这个url
    • 通过某个a标签进行进行跳转
    • 通过表单进行提交
    • 通过ajax技术访问这个url

    11.3发送请求的类型

    • get:在地址栏中直接访问这个url就是get方式。对于静态资源,我们通过的处理方式就是get请求。
    • post: 通过表单提交,可以设置form的method为post
    • delete
    • put
    • patch
    • options

    12.写一个不带任何参数的get类型接口

    12.1目标

    提供一个名为getList的接口(http://localhost:8083/getList),它以json字符串格式返回db/data.json的内容。

    12.2目录结构

    |-db
    |---data.json # 数据
    |-server.js # 你的代码
    

    12.3代码演示

    // 三要素
    // 1.引入 http 模块
    const http = require('http');
    // console.log(http);
    const path = require('path');
    // 引入模块
    const fs = require('fs');
    // 2.创建服务
    // request:本次请求
    // res : 本次响应
    const server = http.createServer((req, res) => {
        // 回调函数 : 每一次收到请求,他就执行一次
        // 1. 当你的请求是get类型,并且地址是/getList时,解析查询字符串
        // 设置响应体
        // res.setHeader('content-type','text/html;charset=utf-8')
        const { url, method } = req;
        console.log(url, method);
        if (url === "/getList" && method === "GET") {
            const pathFile = path.join(__dirname, "db", 'data.json');
            console.log(pathFile);
            res.setHeader('content-type','application/json;charset=utf8')
            const conter = fs.readFileSync(pathFile)
            res.end(conter);
        } else {
            res.statusCode = 404;
            res.end("404")
        }
    });
    
    // 3.启动服务
    server.listen(8452, () => {
        console.log('服务器启动成功');
    });
    

    注意:类型

    • req.method 可以判断请求的类型
    • res.end()的参数只能是字符串(或者是buffer),而不能是对象

    13.写一个不带任何参数的get类型接口

    13.1目标

    提供一个名为getList?name=abc的接口(http://localhost:8083/getList?name=abc),它以json字符串格式返回db/data.json的内容。

    13.2目录结构

    |-db
    |---data.json # 数据
    |-server.js # 你的代码
    

    13.3代码演示:

    // 1.引入 http 模块
    const http = require('http');
    // console.log(http);
    // 引入模块
    const fs = require('fs');
    const path = require('path');
    const ps = require("querystring");
    
    // 2.创建服务
    // request:本次请求
    // res : 本次响应
    const server = http.createServer((req, res) => {
        // 回调函数 : 每一次收到请求,他就执行一次
        const [url, queryStr] = req.url.split("?");
    
        if (url === "/getList" && req.method === "GET") {
            const qsObj = ps.parse(queryStr)
            console.log(qsObj);
            const pathFile = path.join(__dirname, "db", "data.json")
            res.setHeader('content-type', 'application/json;charset=utf8')
            const conter = fs.readFileSync(pathFile)
            const arr = JSON.parse(conter)
            const re = arr.find(function (item) {
                if(item.name === qsObj.name){
                    return true;
                }else{
                    return false;
                }
            })
            const resa = JSON.stringify(re)
            console.log(resa);
            res.end(resa)
        } else {
            res.end('你好');
        }
        // 结束本次请求
        // 设置响应体:返回给用户看的
    });
    // 3.启动服务
    server.listen(8004, () => {
        console.log('服务器启动成功');
    
    })
    
    展开全文
  • 理解Servlet和Servlet容器、Web服务器概念

    万次阅读 多人点赞 2017-03-29 21:39:59
    转载自http://blog.csdn.net/iAm333之前在开源中国...于是,看了孙鑫的《Servlet/JSP深入详解:基于Tomcat的Web开发》、林信良的《JSP&Servlet学习笔记(第二版)》以及网上其他一些相关的资料,将自己的理解整理如下
  • web服务器、Web中间件和Web容器的区别

    万次阅读 多人点赞 2018-11-25 20:36:21
    我们经常会被Web服务器、Web容器和Web中间件这三个概念搞混。因为我们常见的很多网站要么是由IIS搭建,要么是由Apache、Tomcat、Ngnix搭建。所以,我们会把他们都叫成是Web服务器,因为他们都提供了Web服务,可以让...
  • web服务器和web应用服务器的区别

    千次阅读 2018-06-10 20:22:43
    首先,web服务器和web应用服务器不是同一个概念。起初,我也把两者混为一谈。现在说说自己对这两个的理解,如有不对之处,欢迎指出。 web应用服务器 在java web开发时,最早接触的web服务器是tomcat,其实tomcat是...
  • web服务器与ftp服务器的区别

    千次阅读 2017-08-25 17:10:03
    个人认为web服务器更侧重于网站网页技术,ftp更侧重于文件传输,共享,下面是一些概念性的东西,可以了解WEB服务器 WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服 务。 (1)应用层使用...
  • 主流web服务器介绍

    千次阅读 2014-05-02 13:54:39
     本文主要描述几种主流web服务器之间的对比,以便在不同的场景下,选择不同的web服务器,分为基本概念web服务器、web容器对比 基本概念:  1. 应用服务器:通过各种协议,包括http协议,把业务逻辑暴露给...
  • web服务器:负责处理http请求,响应静态文件,常见的有Apache,Nginx以及微软的IIS. 应用服务器:负责处理逻辑的服务器。比如php、python的代码,是不能直接通过nginx这种web服务器来处理的,只能通过应用服务器来...
  • 反向代理的概念及提高WEB服务器的安全性 2007-09-08 09:43:52 分类: 反向代理的概念及提高WEB服务器的安全性 公司上了几台服务器用suid做了反向代理,开始还有点闹不明白,不过后来清楚了,问能不能...
  • 以一次JSP请求响应为例,讲解服务器,Apache、Tomcat之间的关系先来个热身一个请求到发出到响应返回的全过程 首先,客户端发出一个请求 看到浏览器上的URL地址了么,那就是你的请求的主要内容。请求以一串文本的...
  • 基本概念 前言 web开发 web:网页 静态web html,css 提供给所有人看的数据始终不会发生变化 动态web 几乎所有的网站 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不...
  • mqtt服务器—web服务器——web页面

    万次阅读 2019-03-30 20:15:51
    web服务器------------>web页面 详情:mqtt服务器发布主题之后,客户端订阅主题,通过回调类拿到数据保存到数据库,接着web服务器读取数据库中的数据显示在页面。 大部分内容复制粘贴而来,加了一些自己的见解...
  • C++web服务器开发

    千次阅读 2019-08-14 08:55:56
    C++web服务器开发 1. 首先介绍一下这个项目;这个项目是通过C++11编写的web服务器,模型为Reactor+非阻塞I/O(epoll作为I/O多路复用实现方式)+线程池,支持get、head请求,支持HTTP长连接,并实现了优雅关闭连接。 ...
  • web 服务器有哪些

    万次阅读 多人点赞 2018-08-27 16:53:49
    什么是web服务器 "网络服务"(Web Service)的本质,就是通过网络调用其他网站的资源。 Web Service架构和云 如果一个软件的主要部分采用了"网络服务",即它把存储或计算环节"外包"...
  • Ubuntu 18.04下使用Apache搭建一个web服务器

    万次阅读 多人点赞 2018-07-24 21:30:40
    Ubuntu 18.04下使用Apache搭建一个web服务器 几个必要的概念 web服务器 以我之见,web服务器就是运行在计算机上的一个向整个网络或者是web客户端、浏览器提供文档的一个程序,我们通过http请求便可以获取到...
  • HTTP学习与Web服务器编程

    千次阅读 2017-11-20 00:00:28
    1)编写一个简单的Web服务器; 2)实现的服务器应能与标准的浏览器进行简单的交互; 3)记录浏览器与服务的交互过程; 4)利用HTML语言编写网页浏览器可通过编写的Web服务器正常访问该网页; 5)支持多用户并发...
  • Weblogic中服务器分为两种,一种是受管服务器,另外一种是管理服务器。   Weblogic课程(Weblogic是Oracle公司的,最开始的是BEA公司的) 一  系统管理 二  开发 三  性能调优   WLS(Weblogic Server) ...
  • 嵌入式设备web服务器比较

    千次阅读 2016-12-16 13:33:20
    现在在嵌入式设备中所使用的web服务器主要有:boa、thttpd、mini_httpd、shttpd、lighttpd、goaheand、appweb和apache等。 Boa 1.介绍 Boa诞生于1991年,作者Paul Philips。是开源的,应用很广泛,特别适合于嵌入式...
  • 最近在看书的过程中,发现了许多有关Web服务器Web服务器应用,J2EE应用服务器以及容器的相关知识点,为了不引起混淆,将通过该篇博客从概念定义功能原理上对这几个名词做一详细的阐述。 Web服务器是什么 Web...
  • WEB服务器性能瓶颈分析

    万次阅读 2011-11-04 20:50:14
    本文先介绍一下各种WEB服务器平台,然后对影响WEB服务器性能的各方面做了分析,最后解析了目前使用最普遍的Apache服务器在服务请求高峰时的响应延迟现象  在上周的一篇文章里,我们介绍了搭建WEB服务器的方法,...
  • Web服务器的工作原理(一)

    千次阅读 2016-11-21 15:16:31
    Web服务器的工作原理(一)12@(服务器)[Web服务器, Notes] VICTORY LOVES PREPARATIONWeb服务器的工作原理一12 思维导图 一web服务器应用服务器和web容器 web服务器 应用服务器 web容器 二Servlet 三ServletContext...
  • 什么是Web?及web服务器原理

    千次阅读 2016-12-10 23:53:06
    Web就是一种超文本信息系统,Web的一个主要的概念就是超文本连接,它使得文本不再象一本书一样是固定的线性的。而是可以从一个位置跳到另外的位置。你可以从中获取更多的信息。可以转到别的主题上。想要了解某一个...
  • 首先我们应该对应用服务器和web服务器有一个清晰的概念。所谓的应用服务器,就是提供应用的服务器,这里的应用有很多,比如java应用,ruby 应用,或者 c#应用。那么什么是web服务器呢?就是提供了web功能的服务器,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 327,112
精华内容 130,844
关键字:

web服务器概念