internal指令.

只能用于location上下文; 表示只能是内部请求可以访问该location; 每个内部请求最多只能跳转10次, 超过限制次数, 会在error_log中打印500错误.


nginx 关闭某个server 块的access_logerror_log, 特别注意关闭error_log的用法.

server {
    listen 443 ssl;
    server_name _;
    access_log  off;
    error_log /dev/null;
    }

lastbreak的区别:

break和last都能阻止继续执行后面的rewrite指令, last对于重写后的URI会重新匹配location, 而break不会重新匹配location.

last: 停止当前这个请求, 并根据rewrite匹配的规则重新发起一个内部请求. 新请求又从第一阶段开始执行.

break: 相对last, 重写完URI后, break并不会重新发起一个请求, 而只是跳过当前的rewrite阶段, 并执行本请求location后续的执行阶段.


请求头字段不能使用下划线.

nginx默认request的header的中包含_时, 会自动忽略掉.

解决方法是: 在nginx里的nginx.conf配置文件中的http部分中添加如下配置:

underscores_in_headers on;  # 默认是off的

另外不建议开启, 因为可能会存在安全风险.


理解ngx_http_stub_status_module模块引入的几个参数:

Active connections: 291 
server accepts handled requests
     16630948 16630948 31070465 
Reading: 6 Writing: 179 Waiting: 106 

# requests 是客户端的总请求数
# accepts 是nginx接受的客户端的请求数
# handled 是nginx处理的客户端的请求数
# 一般情况下accepts和handled的数量是相等的, 除非达到了一些系统资源的限制, 比如worker_connections的限制.

# Reading 表示当前有多少个tcp连接正在用于nginx读取客户端请求的header.
# Writint 表示当前有多少个tcp连接正在用于nginx给客户端写响应.
# Waiting 表示当前有多少个tcp连接正在用于nginx等待客户端的请求.
# Active connections 表示nginx和客户端之间的tcp连接的总数量, 是Reading、Writing、Waiting的数量之和.

ngx-http-proxy-module模块引入的缓存功能的缓存文件说明:

stat 18de49b189a66f57208c47852e2ae15d

Access: 2019-08-07 17:44:44.875091237 +0800   # 对于新生成的缓存文件, 只在第一次请求过来的时候更新此时间.
Modify: 2019-08-07 17:44:27.330409891 +0800   # 文件过期后, 第一个请求过来时, 会想上游验证文件是否还有效, 上游返回304后, 缓存文件内容不会变, 但会更新此时间.
Change: 2019-08-07 17:44:27.330409891 +0800   # 和上一条一致.

理解$proxy_add_x_forwarded_for

the "X-Forwarded-For" client request header field with the $remote_addr 
variable appended to it, separated by a comma.
If the "X-Forwarded-For" field is not present in the client request header,
the $proxy_add_x_forwarded_for variable is equal to the $remote_addr variable.

这么理解:

用户请求前端nginx, 前端nginx设置的proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for指令, 把用户IP(即$remote_addr)赋值给x-forwarded-for头传递给kong, kong nginx设置的proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for指令,把前端的IP(即$remote_addr)追加给x-forwarded-for头, 以逗号分隔, 传递给后端服务. 这样后端看到的x-forwarded-for头的值就是两个IP了, 用户ip和前端ip.


去掉用户请求uri结尾的/.

# 匹配uri(不包括url参数)结尾带/的请求
if ($uri ~ /$) {
    # 301重定向, 让用户重新请求uri结尾去掉/的url
    rewrite ^(.*)/(.*)$ $1$2 permanent;
}