Nginx学习.md

Posted ProfiBus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx学习.md相关的知识,希望对你有一定的参考价值。

正常运行的必备配置

user

Syntax: user user [group];
Default: user nobody nobody;
Context: main

指定运行worker进程的用户 和组。

pid

Syntax: pid file;
Default: pid nginx.pid;
Context: main

指定nginx的pid文件;

worker_rlimit_nofile

Syntax: worker_rlimit_nofile number;
Default: —
Context: main

指定一个worker进程所能够打开的最大文件句柄数;

worker_rlimit_sigpending

指定每个用户能够发往worker的信号的数量;

优化性能相关的配置

worker_processes

Syntax: worker_processes number | auto;
Default: worker_processes 1;
Context: main

worker线程的个数;通常应该为物理CPU核心个数减1;如果设置成auto则nginx的版本是1.10以上。

worker_cpu_affinity

Syntax: worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
Default: —
Context: main

绑定worker进程至指定的CPU上运行;例如四核CPU则是:0001、0010、0100、1000。几核CPU就有几个状态位,如果想要在指定的CPU核心运行则在其置位为1,注意cpumask上不能同时出现两个1。

举例

worker_processes 2;
worker_cpu_affinity 0100 1000;
# nginx -s reload
#  ps axo command,pid,psr |grep nginx |grep -v grep
nginx: master process nginx  4533   1
nginx: worker process        4638   2
nginx: worker process        4639   3

timer_resolution

Syntax: timer_resolution interval;
Default: —
Context: main

该配置指令允许用户减少调用gettimeofday()的次数。默认情况下,该函数在每次I/O端口监听(比如epoll_wait)返回后都将被调用,而通过timer_resolution配置选项可以直接指定调用gettimeofday()函数的间隔时间。

worker_priority

Syntax: worker_processes number | auto;
Default: worker_processes 1;
Context: main

定义worker进程的调度优先级,就像由nice命令完成的:负数意味着更高的优先级。 允许范围通常在-20到19之间变化。

举例

user nginx;
worker_processes 2;
worker_cpu_affinity 0100 1000;
worker_priority -5;
# nginx -s reload
# ps axo command,pid,psr,nice |grep nginx |grep -v grep
nginx: master process nginx  4533   1   0
nginx: worker process        4779   2  -5
nginx: worker process        4780   3  -5

事件相关的配置

accept_mutex

Syntax: accept_mutex on | off;
Default: accept_mutex off;
Context: events

各worker接收用户的请求的负载均衡锁;启用时,表示用于让多个worker轮流地、序列化地响应新请求; 否则,将向所有worker进程通知有关新连接的信息,如果新连接数量较少,则某些worker进程可能只会浪费系统资源。
在版本1.11.3之前,默认值为on。

lock_file

Syntax: lock_file file;
Default: lock_file logs/nginx.lock;
Context: main

nginx使用锁定机制来实现accept_mutex和序列化对共享内存的访问。 在大多数系统上,锁是使用原子操作实现的,并且此伪指令被忽略。

accept_mutex_delay

Syntax: accept_mutex_delay time;
Default: accept_mutex_delay 500ms;
Context: events

如果启用accept_mutex,则指定如果另一个worker进程当前正在接受新连接,worker进程将尝试重新启动接受新连接的最长时间。

use

Syntax: use method;
Default: —
Context: events

定义使用的事件模型;建议让Nginx自动选择;

worker_connections

Syntax: worker_connections number;
Default: worker_connections 512;
Context: events

每个worker进程所能够响应的最大并发请求数量;应该记住,这个数字包括所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接。 另一个考虑是同时连接的实际数量不能超过打开文件的最大数量的当前限制,可以通过worker_rlimit_nofile更改。
在nginx中设置的最大连接数为:
worker_proceses * worker_connections

用于调试、定位问题

daemon

Syntax: daemon on | off;
Default: daemon on;
Context: main

确定nginx是否应该成为守护进程。 主要用于开发过程中。

master_process

Syntax: master_process on | off;
Default: master_process on;
Context: main

是否以master/worker模型运行nginx;

error_log

Syntax: error_log file [level];
Default: error_log logs/error.log error;
Context: main, http, mail, stream, server, location

错误日志文件及其级别;出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效;

虚拟主机相关的配置

server

Syntax: server { ... }
Default: —
Context: http

设置虚拟服务器的配置。

listen

Syntax: listen address[:port] [default_server] [ssl] [http2 | spdy]
listen port [default_server] [ssl] [http2 | spdy]
Default: listen *:80 | *:8000;
Context: server

