当前位置 : 首页 » 文章分类 :  开发  »  Nginx

Nginx

Nginx笔记


414 Request-URI Too Large

当http 的URI太长或者request header过大时会报414 Request URI too large或400 bad request错误。

解决方法有:
1、修改Nginx网关header大小
2、改用post方法查询,过长的入参放到body中
3、减少入参长度,改多次调用

<html>
    <head>
        <title>414 Request-URI Too Large</title>
    </head>
    <body bgcolor="white">
        <center>
            <h1>414 Request-URI Too Large</h1>
        </center>
        <hr>
        <center>openresty/1.13.6.1</center>
    </body>
</html>

在nginx的nginx.conf修改如下参数的:

# 客户端请求头缓冲区大小,如果请求头总长度大于小于128k,则使用此缓冲区,
# 请求头总长度大于128k时使用large_client_header_buffers设置的缓存区
client_header_buffer_size 128k;  

# large_client_header_buffers 指令参数4为个数,128k为大小,默认是8k。申请4个128k。
large_client_header_buffers 4 128k;

Nginx基础

nginx官网文档
http://nginx.org/en/docs/

《深入理解nginx》在线支持网站
http://nginx.weebly.com/
http://taohui.org.cn/

nginx基础

1个master进程,n个worker进程,n对应CPU核的个数
master进程仅用于管理worker进程,不直接对用户请求服务
worker进程处理用户请求,并提供服务。
一个worker进程可同时处理的请求数只受限于内存大小。

pid文件:以ASC码存放master进程的ID

nginx命令行控制

nginx -t:在不启动nginx的情况下,测试配置文件是否有错误
nginx -v:显示nginx版本信息
nginx -V:显示nginx版本信息,以及配置编译阶段的信息,如gcc版本、linux内核版本、执行configure时的参数

nginx:默认启动
nginx -c /tmp/nginx.conf:指定配置文件启动

nginx -s stop:强制停止nginx服务,nginx通过nginx.pid文件获得master进程ID,再向master进程发送TERM信号
等同于kill -s SIGTERM master-pid
nginx -s quit:优雅地停止服务
等同于kill -s SIGQUIT master-pid

nginx -s reload:在不停止服务的情况下重新加载配置项并生效

错误:nginx: [error] open() “/usr/local/sms/logs/nginx.pid” failed (2: No such file or directory)
原因:当前没有nginx进程,直接使用reload启动导致的,因为reload时需要去读取pid


nginx配置

Nginx的配置文件是以block的形式组织的,一个block通常使用大括号“{}”表示。
block分为几个层级,整个配置文件为main层级,这是最大的层级;
在main层级下可以有event、http等层级,
而http中又会有server 层级,server中可以包含location层级。

每个层级可以有自己的指令(Directive),例如worker_processes是一个main层级指令,它指定Nginx服务的Worker进程数量。
若同一个命令既可以在外层配置,又可以在内层配置,则内层会继承外层的配置,若内层配置与外层不同则会覆盖外层配置。
在扩展模块开发时,可在解析配置项的模块中决定如何处理内外层配置冲突的问题。

配置文件可包含,例如:include mime.types,将配置文件mime.types包含进来

在http扩展模块开发过程中,需要特别注意的是main、server和location三个层级,因为扩展模块通常允许指定新的配置指令在这三个层级中。
一般来说,一个server块表示一个host,而里面的一个location则代表一个路由映射规则,这两个配置块可以说是http配置的核心。

配置项语法格式:
配置项名 配置项值1 配置项值2 …;
之间以空格分隔,若配置项值中有空格等特殊字符,需要用单引号或双引号括住配置项值

日志输出级别:debug、info、notice、warn、error、crit、alert、emerg,从左至右级别依次增大。
设定某个级别后,大于等于该级别的日志都会被输出

location配置

Nginx之location 匹配规则详解
http://www.cnblogs.com/lidabo/p/4169396.html

基本语法

location [ = | ~ | ~* | ^~ | @ ] /uri/ { ... }
注意:查询字符串(?id=5&key=33)不在URI范围内,例如:/films.htm?fid=123 的URI 是/films.htm

(1) =
精确匹配(严格匹配),即exact match,匹配上后立即停止,不再执行正则匹配。
例如 location = / {…} 只有当用户请求是http://host:port/时,才会使用该location下的配置

(2) ~
波浪线表示一个正则匹配,区分大小写

(3) ~*
表示一个正则匹配,不区分大小写

(4) ^~
表示普通字符匹配,即最大前缀匹配,且匹配上后立即停止,不再执行正则匹配
^表示“非”,~表示“正则”,字符意思是:不要继续匹配正则
例如 location ^~ /image/ {…} 以/images/开始的请求都会匹配上

(5) @
@表示仅用于nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求,带@的location是named_location

正则location与普通location

例如
location ~* \.(gif|jpg|jpeg)$ {...}
匹配以.gif、.jpg、.jpeg结尾的请求

普通location与正则location

正则location匹配让步普通location的严格精确匹配结果;但覆盖普通location的最大前缀匹配结果。

