巨大的建筑, 总是由一木一石叠起来的, 我们何妨做做这一木一石呢? 我时常做些零碎事, 就是为此.
这是对的, 但是我没有说过这句话! -- 鲁迅
简单梳理一下 nginx 中关于 server 和 location 的配置.
比如 URL: http://www.mask_dev2.com:9999/login/
server 管的前半部分, 即: http://www.mask_dev2.com:9999/
location 管的是后半部分, 即:/login/
一个 nginx 可以配置多个 server.
每个 server 可以配置多个 location.
URL 的前半部分控制选择哪一个 server, 后半部分控制选择哪一个 location, 最终决定往哪里去请求.
server 的配置
- server {
- listen 9999;
- server_name www.mask_dev2.cn;
- location / {
- default_type text/html;
- content_by_lua ' ngx.say("<p>first</p>")
- ';
- }
- }
- server {
- listen 9999;
- server_name www.mask_dev2.*;
- location / {
- default_type text/HTML;
- content_by_lua ' ngx.say("<p>second</p>")
- ';
- }
- }
- server {
- listen 9998;
- server_name _;
- location / {
- default_type text/HTML;
- content_by_lua ' ngx.say("<p>third</p>")
- ';
- }
- }
首先, 请求 nginx 的地址, 肯定是请求的 nginx 所在的服务器, 也就是说 ip 是固定的.
也就是说, 无所谓 server_name 是什么, 都是指的当前服务器.
那么当前服务器是怎样对应多个域名呢, 这个只需要在相应的 dns 服务器中进行添加, 就行了, 比如暂时把本机当成 dns 服务器, 修改 hosts
- 127.0.0.1 localhost
- 127.0.0.1 http://www.mask_dev2.cn/
- 127.0.0.1 http://www.mask_dev2.com/
server 匹配顺序
server_name 与 host 匹配优先级如下:
1, 完全匹配
2, 通配符在前的, 如 *.test.com
3, 在后的, 如 www.test.* http://www.test.*/
4, 正则匹配, 如~^\.www\.test\.com$
如果都不匹配
1, 优先选择 listen 配置项后有 default 或 default_server 的
2, 找到匹配 listen 端口的第一个 server 块
location 配置
找到 server 之后, 再去找具体的 location
- server {
- listen 9998;
- server_name _;
- location = / {
- #规则 A
- }
- location = /login {
- #规则 B
- }
- location ^~ /static/ {
- #规则 C
- }
- location ~ \.(gif|jpg|PNG|JS|CSS)$ {
- #规则 D
- }
- location ~* \.PNG$ {
- #规则 E
- }
- location !~ \.xhtml$ {
- #规则 F
- }
- location !~* \.xhtml$ {
- #规则 G
- }
- location / {
- #规则 H
- }
语法规则:
location [=||*|^~] uri { ... }
= 开头表示精确匹配
^~ 开头表示 uri 以某个常规字符串开头, 理解为匹配 url 路径即可. nginx 不对 url 做编码, 因此请求为 / static/20%/aa, 可以被规则 ^~ static /aa 匹配到 (注意是空格).
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
! 和!* 分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配, 任何请求都会匹配到.
多个 location 配置的情况下匹配顺序为 (参考资料而来, 还未实际验证, 试试就知道了, 不必拘泥, 仅供参考):
首先匹配 =, 其次匹配 ^~, 其次是按文件中顺序的正则匹配, 最后是交给 / 通用匹配. 当有匹配成功时候, 停止匹配, 按当前匹配规则处理请求.
但是一般没有这么复杂, 有 3 点.
默认请求.
页面请求.
后台逻辑请求.
- # 直接匹配网站根, 通过域名访问网站首页比较频繁, 使用这个会加速处理, 官网如是说.
- # 这里是直接转发给后端应用服务器了, 也可以是一个静态首页
- # 第一个必选规则
- location = / {
- proxy_pass http://tomcat:8080/index
- }
- # 第二个必选规则是处理静态文件请求, 这是 nginx 作为 http 服务器的强项
- # 有两种配置模式, 目录匹配或后缀匹配, 任选其一或搭配使用
- location ~* \.(gif|jpg|jpeg|PNG|CSS|JS|ico)$ {
- root /webroot/res/;
- }
- # 第三个规则就是通用规则, 用来转发动态请求到后端应用服务器
- # 非静态文件请求就默认是动态请求, 自己根据实际把握
- # 毕竟目前的一些框架的流行, 带. PHP,.jsp 后缀的情况很少了
- location / {
- proxy_pass http://127.0.0.1:8080/
- }
总结
比如, 现在同时启动 前台系统, 和后台系统, 就可以用两个 server(可以配置 host 为 API,admin, 或者直接修改端口也可以), 每个 server 中 3 个 location 来确定具体页面的请求.
来源: http://www.jianshu.com/p/95e5c5454559