Skip to content

网络服务器响应

一般的做法是每有一个客户端连接进来,就fork一个新的服务器程序,如PHP

  • 服务器程序包含两个模块,等待连接模块和负责与客户端通信的模块
  • 服务器启动后完成初始化操作,运行等待模块,创建套接字,等待客户端的连接
  • 接收到客户端连接时,等待模块会恢复运行并接收连接,然后启动服务器的客户端通信模块,并移交完成连接的套接字
  • 每次有新的客户端发起连接,都会启动一个新的客户端通信模块(这个过程需要消耗服务器性能),因此通信模块与客户端是一对一的关系

nginx

代理

正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。

正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。

反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。

反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。

location匹配

参考

多个项目共用同一个域名时,往往需要根据url将请求转发到不同的项目上,此时需要配置location

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

修饰符的含义

  • = 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。
  • ~ 表示该规则是使用正则定义的,区分大小写。
  • ~* 表示该规则是使用正则定义的,不区分大小写。
  • ^~ 表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找。

具体的匹配过程为

  • 首先先检查使用前缀字符定义的location,选择最长匹配的项并记录下来。
  • 如果找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。
  • 然后按顺序查找使用正则定义的location,如果匹配则停止查找,使用它定义的配置。
  • 如果没有匹配的正则location,则使用前面记录的最长匹配前缀字符location。

小结

  • location的配置有两种形式,前缀字符和正则。查找匹配的时候,先查找前缀字符,选择最长匹配项,再查找正则。正则的优先级高于前缀字符。
  • 正则的查找是按照在配置文件中的顺序进行的。因此正则的顺序很重要,建议越精细的放的越靠前。
  • 使用=精准匹配可以加快查找的顺序,如果根域名经常被访问的话建议使用=

rewrite