设置IP的地址和端口,或者服务器将接受请求的UNIX域套接字的路径。 可以指定地址和端口,或仅指定地址或仅指定端口。
default_server:设置默认虚拟主机;用于基于IP地址,或使用了任意不能对应于任何一个server的name时所返回站点;
ssl:用于限制只能通过ssl连接提供服务;

例如

listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;

server_name

Syntax: server_name name ...;
Default: server_name "";
Context: server

设置虚拟服务器的名称。后可跟一个或多个主机名;名称还可以使用通配符和正则表达式(~);
(1) 首先做精确匹配;例如:www.example.com
(2) 左侧通配符;例如:*.example.com
(3) 右侧通配符,例如:www.example.*
(4) 正则表达式,例如:~^.*\\.example\\.com$
(5) default_server

location

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location

允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理;简言之,即用于为需要用到专用配置的uri提供特定配置;

  • =:URI的精确匹配;
  • ~:做正则表达式匹配,区分字符大小写;
  • ~*:做正则表达式匹配,不区分字符大小写;
  • ^~:URI的左半部分匹配,不区分字符大小写;

匹配优先级:精确匹配=、^~、~或~*、不带符号的URL;

举例

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \\.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

“/”请求将匹配配置A,“/index.html”请求将匹配配置B,“/documents/document.html”请求将匹配配置C,“/images/1.gif”请求将匹配配置D,并且“/documents/1.jpg”请求将匹配配置E.

root

Syntax: root path;
Default: root html;
Context: http, server, location, if in location

设置请求的根目录。路径值可以包含变量,$document_root和$ realpath_root除外。
只有通过向root指令的值添加一个URI,即可构建文件的路径。 如果必须修改URI,则应使用alias伪指令。
举例

# tree /data/website/
/data/website/
|-- index.html
`-- test
    `-- index.html

nginx.conf:
location /test {
  root /data/website/;
}

# curl http://www.a.com/test/
/data/website/

alias

Syntax: alias path;
Default: —
Context: location

定义指定位置的替换。路径值可以包含变量,$document_root和$ realpath_root除外。如果在使用正则表达式定义的位置内使用别名,则此类正则表达式应包含捕获,并且别名应引用这些捕获。
举例

location /test {
  root /data/website;
}

# curl http://www.a.com/test/
/data/website/test/

注意:
root指令:给定的路径对应于location的“/”这个URL;
/test/index.html --> /data/website/test/index.html
alias指令:给定的路径对应于location的“/uri/"这个URL;
/test/index.html --> /data/website/index.html

error_page

Syntax: error_page code ... [=[response]] uri;
Default: —
Context: http, server, location, if in location

根据http状态码重定向错误页面。
举例

nginx.conf:
location / {
  root /data/website;
}
error_page  404              /404.html
# echo 404.page >/data/website/404.html
# curl http://www.a.com/aaaaa
404.page
# curl http://www.a.com/aaaaa -I
HTTP/1.1 404 Not Found
Server: nginx/1.10.1
Date: Sat, 11 Feb 2017 16:39:24 GMT
Content-Type: text/html
Content-Length: 9
Connection: keep-alive
ETag: "589f3e1d-9"

自定义状态码:

error_page  404 =201             /404.html;
# curl http://www.a.com/aaaaa -I
HTTP/1.1 201 Created
Server: nginx/1.10.1
Date: Sat, 11 Feb 2017 16:43:11 GMT
Content-Type: text/html
Content-Length: 9
Connection: keep-alive
ETag: "589f3e1d-9"
# curl http://www.a.com/aaaaa 
404.page

try_files

Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location

尝试查找第1至第N-1个文件,第一个即为返回给请求者的资源;若1至N-1文件都不存在,则跳转至最一个uri(必须不能匹配至当前location,而应该匹配至其它location,否则会导致死循环);
举例

nginx.conf:
  root /data/website;
       location /test {
  try_files /test/1.html /test/2.html /test/3.html @abc;
}
     location @abc {
      rewrite ^/(.*)$ http://baidu.com;
}
# ls /data/website/test/
3.html
# curl http://www.a.com/test/1.html
33333

网络连接相关的配置

keepalive_timeout

Syntax: keepalive_timeout timeout [header_timeout];
Default: keepalive_timeout 75s;
Context: http, server, location

第一个参数设定keepalive连接的超时时长;0表示禁止长连接;默认为75s;可选的第二个参数在“Keep-Alive:timeout = time”响应报文header字段中设置一个值。 两个参数可能不同。“Keep-Alive:timeout = time”头字段由Mozilla和Konqueror识别。 MSIE在大约60秒内关闭保持连接。

