Linux系统与网络管理

黄玮

第五章:Web服务器


The term “Cyberspace” started to become a de facto synonym for the Internet, and later the World Wide Web

WWW的技术内核


RFC


In fact, each RFC has a status, relative to its relation with the Internet standardization process: Informational, Experimental, or Standards Track (Proposed Standard, Draft Standard, Internet Standard), or Historic.


RFC 1630

RFC 1738

RFC 2396

协议族




关于URI / URL / URN / IRI等等标识符


传统观点


现代观点


IRI (International Resource Identifier):URI语法的扩展,用来支持非ASCII字符集,例如UTF-8就是最为广泛支持的字符编码集合。

认识 URL


This document was written by the URI working group of the Internet Engineering Task Force.

完整定义详见「RFC 1738」 5. BNF for specific URL schemes


URL 的一般形式

genericurl     = scheme ":" schemepart

scheme         = 1*[ lowalpha | digit | "+" | "-" | "." ]
schemepart     = *xchar | ip-schemepart
ip-schemepart  = "//" login [ "/" urlpath ]

常见 scheme


reserved       = ";" | "/" | "?" | ":" | "@" | "&" | "="
hex            = digit | "A" | "B" | "C" | "D" | "E" | "F" |
                 "a" | "b" | "c" | "d" | "e" | "f"
escape         = "%" hex hex

unreserved     = alpha | digit | safe | extra
uchar          = unreserved | escape
xchar          = unreserved | reserved | escape

HTTP URL

以下内容摘录自「RFC 1738」3.3. HTTP

http://<host>:<port>/<path>?<searchpart>


大小写敏感?

For resiliency, programs interpreting URI should treat upper case letters as equivalent to lower case in scheme names (e.g., allow “HTTP” as well as “http”).


🌰 找不同


🌰 找不同

Web技术架构


用户视角的基本Web技术架构


组件视角的基本Web技术架构

服务器


NetCraft在2020年3月根据全球257,194,796个站点、1,263,025,546台服务器的信息统计结果绘制更新以下Web服务器市场占有率统计图


Alexa排名全球前1000万网站使用WEB服务器统计


据w3techs在2020年3月27日的统计数据表明:



Cloudflare 是一家以全球「内容分发网络」(CDN)起家的公司,目前可以提供包括内容交付优化、Web 应用程序防火墙、分布式拒绝服务(DDoS)缓解、SSL 等多种互联网「安全增值」服务。根据 nginx.com 上的一篇文章 我们可以进一步了解到 nginxCloudflare 旗下 CDN 产品的广泛应用。


其他视角探索WEB服务器的市场占有率


接下来,我们重点关注

nginx


核心特性列表

商业版支持nginx plus


nginx 衍生版代表 OpenResty


nginx 衍生版代表 Kong

基于OpenResty构建的API网关和微服务管理系统


nginx 衍生版代表 Tengine

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。

早期项目开发者中包括OpenResty项目的核心开发者,因此和OpenResty具有很多相同或相似特性(例如Lua支持)


nginx 衍生版代表 VeryNginx

VeryNginx基于lua_nginx_module(openrestry)开发,实现了高级的WEB防火墙、访问统计和其他的一些功能。集成在Nginx中运行,扩展了Nginx本身的功能,并提供了友好的Web交互界面。

应用程序服务器(支持服务器端脚本运行)


CGI / FastCGI









⚠️ 避免php-fpm进程被远程任意访问到

adoy/PHP-FastCGI-Client: This PHP class handles the communication with a FastCGI (FCGI) application using the FastCGI protocol.

Apache mod_php


以nginx+php-fpm为例搭建一个Web站点


How To Install WordPress with LEMP on Ubuntu 18.04

客户端



cURL是什么

以下摘自cURL的man手册页说明:

curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP). The command is designed to work without user interaction.

curl offers a busload of useful tricks like proxy support, user authentication, FTP upload, HTTP post, SSL connections, cookies, file transfer resume, Metalink, and more. As you will see below, the number of features will make your head spin!


HTTP是什么

以下摘自RFC 2616:

The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. It is a generic, stateless, protocol which can be used for many tasks beyond its use for hypertext, such as name servers and distributed object management systems, through extension of its request methods, error codes and headers [47]. A feature of HTTP is the typing and negotiation of data representation, allowing systems to be built independently of the data being transferred.

HTTP in Action


# 标准HTTP GET请求标准静态Web Server
curl -v http://www.cuc.edu.cn

# 标准HTTP GET请求有前端缓存系统的静态Web Server
curl -v https://www.qq.com -o q.html 
curl -v https://www.taobao.com -o t.html

# 标准HEAD请求
curl -v -I http://www.cuc.edu.cn -o s.html

# 服务器端使用自定义HTTP响应头
curl -v https://www.baidu.com
curl -vv https://www.alipay.com

# 处理302和301重定向
curl -vv -L http://www.baidu.com

# 使用自定义User-Agent,绕过服务器端对客户端类型的检测和限制
curl -vv -L -A "Android 250.0" https://www.baidu.com -o baidu_a.html
curl -vv -L https://www.baidu.com -o baidu_c.html
# 比较使用不同User-Agent访问百度首页得到的页面差异
vimdiff baidu_a.html baidu_c.html

# GET传参
curl -vv 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E4%BC%A0%E5%AA%92%E5%A4%A7%E5%AD%A6' -o baidu_cuc_curl.html -L
curl 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E4%BC%A0%E5%AA%92%E5%A4%A7%E5%AD%A6' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36' -o baidu_cuc_mac.html -L
# 比较使用不同User-Agent进行百度搜索得到的结果差异
vimdiff baidu_cuc_curl.html baidu_cuc_mac.html

# 启用传输流压缩
curl -vv -H 'Accept-Encoding: gzip, deflate' https://www.baidu.com -o baidu.html.gz

# 使用自定义HTTP Request Header + POST表单数据
# TODO-1 请模拟学校教务处网站的登录表单完成命令行登录学校教务处任务
# TODO-2 模拟登录自己搭建的wordpress站点并使用curl发表一篇blog

注意到上面所有服务器设置的时间均使用到了一个关键词GMT,简单来说这是为了解决全球不同地区的时区差异问题而进行的一项关于时间的标准化设置。

参考文献