一. 前言
本片文章面向后端开发,讲述后端在进行开发时所使用的WEB服务器的工作流程,正所谓知根知底,WEB服务器是后端开发人员日常用于调试WEB程序和与前端通讯的一种方式!
WEB服务器最为强大的地方是能够执行WEB程序,其WEB程序的编程语言并没有明确的规定,因为只要你所使用的服务器支持这样的程序就可以了!
WEB服务器更像是一个平台,在此平台上编写软件我们称其为WEB编程,注:WEB编程下有许多规范比如CGI,FastCGI等等,这个是要看服务器的支持范围!
不同服务器所使用的规范不同,比如JSP服务器只能运行由JAVA EE编写的WEB程序,不能用于运行像C/C++、Python等编程语言编写而成的WEB程序!
通常情况下的WEB服务器所使用的编程规范均为CGI编程、只能运行CGI规范的程序,除了一些例外的WEB服务器,比如JSP服务器!
二. CGI规范,WEB服务器执行过程
什么是CGI规范?
CGI是Common Gateway Interface的缩写,其意义为公用网关接口,意思可以理解为:在WEB服务器上运行一个程序或脚本,并且WEB服务器要将脚本执行结果返回给浏览器(客户端)!
规范从何而谈?
规范的意思是,无论你使用任何语言编写,都必须使用输出函数(cout,printf,print)输出HTML格式的数据信息,WEB服务器根据这些信息传递给浏览器,浏览器HTML树并将其显示到浏览器当中,即为一个WEB页面!
更加深层次的来说其实,无论你使用什么语言编写,只要在WEB服务器中的配置文件中,使其支持CGI编程,然后将你编译完成的二进制可执行文件后缀名改为.cgi,最后前端页面在使用get或post方法请求这个WEB程序,WEB服务器会自动执行这个程序并将其结果送回给浏览器(TCP/IP协议)!
实际执行是由操作系统来完成的,只是WEB服务器将程序中打印输出的字符信息给重定向到WEB服务器当中了,即WEB服务器在调用你的CGI程序时会使用一条操作系统都有的命令,重定向:
>>
printf或cout等打印函数的底层实现过程是将数据写入到显存中,根据要打印字符的位置并把位置写入到显存下,GPU会根据显存数据在屏幕点亮像素点中对应的二极管(RGB),一般字符字体都是由操作系统来完成的,因为字体的不同,笔画也就不同!printf会把要打印的字符数据转交给操作系统,在从用户态到内核态之间的转换,在到显存,且也要考虑编码的问题,因为不同的编码对应不同的数据,printf只会移交ASCII(最底层是没有字符这个概念的只有二进制码,而二进制码可以转换成ASCII码)码,操作系统需要根据当前程序使用的编码,并将ASCII码转换成当前编码要输出的字符,并且操作系统也要考虑屏幕分辨率,比较分辨率的不同像素点占用就不同!
其当服务器在执行CGI程序时,也可以不用把程序后缀改为.CGI,你可以在配置文件中增加支持的扩展后缀名:.exe、.py、.c、.elff(ARM可执行文件/Linux可执行文件,Linux就是为ARM设计的)
注意如果你配置成源文件的格式需要WEB服务器的支持,比如apache服务器,仅支持py文件,apache服务器会自动编译.py文件并执行!
如果是在Linux或MAC系统下需要设置目录权限:
chown -R 555 //所有访问权限
如何接受从服务器传递来的信息?
当我们前端页面向WEB服务器发送一个请求时(get/post)会有一个传参,里面包含着请求数据,比如:
https://www.zzhblog.cn/c.cgi/?utm_source=csdnbar
其意思为,请求www.zzhblog.cn服务器下的c.cgi程序,并向其传递一个参数,参数名为:utm_source,参数数据为:csdnbar
也有这样的:
https://www.zzhblog.cn/?utm_source=csdnbar
没有请求的程序名,其实是WEB服务器后台给隐藏掉了,你可以在自己的WEB后台中配置默认文件,即输入网站地址而无需指定文件名,访问即返回默认文件!
或者隐藏请求文件名,WEB服务器会把这些信息放到报文头了,浏览器接受到之后会自动隐藏!
那么我们要怎样得到传递来的信息呢?这里就需要使用CGI提供的模块了,CGI提供了C/C++版的模块和Python等的模块,使用这些模块里的Get方法可以轻而易举的获取后台服务器传递过来的信息,然后在对这些数据进行处理,并把处理结果重定向给WEB服务器,最后WEB服务器将结构返回给浏览器,注意结果必须以HTML格式返回!
整个执行过程都是经过HTTP协议格式规范来的!
不过目前有的WEB服务器已经开发出自己的WEB服务器编程语言,也就是说该WEB服务器只能运行指定运行编译的程序,并且该语言下提供了很多较为方便的模块,可以调用直接读取一些相关数据,和处理数据的模块!
关于C/C++方面的WEB程序开发
C/C++编写WEB程序开发效率实在是非常之低,因为通常情况下我们做WEB服务器处理,一般都是对字符的解析,而C/C++传递过来的GET或POST数据是一个完整的URL和报文,需要C/C++自己去解析这些数据,不像其他编程语言已经为其解析完成,拿过来直接处理即可,而且C/C++对字符处理方面库支持本身就很差,需要开发人员手动编写字符处理库,所以这也是为什么大家不愿意使用C/C++做WEB服务器开发,因为要写很多代码,即使是由CGI模块的支持,但CGI模块只能用于获取WEB服务器传递过来的数据!
再则,C/C++本身就是一个不是易学,且要考虑内存泄漏问题的一个编程语言,现在很多编程语言会自动帮你释放不用且丢失的内存,解决内存泄漏,也就是托管式代码平台,经典的有:.net
C/C++WEB服务器开发效率与其他编程语言对比
C/C++需要编写很多代码来完成某个任何,极其降低后端开发效率,但是也提高个人编程能力,现在很多编程语言都提供了很多模块,来完成某些任何,甚至可以说不是编程语言,是脚本,专门调用C/C++写的代码,比如Python!
由于Python简单,模块多,可以简单调用模块处理许多复杂模块,所以很收后端开发人员的欢迎!
有的时候没有CGI模块,WEB服务器在开发文档中会告诉你,参数会存放在哪儿,哪个临时文件中,或直接利用C/C++传参的方式传递:
a.out aaa aaa
a.out代码:
-
int main(int x,int *a[]){
-
}
这是最经典的方式,x代表参数数量,a代表参数!
a一般是个数组指针,指向每个参数!
-
for(
int i =
0;i < x;++i){
-
printf(
"%s",*a[i]);
-
}
CGI与FastCGI
CGI程序只能被请求一次,也就是说一次只能执行一个客户端发来的请求,假如说有一百个客户端同时请求这个程序,那么该程序要一个一个的执行!
而FastCGI就是CGI的升级版,该规范可以同时以多线程的方法来执行CGI程序,一百个客户端同时请求CGI程序时,服务器就会同时执行一百个CGI程序来处理这些客户端,可以在WEB服务器的配置文件中修改选择对应的CGI和FastCGI方法,WEB服务器会根据这些方法来做对应的规范!
执行效率与算法
在前端把数据传递到后端以后,后端要着手处理这个数据,就拿搜索引擎为例子:当我们在搜索引擎中输入相关数据时,要知道,在庞大的万维网平台中,网页资源几乎数不胜数,每天都会要上亿的新网页诞生。
搜索引擎中有一个叫蜘蛛的模块,用于将这些数据爬下来,也就是网络爬虫,保存到服务器本地上,假设你的搜索引擎服务器中有数百亿条数据,并且网页路径和域名,网页名在数据库里存储好的,那么当用户在浏览器里输入某个关键字时,就会找到海量的相同数据,那么后端人员要做的是将这些数据以热度并排名按从大到小的方式出现在搜索页面的下拉框里,供用户挑选,那么此时就考虑到算法的要求了,倘若算法太复杂,那么后端执行个一两分钟才返回结果那么用户体验是不是就很差?
三. HTTP协议规范
这里不做详细介绍,因为博主之前有写过对HTTP/HTTPS协议规范的详细介绍,所以这里简明摘要!
HTTPS之所以叫HTTPS是因为在使用TCP协议加密时通过SSL算法进行加密,HTTPS传输过程比HTTP要更加耗时!
其次使用HTTPS握手过程需要证书验证,所以WEB服务器方也必须支持SSL协议!
在浩荡的互联网中,就像开车一样,当我们开一辆货车运载资源时,难免会遇上堵车,那么此时就需要交通法则,来规定我们怎样传输,从而避免网络堵塞的情况,同时也要避免两辆车互相撞在一起导致数据丢失,发生丢包的状况,所以HTTP协议规范用语规定互联网中应该怎样传输数据,比如HTTP协议规范确定使用TCP协议来传递数据,防止因为网络拥堵或堵塞导致丢包的现象,实则上路线的选择是由猫(调制转换器)来决定的,猫会根据当前连接的线路状况来确定最优的传输路线,而TCP只是规定怎样来完成这次的传输,传输路线是由猫来完成的,以及收,收到之后猫会把数据发送给网卡,网卡解析数据在发送给上层,也就是形成了网络七层的概念!
以上的APDU、PPDU即为封装,因为上层需要把自己的数据封装到一个包里,然后发给下层,下层在把这个数据拆开翻译意思,在根据意思添加自己的报文格式进去,即形成了APDU、PPDU包格式!
假如我要向IP为1.0.0的地方发送一个A的字符,那么需要填写IP地址和数据段信息,然后发送给传输层,传输层在把这个数据拆开分析其意思,然后在进行格式转换,压缩,确定传输方式,在传送给下一层,这样做的方法是为了确保不同的数据结果格式上的歧义问题(表示层以后的层格式是统一的,所以需要表示层来统一格式),然后在到物理层在转换成BIT的电路信号方式确定最优路线发送到指定路由下,路由器接收到之后呢,在一步一步按照前面的步骤拆包,一步一步分析包,最终发送到电脑上的指定程序下!
其实像应用服务器,是没有七层这么个概念的,实则上就三层,应用层选择好路径,数据和方法,表示层分析数据和方法,并对这些格式进行压缩,加密然后传递给传输层,传输层在拆开确定方法,修改报文格式,增加新的包头,直接发送给物理层,由猫直接发送出去,在TCP协议中无需经过HTTP协议,HTTP协议只在WWW开头的万维网域名下有效!
相关连接:HTTP/HTTPS协议原理,HTTP/HTTPS协议原理,HTTP协议层开发
转载:https://blog.csdn.net/bjbz_cxy/article/details/80320420