keepalive_requests

Syntax: keepalive_requests number;
Default: keepalive_requests 100;
Context: http, server, location
This directive appeared in version 0.8.0.

在keepalived连接上所允许请求的最大资源数量;默认为100;在发出最大数量的请求后,将关闭连接。

keepalive_disable

Syntax: keepalive_disable none | browser ...;
Default: keepalive_disable msie6;
Context: http, server, location

指明禁止为何种浏览器使用keepalive功能; 浏览器参数指定将影响哪些浏览器。设置成msie6则在收到POST请求时禁用与旧版本的MSIE的保持活动连接。设置成safari则禁用与Mac OS X和Mac OS X类操作系统上的Safari浏览器的保持连接。设置成none则启用与所有浏览器的保持活动连接。

tcp_nodelay

Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location

对keepalive模式下的连接是否使用TCP_NODELAY选项;

tcp_nopush

Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location

是否启用TCP_NOPUSH(FREEBSE)或TCP_CORK(Linux)选项;仅在sendfile为on时有用;

client_body_timeout

Syntax: client_body_timeout time;
Default: client_body_timeout 60s;
Context: http, server, location

定义读取客户端请求报文body的超时时间。 超时时间仅设置在两个连续读取操作之间的时间段,而不是用于传输整个请求体。 如果客户端在此时间内未发送任何内容,则会将408(请求超时)错误返回给客户端。

send_timeout

Syntax: send_timeout time;
Default: send_timeout 60s;
Context: http, server, location

发送响应报文的超时时长,默认为60s; 超时仅在两个连续的写操作之间设置,而不是用于传输整个响应。 如果客户端在此时间内未收到任何内容,则连接将关闭。

对客户端请求进行限制

limit_except

Syntax: limit_except method ... { ... }
Default: —
Context: location

对指定范围之外的其它的方法进行访问控制; 方法参数可以是以下之一:GET,HEAD,POST,PUT,DELETE,MKCOL,COPY,MOVE,OPTIONS,PROPFIND,PROPPATCH,LOCK,UNLOCK或PATCH。 允许GET方法也允许HEAD方法。 可以使用ngx_http_access_module和ngx_http_auth_basic_module模块伪指令限制对其他方法的访问。
举例

nginx.conf:
location /download {
limit_except GET {
  allow 192.168.0.220;
  deny all;
}
}
192.168.0.220:
# curl -X GET -I http://www.a.com/download/test.img
HTTP/1.1 200 OK
Server: nginx/1.10.1
Date: Sun, 12 Feb 2017 11:09:21 GMT
Content-Type: application/octet-stream
Content-Length: 209715200
Last-Modified: Sat, 11 Feb 2017 17:17:06 GMT
Connection: keep-alive
ETag: "589f4712-c800000"
Accept-Ranges: bytes
# curl -X PUT -I http://www.a.com/download/test.img
HTTP/1.1 405 Not Allowed
Server: nginx/1.10.1
Date: Sun, 12 Feb 2017 11:09:11 GMT
Content-Type: text/html
Content-Length: 173
Connection: keep-alive
192.168.0.201:
# curl -X GET -I http://www.a.com/download/test.img 
HTTP/1.1 200 OK
Server: nginx/1.10.1
Date: Sun, 12 Feb 2017 11:10:22 GMT
Content-Type: application/octet-stream
Content-Length: 209715200
Last-Modified: Sat, 11 Feb 2017 17:17:06 GMT
Connection: keep-alive
ETag: "589f4712-c800000"
Accept-Ranges: bytes
# curl -X PUT -I http://www.a.com/download/test.img 
HTTP/1.1 403 Forbidden
Server: nginx/1.10.1
Date: Sun, 12 Feb 2017 11:10:16 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive

limit_rate

Syntax: limit_rate rate;
Default: limit_rate 0;
Context: http, server, location, if in location

限制客户端每秒钟所能够传输的字节数,默认为0表示无限制; 速率以字节/秒指定。这是对每个请求设置限制,因此如果客户端同时打开两个连接,则总速率将是指定限制的两倍。
在根据一定条件限制费率的情况下,速率限制也可以在$ limit_rate变量中设置。
速率限制也可以在代理服务器响应的“X-Accel-Limit-Rate”报头字段中设置。 此功能可以使用proxy_ignore_headers,fastcgi_ignore_headers,uwsgi_ignore_headers和scgi_ignore_headers指令禁用。
举例

