Skip to content

Commit

Permalink
nginx内置变量和location顺序
Browse files Browse the repository at this point in the history
  • Loading branch information
arthurlu committed Jan 12, 2019
1 parent 35ea97c commit 4a34199
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 2 deletions.
51 changes: 50 additions & 1 deletion nginx.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,46 @@
# 一、Nginx概述

# 二、内置变量
下面只列出的本人使用过的内置Nginx变量,其他内置变量并未列出,将会根据本人情况持续更新。更全面的内置变量可以看[官方文档](http://nginx.org/en/docs/varindex.html)
| var | desc |
| :------: | :------: |
| $request | 整个原始请求行 |
| $request_body | 请求的body, location中用到proxy_pass,fastcgi_pass,scgi_pass命令时,该变量才有值,否则为空字符串 |
| $request_uri | 请求uri(不包含协议和域名,但是包含查询字符串), 不会受rewrite影响 |
| $request_method | 请求的方法,比如"GET"、"POST"等 |
| $uri | 请求uri(不包含协议、域名和查询字符串), 若经过了rewrite, 则$uri是rewrite后的值 |
| $args | 请求中的查询参数 |
| $query_string | 请求中的查询字符串, 等价于$args |
| $arg_XXXX | 请求中的参数XXXX对应的value |
| $is_args | 如果uri带有查询参数,返回"?",否则返回空字符串 |
| $scheme | 所用的协议,比如http或者是https |
| $http_XXXX | 请求中headers的XXXX对应的value |
| $http_via | 最后一个访问服务器的Ip地址 |
| $http_x_forwarded_for | 相当于网络访问路径|
| $remote_addr | 客户端IP地址 |
| $remote_port | 客户端端口号 |
| $remote_user | 客户端用户名, 认证用, 由Basic authentication校验后提供 |

若有一个如下请求:
```sh
$ curl -v -H "Content-type: application/json" -d '{"name":"lsj"}' "http://github.com/lsj9383/NginxPractice?a=1&b=3"

# 请求体
> POST /lsj9383/NginxPractice HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> Host: github.com
> Content-type: application/json
> Content-Length: 2
```

下面是一些可以确认的内置变量:
* $request为`POST /lsj9383/NginxPractice HTTP/1.1`
* $uri为`/lsj9383/NginxPractice`
* $request_uri为`/lsj9383/NginxPractice?a=1&b=2`
* $args为`a=1&b=2`
* $arg_a为`1`
* $is_args为`?`

# 三、常用配置
下面会列出每个语句块中的常用配置。
Expand All @@ -20,6 +60,13 @@
# 四、不常用配置

# 五、location匹配规则
匹配uri的优先顺序,从高到底:
* 0, `location = /uri`, 精确匹配优先级最高
* 1, `location ^~ /uri`, 前缀匹配优先级次之, 前缀匹配内部按最大匹配长度来确认
* 2, `location ~ /uri`, 正则匹配, 正则匹配按配置文件的顺序, 一旦匹配到直接使用
* 2, `location ~* /uri`, 特殊的正则匹配, 不区分大小写, 和普通正则匹配同一优先级
* 3, `location /uri`, 优先级低于正则匹配的前缀匹配, 前缀匹配内部按最大匹配长度来确认
* 4, `location /`, 优先级最低的, 通常进行默认处理

# 六、http_map的使用

Expand Down Expand Up @@ -54,4 +101,6 @@

## 3.uri被重定向到斜杠后缀的问题

# 十、upstream的节点在线检查
# 十、upstream的节点在线检查

# 十一、set指令的一些问题
8 changes: 8 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,11 @@
* [Nginx模块开发](nginx-dev.md)
* [Openresty](openresty.md)
* [System](openresty.md)

本人学习相关知识时所涉及到的文献:
* [Nginx官方内置变量表](http://nginx.org/en/docs/varindex.html)
* [OpenResty最佳实践](https://moonbingbing.gitbooks.io/openresty-best-practices/)
* [agentzh的Nginx教程](http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html)
* [lua-nginx-module](https://github.com/openresty/lua-nginx-module)
* [深入理解Nginx模块开发与架构解析]()
* [Nginx高性能Web服务器详解]()
31 changes: 30 additions & 1 deletion system.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,37 @@
# 三、进程莫名down
在个人开发过程中,经常会发现服务进程down,但是又并非core。这种现象在测试环境频发,正式线上环境反而会较少遇到。例如本人维护的测试环境Redis经常会掉线,对于这种情况,最简单的处理方案是写一个简单的监控启动脚本,并通过`crontab`来定时执行,该脚本的功能是监控到相关进程down,就进行启动, 下面是一个python的redis进程监控启动脚本,以及对应的定时器。
```py
# !/bin/python
#!/bin/python
# -*- coding:utf-8 -*-

import os
import time

def redis_exist():
out = os.popen("ps aux|grep redis-server").readlines()
for proc in out:
proc = proc.strip()
if "6379" in proc :
return True
return False

def main():
now = int(time.time())
exist = redis_exist()
if exist:
return True
out = os.popen("redis-server /etc/redis.conf").readlines()
exist = redis_exist()
log = "%s : redis not exist and restart %s" % (now, "success" if exist else "failed")
os.popen("echo %s >> /root/redis-sbin/log-redis-restart" % log)
return exist




if __name__ == "__main__":
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print "redis : ", main()
```

```sh
Expand Down

0 comments on commit 4a34199

Please sign in to comment.