NGINX常见问题
Hkc 2021-08-26 NGINX
# location 路径映射
location [ = | ~ | ~* | !~ | !~* | @ ] uri {...}
= 表示精确匹配,如果找到,立即停止搜索并立即处理此请求。
~ 表示执行一个正则匹配,区分大小写匹配
~* 表示执行一个正则匹配,不区分大小写匹配
!~ 区分大小写不匹配
!~* 不区分大小写不匹配
^~ 即表示只匹配普通字符(空格)。使用前缀匹配,^表示“非”,即不查询正则表达式。如果匹配成功,则不再匹配其他 location。
@ 指定一个命名的 location,一般只用于内部重定向请求。例如 error_page, try_files
uri 是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式;
优先级和示例:
[不加] < [~/~*] < [^~] < [=]
# proxy_pass 转发地址问题
首先 nginx.conf 配置文件中涉及转发地址相关的有两处配置 location 和 proxy_pass
- 若 location 和 proxy_pass 都带/,那么真实地址不会追加 location 的内容
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
//访问: http://www.test.com/api/upload -> http://127.0.0.1:8080/upload
- 若 location 和 proxy_pass 都不带/,那么真实地址会追加 location 的内容
location /api {
proxy_pass http://127.0.0.1:8080;
}
//访问: http://www.test.com/api/upload -> http://127.0.0.1:8080/api/upload
- 若 location带/ ,proxy_pass 不带/,那么真实地址会追加 location 的内容
location /api/ {
proxy_pass http://127.0.0.1:8080;
}
//访问: http://www.test.com/api/upload -> http://127.0.0.1:8080/api/upload
- 若 location不带/ ,proxy_pass 带/,那么真实地址不会追加 location 的内容
location /api {
proxy_pass http://127.0.0.1:8080/;
}
//访问: http://www.test.com/api/upload -> http://127.0.0.1:8080//upload
//注意此时的地址会存在两个/
# 其他常用指令
# return 指令
返回 http 状态码和可选的第二个参数可以是重定向的 URL
# rewrite 指令
重写 URI 请求 rewrite,通过使用 rewrite 指令在请求处理期间多次修改请求 URI,该指令具有一个可选参数和两个必需参数。
第一个(必需)参数是请求 URI 必须匹配的正则表达式。
第二个参数是用于替换匹配 URI 的 URI。
可选的第三个参数重写策略
last 重写后的 URL 发起新请求,再次进入 server 段,重试 location 的中的匹配;
break 直接使用重写后的 URL ,不再匹配其它 location 中语句;
redirect 返回 302 临时重定向;
permanent 返回 301 永久重定向;
# error_page 指令
使用 error_page 指令,您可以配置 NGINX 返回自定义页面以及错误代码,替换响应中的其他错误代码,或将浏览器重定向到其他 URI。在以下示例中,error_page 指令指定要返回 404 页面错误代码的页面(/404.html)。
# 日志
访问日志:需要开启压缩 gzip on; 否则不生成日志文件,打开 log_format、access_log 注释
# deny 、allow 指令
# 内置变量
nginx的配置文件中可以使用的内置变量以美元符$开始。其中,大部分预定义的变量的值由客户端发送携带。
$args :#这个变量等于请求行中的参数,同$query_string
$content_length :请求头中的Content-length字段。
$content_type :请求头中的Content-Type字段。
$document_root :当前请求在root指令中指定的值。
$host :请求行的主机名,为空则为请求头字段 Host 中的主机名,再为空则与请求匹配的server_name
$http_user_agent :客户端agent信息
$http_cookie :客户端cookie信息
$limit_rate :这个变量可以限制连接速率。
$request_method :客户端请求的动作,通常为GET或POST。
$remote_addr :客户端的IP地址。
$remote_port :客户端的端口。
$remote_user :已经经过Auth Basic Module验证的用户名。
$request_filename :当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme :HTTP方法(如http,https)。
$server_protocol :请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr :服务器地址,在完成一次系统调用后可以确定这个值。
$server_name :服务器名称。
$server_port :请求到达服务器的端口号。
$request_uri :包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri :不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri :与$uri相同