nginx.conf:
location /download {
limit_rate 20480;
}
download ]# dd if=/dev/zero of=./test.img  bs=200M count=1
# wget http://www.a.com/download/test.img
--2017-02-12 01:19:55--  http://www.a.com/download/test.img
正在解析主机 www.a.com (www.a.com)... 192.168.0.220
正在连接 www.a.com (www.a.com)|192.168.0.220|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:209715200 (200M) [application/octet-stream]
正在保存至: “test.img”

 0% [                                                                                                                                                    ] 245,760     20.0KB/s 剩余 2h 50m

对内存或磁盘资源进行分配

client_body_in_file_only

Syntax: client_body_in_file_only on | clean | off;
Default: client_body_in_file_only off;
Context: http, server, location

确定nginx是否应将整个客户端请求正文保存到文件中。
当设置为on时,临时文件不会在请求处理后删除。
值为clean将导致删除请求处理后剩余的临时文件。
值为off不允许暂存。

client_body_in_single_buffer

Syntax: client_body_in_single_buffer on | off;
Default: client_body_in_single_buffer off;
Context: http, server, location

确定nginx是否应将整个客户端请求正文保存在单个缓冲区中。

client_body_buffer_size

Syntax: client_body_buffer_size size;
Default: client_body_buffer_size 8k|16k;
Context: http, server, location

设置用于读取客户机请求报文body的缓冲区大小。 在请求主体大于缓冲区的情况下,整个主体或仅其部分被写入临时文件。 默认情况下,缓冲区大小等于两个内存页。 这在x86,其他32位平台和x86-64上是8K。 在其他64位平台上通常为16K。

client_body_temp_path

Syntax: client_body_temp_path path [level1 [level2 [level3]]];
Default: client_body_temp_path client_body_temp;
Context: http, server, location

定义用于存储保存客户端请求正文的临时文件的目录。 在指定的目录下最多可以使用三级子目录层次结构。

client_header_buffer_size

Syntax: client_header_buffer_size size;
Default: client_header_buffer_size 1k;
Context: http, server

设置读取客户端请求报文header的缓冲区大小。 对于大多数请求,1K字节的缓冲区就足够了。 但是,如果请求包括长Cookie,或来自WAP客户端,它可能不适合1K。 如果请求行或请求头字段不适合该缓冲区,则分配由large_client_header_buffers指令配置的较大缓冲区。

MIME类型相关的配置

types

Syntax: types { ... }
Default: types {
text/html html;
image/gif gif;
image/jpeg jpg;
}
Context: http, server, location

将文件扩展名映射到MIME类型的响应。 扩展名不区分大小写。几个扩展可以映射到一个类型,例如:

types {
    application/octet-stream bin exe dll;
    application/octet-stream deb;
    application/octet-stream dmg;
}

在conf / mime.types文件中,nginx分发了一个足够完整的映射表。
要使特定位置发出所有请求的“application/octet-stream”MIME类型,可以使用以下配置:

location /download/ {
    types        { }
    default_type application/octet-stream;
}

default_type

Syntax: default_type mime-type;
Default: default_type text/plain;
Context: http, server, location

定义响应的默认MIME类型。 可以使用types伪指令来将文件扩展名映射到MIME类型。

文件操作优化相关的配置

sendfile

Syntax: sendfile on | off;
Default: sendfile off;
Context: http, server, location, if in location

启用或禁用sendfile()的使用。
从nginx 0.8.12和FreeBSD 5.2.1开始,aio可以用来为sendfile()预加载数据。
在此配置中,使用SF_NODISKIO标志调用sendfile(),这导致它不会在磁盘I / O上阻塞,而是报告数据不在内存中。 然后,nginx通过读取一个字节来启动异步数据加载。 在第一次读取时,FreeBSD内核将一个文件的前128个字节加载到内存中,虽然下一次读取将只加载16K块的数据。 这可以使用read_ahead指令更改。
Notes:在1.7.11之前,可以使用aio sendfile启用预加载。

aio

Syntax: aio on | off | threads[=pool];
Default: aio off;
Context: http, server, location
This directive appeared in v

以上是关于Nginx学习.md的主要内容,如果未能解决你的问题,请参考以下文章

linux学习:Nginx--常见功能配置片段与优化-06

Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段

nginx.conf 忽略了 nginx-ingress 配置映射片段

nginx安装upload和MD5,echo模块

将 nginx rtmp 片段发送到 WebRTC

IOS开发-OC学习-常用功能代码片段整理