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的方式来简化配置。