OpenResty完全开发指南:构建百万级别并发的Web应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5 HTTP服务

配置HTTP相关的功能需要使用指令http{},定义OpenResty里对外提供的HTTP服务,通常的形式是:

http {                                     #http块开始,所有的HTTP相关功能
  server {                                 #server块,第一个Web服务
      listen 80; #监听80端口
      location uri {                       #location块,需指定URI
          ... #定义访问此URI时的具体行为
      }                                    #location块结束
  }                                        #server块结束
  server {                                 #server块,第二个Web服务
      listen xxx; #监听xxx端口
      ... #其他location定义
  }                                        #server块结束
}                                          #http块结束

由于http块内容太多,如果都写在一个文件里可能会造成配置文件过度庞大,难以维护。在实践中我们通常把server、location等配置分离到单独的文件,再利用include指令包含进来,这样就可以很好地降低配置文件的复杂度。

使用include后http块就简化成了:

http {                                     #http配置块开始,所有的HTTP相关功能
  include common.conf                      #基本的HTTP配置文件,配置通用参数
  include servers/*.conf                   #包含servers目录下所有Web服务配置文件
}                                          #http配置块结束

2.5.1 server配置

server指令在http块内定义一个Web服务,它必须是一个配置块,在块内部再用其他指令来确定Web服务的端口、域名、URI处理等更多细节。

listen port;

listen指令使用port参数设置Web服务监听的端口,默认是80。此外还可以添加其他很多参数,例如IP地址、SSL、HTTP/2支持等。

server_name name ...;

server_name指令设置Web服务的域名,允许使用“*”通配符或“~”开头的正则表达式。例如“www.openresty.org”“*.openresty.org”。当OpenResty处理请求时将会检查HTTP头部的Host字段,只有与server_name匹配的server块才会真正提供服务。

对于我们自己的开发研究来说,可以直接使用localhost或者简单的通配符*.*,用类似“curl http://localhost/...”这样的命令就能够访问OpenResty。

2.5.2 location配置

location指令定义Web服务的接口(相当于RESTful里的API),也就是URI,它是OpenResty处理的入口,决定了请求应该如何处理。

location是一个配置块,但语法稍多一些,除{}外还有其他的参数:

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

location使用uri参数匹配HTTP请求里的URI,默认是前缀匹配,也支持正则表达式,uri参数前可以使用特殊标记进一步限定匹配:

■ =:URI必须完全匹配;

■ ~:大小写敏感匹配;

■ ~*:大小写不敏感匹配;

■ ^~:前缀匹配,匹配URI的前半部分即可。

在server块里可以配置任意数量的location块,定义Web服务接口。Nginx对location的顺序没有特殊要求,并不是按照配置文件里的顺序逐个查找匹配,而是对所有可能的匹配进行排序,查找最佳匹配的location。

不同的location里可以有不同的处理方式,灵活设置location能够让OpenResty配置清晰明了,易于维护。比如,我们可以在一个location里存放静态html文件,在另一个location里存放图片文件,其他的location则执行Lua程序访问MySQL数据库处理动态业务,这些location互不干扰,修改其中的一个不会影响其他的正常运行。例如:

location =    /502.html               #只处理/502.html这一个文件
location      /item/                  #前缀匹配/item/*
location ^~   /image/                 #显式前缀匹配/image/*
location ~    /articles/(\d+)$        #正则匹配/articles/*
location ~    /api/(\w+)              #定义RESTful接口
location      /                       #匹配任意的URI

需要注意最后一个“/”,根据前缀匹配规则,它能够匹配任意的URI,所以可以把它作为一个“黑洞”,处理所有其他location不能处理的请求(例如返回404)。

如果location配置很多,我们同样可以用include的方式来简化配置。