(1) “普通location”与“正则location”之间的匹配规则是:先匹配普通location ,再匹配正则location 。
(2) “普通location”内部(普通location与普通location)是如何匹配的呢?简单的说:最大前缀匹配。
(3) 选择出“普通location ”的最大前缀匹配结果后,还需要继续搜索正则location。
(4) 普通location与顺序无关,而正则location还是与顺序有关的,并且只要匹配到一条正则location ,就不再考虑后面的。
(5) 如果继续搜索的“正则location”也有匹配上的,那么“正则location”覆盖“普通location”的最大前缀匹配;但是如果“正则location”没有能匹配上,那么就用“普通location”的最大前缀匹配结果。
(6) 当“最大前缀”匹配恰好就是一个“严格精确(exact match )”匹配,照样会停止后面的正则匹配。

location / {}

遵守普通location 的最大前缀匹配,由于任何URI 都必然以“/ ”根开头,所以对于一个URI ,如果有更specific 的匹配,那自然是选这个更specific 的,如果没有,“/ ”一定能为这个URI 垫背(至少能匹配到“/ ”),也就是说“location / {} ”有点默认配置的味道。

正则表达式语法

^ 匹配字符串的开始
$ 匹配字符串的结束

. 匹配除换行符以外的任意字符

\ 转义字符,可以转义. * ?

* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次

例如:

location ~ ^/prefix/.*\.html$ {
    deny all;
}

表示对于以/prefix/开头,并且以.html结尾的所有URI请求,都拒绝访问
分析 ^/prefix/.*\.html$
^/prefix/ 表示匹配以/prefix/开头的,
.* 表示任意字符重复0或多次,
\. 是对.进行转义,即无特别含义的小数点,
\.html$ 表示以.html结尾的

rewrite

语法
rewrite regex replacement flag

rewrite只是会改写uri,不会改动查询参数(?id=5&key=33),所以无需关心查询参数,rewrite会自动添加到uri之后

flag参数

last :相当于Apache里的(L)标记,表示完成rewrite;
break;本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
last和break用来实现URL重写,浏览器地址栏URL地址不变

捕获变量

如果regex中使用了某种匹配模式,并且模式串里面带括号,那么表示会捕捉(capture)括号括起来的模式匹配到的字符串,
并将捕捉到的字符串依次设为变量$1,$2,…,然后在replacement中就可以使用这些变量了。

rewrite后去掉参数或改变参数

http://blog.sina.com.cn/s/blog_64e2219d01018lbr.html

关键点就在于“?”这个尾缀,重定向的目标地址结尾处如果加了?号,则不会在目标地址后添加源url中问号后的参数。

例如:
http://example.com/test.php?para=xxx 重定向到http://example.com/new
若按照默认的写法:rewrite ^/test.php(.) /new permanent;
重定向后的结果是:http://example.com/new?para=xxx
如果改写成:rewrite ^/test.php(.
) /new? permanent;
那结果就是:http://example.com/new

保留特定参数
假如又想保留某个特定的参数,那又该如何呢?
可以利用Nginx本身就带有的$arg_PARAMETER参数自行补充来实现。
例如:
http://example.com/test.php?para=xxx&p=xx
重写向到 http://example.com/new.php?p=xx
可以写成:rewrite ^/test.php /new.php?p=$arg_p? permanent;

可用的全局变量

args               #这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=blahblah;

arg_PARAMETER      #这个变量包含GET请求中如果有变量PARAMETER时的值。
例如http://example.com/test.php?id=5&key=33
则arg_id的值为5,arg_key的值为33

binary_remote_addr #二进制的客户地址。

body_bytes_sent    #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。

content_length     #请求头中的Content-length字段。

content_type       #请求头中的Content-Type字段。

cookie_COOKIE      #cookie COOKIE变量的值

document_root      #当前请求在root指令中指定的值。

document_uri       #与uri相同。

host               #请求主机头字段,否则为服务器名称。

hostname           #Set to the machine’s hostname as returned by gethostname

http_HEADER

is_args            #如果有args参数,这个变量等于”?”,否则等于”",空值。

http_user_agent    #客户端agent信息

http_cookie        #客户端cookie信息

limit_rate         #这个变量可以限制连接速率。

query_string       #与args相同。

request_body_file  #客户端请求主体信息的临时文件名。

request_method     #客户端请求的动作,通常为GET或POST。

remote_addr        #客户端的IP地址。

remote_port        #客户端的端口。

remote_user        #已经经过Auth Basic Module验证的用户名。

request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。

request_method     #GET或POST

request_filename   #当前请求的文件路径,由root或alias指令与URI请求生成。

request_uri        #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。

scheme             #HTTP方法(如http,https)。

server_protocol    #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

server_addr        #服务器地址,在完成一次系统调用后可以确定这个值。

server_name        #服务器名称。

server_port        #请求到达服务器的端口号

文件路径

root和alias
alias后跟的指定目录是准确的,并且末尾必须加“/”,否则找不到文件
root后跟的指定目录是上级目录,并且该上级目录下要含有和location后指定名称的同名目录才行,末尾“/”加不加无所谓。

一般情况下,在location /中配置root,在location /other中配置alias是一个好习惯


上一篇 Spring-RedisTemplate

下一篇 Spring-Test

阅读
2,696
阅读预计10分钟
创建日期 2018-10-10
修改日期 2018-11-05
类别
标签
百度推荐