首页 > 技术文章 > nginx常用配置

reamd 2021-08-04 11:07 原文

nginx ngx_http_core_module模块变量

示例 http://127.0.0.1/test/abc?name=zhangsan&age=18

常用

  • $arg_name zhangsan
  • $args name=zhangsan&age=18
  • $query_string 请求 URI中的参数,与 $args相同,然而 $query_string是只读的不会改变
  • $uri /test/abc
  • $host 127.0.0.1
  • $request_method 表示 HTTP请求的方法名,大写,如 GET、PUT、POST等
  • $scheme 表示 HTTP scheme,如在请求 https://nginx.com/中表示 https
  • $request_uri /test/abc?name=zhangsan&age=18
  • $http_HEADER 表示当前 HTTP请求中相应头部的值。HEADER名称全小写。例如,示请求中 Host头部对应的值 用 $http_host表
  • $sent_http_HEADER 表示返回客户端的 HTTP响应中相应头部的值。HEADER名称全小写。例如,用 $sent_ http_content_type表示响应中 Content-Type头部对应的值
  • $is_args 表示请求中的 URI是否带参数,如果带参数,$is_args值为?,如果不带参数,则是空字符串
  • $request_body 表示 HTTP请求中的包体,该参数只在 proxy_pass或 fastcgi_pass中有意义
  • $request GET /test/abc?name=zhangsan&age=18 HTTP/1.1
  • $HTTP_X_REAL_IP 表示客户端的地址
  • $remote_addr 表示客户端的地址,如果有代理的话,表示代理机器的
  • $remote_port 表示客户端连接使用的端口,如果有代理的话,表示代理机器的
  • $remote_user 表示使用 Auth Basic Module时定义的用户名

不常用

  • $limit_rate 表示当前连接的限速是多少,0表示无限速
  • $nginx_version 表示当前 Nginx的版本号
  • $request_filename 表示用户请求中的 URI经过 root或 alias转换后的文件路径 /usr/share/nginx/html/test/abc
  • $request_body_file 表示 HTTP请求中的包体存储的临时文件名
  • $request_completion 当请求已经全部完成时,其值为 “ok”。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range访问的并不是文件的最后一块,那么其值也是空字符串。
  • $hostname vm_51_8_centos # nginx所在机器的名称
  • $server_addr 表示服务器地址 127.0.0.1
  • $server_name 表示服务器名称 127.0.0.1
  • $server_port 表示服务器端口 80
  • $server_protocol 表示服务器向客户端发送响应的协议,如 HTTP/1.1或 HTTP/1.0

nginx常用配置

  • 配置优先级 静态 > 正则 > 默认
注意:优先级逐级降低
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写的不匹配正则 5
!~* 不区分大小写的不匹配正则 6
/ 通用匹配,任何请求都会匹配到 7
  • location配置举例
 location /a {
	 default_type application/json;
	 return 200 '{"status":"success","result":"hello world"}';
 }
 location /b {
	 default_type text/html;
	 charset utf-8;
	#  add_header Content_Type 'text/html; charset=utf-8';
	 return 200 '你好,世界!';
 }
 location /c {
	 proxy_pass http://127.0.0.1:3001;
 }
location ~ ^/d/(.*)$ {
	proxy_pass http://127.0.0.1:3002/$1?$query_string;
}

/* 组判断begin */
set $is_matched 0;
// 请求头x-env: 3003
if ($http_x_env = 3003) {
	proxy_pass http://127.0.0.1:3003;
	set $is_matched 1;
}
if ($is_matched = 0) {
	// 其它操作
}
/* 组判断end */

rewrite模块指令

  • break
    语法:break
    默认值:none
    使用字段:server, location, if
    完成当前设置的重写规则,停止执行其他的重写规则。
    
  • if
    语法:if (condition) { … }
    默认值:none
    使用字段:server, location
    注意:尽量考虑使用trp_files代替。
    判断的条件可以有以下值:
    1. 一个变量的名称:空字符传”“或者一些“0”开始的字符串为false。
    2. 字符串比较:使用=或!=运算符
    3. 正则表达式匹配:使用~(区分大小写)和~*(不区分大小写),取反运算!~和!~*。
    4. 文件是否存在:使用-f和!-f操作符
    5. 目录是否存在:使用-d和!-d操作符
    7. 文件、目录、符号链接是否存在:使用-e和!-e操作符
    8. 文件是否可执行:使用-x和!-x操作符  
    
  • return
    语法:return code
    默认值:none
    使用字段:server, location, if
    停止处理并为客户端返回状态码。非标准的444状态码将关闭连接,不发送任何响应头。可以使用的状态码有:204,400,402-406,408,410, 411, 413, 416与500-504。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个URL,该URL将成为location头补值。没有状态码的URL将被视为一个302状态码。
    
  • rewrite
    语法:rewrite regex replacement flag
    默认值:none
    使用字段:server, location, if
    按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。可以在重写指令后面添加标记。
    注意:如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
    尾部的标记(flag)可以是以下的值:
    last - 停止处理重写模块指令,之后搜索location与更改后的URI匹配。
    break - 完成重写指令。
    redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。
    permanent - 返回301永久重定向。
    
  • set
    语法:set variable value
    默认值:none
    使用字段:server, location, if
    为给定的变量设置一个特定值。
    
  • rewrite_log
    语法:rewrite_log on | off
    默认值:rewrite_log off
    使用字段:server, location, if
    变量:无
    启用时将在error log中记录notice级别的重写日志。
    
  • uninitialized_variable_warn
    语法:uninitialized_variable_warn on|off
    默认值:uninitialized_variable_warn on
    使用字段:http, server, location, if
    控制是否记录未初始化变量的警告信息。
    

rewite规则

  • 重写规则的第一部分都是一个正则表达式
    • 示例:^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$
    • $1是两个小写字母组成的字符串,$2是由小写字母和0到9的数字组成的5个字符的字符串,$3将是个文件名,$4是png、jpg、gif中的其中一个。
  • 重写规则的第二部分是URI
    • 示例:/data?file=$3.$4
    • 如果这个URI不匹配nginx配置的任何location,那么将给客户端返回301(永久重定向)或302(临时重定向)的状态码来表示重定向类型。该状态码可以通过第三个参数来明确指定。
  • 重写规则的第三部分
    • last标记将导致重写后的URI搜索匹配nginx的其他location,最多可循环10次。如:rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4 last;

推荐阅读