当前位置: > Linux服务器 > nginx >

nginx参数说明

时间:2016-12-22 15:21来源:linux.it.net.cn 作者:IT


一、nginx的核心配置:

>>> 正常运行的必备配置:
1. user username [groupname]; #指定运行worker子进程的用户或组

2. pid /path/to/pidfile_name; #指定nginx的pid文件

3. worker_rlimit_nofile number; #worker进程能打开的文件描述符个数

4. worker_rlimit_sigpending number; #设定每个用户能够发往worker进程的信号的数量(设定信号队列的大小);

>>> 优化性能相关的配置:
1. worker_processes number; #work进程的个数;通常其数值应该比CPU数量小
#woker_processes 1;

2. worker_cpu_affinity cpumask(CPU掩码)...; #worker进程的CPU的倾向性,绑定worker进程到某个CPU上
#例子:
#worker_processes 2; #两个worker进程
#worker_cpu_affinity 0000(代表有4个CPU) 0001(第一个进程绑定第一个CPU上) 0010(第二个进程绑定到第二个CPU上)

3. ssl_engine device; #在存在ssl加速设备的服务器上,指定所使用的ssl硬件加速设备;
#由于SSL比较消耗资源:加密、解密

4. timer_resolution interval; #多长时间获取一次系统时间并更新nginx的缓存时钟
#每次内核事件调用返回时,都会使用gettimeofday()来获取系统时间更新nginx的缓存时钟;不过在X86架构的服务器上,可忽略该项
#timer_resolution 100ms; 100毫秒

5.worker_priority nice; #worker进程的优先级
nice为:-20,19之间的值

>>> 事件相关的配置
1. accept_mutex on|off; #是否打开nginx的负载均衡锁;默认是开启的
#为了实现多个worker响应均衡,打开锁后,就可以实现worker进程的负载均衡(谁拥有锁谁就接收用户的请求)
#但是,当打开worker的负载均衡锁后,会增加系统的开销(对请求进行调度)
#而通常当一个worker进程的负载达到其上限的7/8时,master就尽可能不在将请求调度至此worker;

2. lock_file /path/to/lock_file; #负载均衡的锁文件

3. accept_mutex_delay interval;
#accept锁模式中,一个worker进程为取得accept锁如果失败了,需要等待此选项定义的时长后才能继续获取锁;
#accept_mutex_delay 100ms;

4. multi_accept on|off; #是否允许worker一次性接受多个请求;
#默认为off的

5. use [epoll|rtsig|select|poll]; #指定使用哪种事件模型
#建议让nginx自行选择

6. worker_connections number; #每个worker能够并发响应的最大请求数
#Web服务器上这个值最好比worker_rlimit_nofile多一些
#代理服务器上这个值最好是worker_rlimit_nofile的50%


>>> 用于调试、定位问题:只调试nginx时使用
1. daemon on|off; #是否让nginx运行于后台;默认为on,调试时应该为off
#在后台时,不输出信息到控制台

2. master_process on|off; #是否让一个master管理多个worker进程运行;默认为off
#调试时可以启用该项,只启用master进程,方便追踪

3. error_log /path/to/error_log level; #定义错误日志输出及日志级别
#调试时可以使用debug级别,但要求在编译时必须使用--with-debug启用debug功能;
#默认为error级别

二、nginx的http配置格式:
1. nginx的http功能使用http {}段配置:
http {

}

2. nginx必须使用虚拟主机来配置Web站点!每个虚拟主机使用一个server {}段配置:
server { 

}

3. server {}需要定义在http {}之内:
http{
server {

}
}

4. Web服务器的公共配置,需要定义在server {}之外,http {}之内

三、nginx的http的配置参数

1. listen [addres:port]; #监听指定地址的端口
port; #监听的端口
default_server; #定义此server为httpd中默认的server,如果所有的server都没有定义default_server,则第一个为默认server;比如访问一个不存在的虚拟主机,默认响应的主机!
rcvuf=SIZE; #接收缓冲大小;
sndbuf=SIZE; #发送缓冲大小
ssl:https server; #https的地址

2. server_name localhost localhost2; #主机名,可以多个主机名
#当nginx收到一个请求时,会取出其首部的server的值,而后跟众server进行比较:
#(1) 先做精确匹配:www.meng.com
#(2) 左侧通配符匹配:*.meng.com
#(3) 右侧通配符匹配:www.*
#(4) 正则表达式匹配:以波浪线开头(~^\*\.meng\.com$)

3.server_name_hash_bucket_size 32|64|128; #hash表的大小
#为了实现快速主机查找,nginx使用hash表来保存主机名; 

5.location [ = | ~ | ~* | ^~ ] URI {
#根据用户的URI匹配location中的表达式,匹配到后做一些操作
#仅能在server {}或其他location中定义

=:精确匹配;区分大小写
~:正则表达式匹配,区分字符大小写
~*:正则表达式匹配,忽略字符大小写
^~:只需要前半部分与URI匹配即可,不检查正则表达式
没有符号时,仅以起始路径匹配

匹配优先级:
(1) 字符精确匹配
(2) 正则表达式检索(有多个,由第一个匹配到处理)
(3) 字符串比较
}; 


6.Location的常用参数:
(1) root /html; #网页根目录
#可以放在http {},server {},location {}中
Location的根目录是以root的设定路径为开始的,例如:
Location ^~ /images/ {
root /html;
index index.html;
}
#实际访问的地址是:http://localhost/images/index.html;但是index.html是在/html目录下的images目录里;

(2) alias /html; #指定路径别名
将Location映射到alias上,例如:
Location ^~ /images/ {
alias /html;
}
#实际访问的地址是:http://localhost/images/File,但是文件所在的路径在/html中;


(3) index index.html idnex.html2; #网站首页文件,

(4) error_page code ... [=[code]] uri; #配置错误页面重定向
#当对于某个请求返回错误时,如果匹配上了error_page指令中的设定的code,则重定向到新的URI中。

(5) try_files /path [/path2 ...] uri; #多路径配置
#尝试匹配每一个PATH中的文件(从左到右),在第一次找到返回结果,如果都没有,则重定向到URI中(URI一定得存在);



四、网络连接相关的设置:
1. keepalive_timeout time; #保持连接的超时时间
#默认是75秒;

2. keepalive_requests number; #保持连接上允许承载的最大请求数

3. keepalive_disable [msie6 | safari | none]; #对指定的浏览器禁止使用长连接

4. tcp_nodelay on|off; #对keepalive连接是否使用TCP_NODELAY选项;
#多个确认报文合并传过去,确认延迟(提高TCP性能)
#默认为on,不启动此选项

5. client_header_timeout time; #读取http请求首部的超时时长

6. client_body_timeout time; #读取http请求实体的超时时长

7. send_timeout time; #发送响应的超时时长

五、对客户端请求的限制:
1. limit_except method ... { #指定客户端不能使用的方法;

}

2. client_max_body_size SIZE; #http请求包体的最大值;
#用于限制用户上传文件的大小;
#如果基于程序控制用户上传文件的大小(比如1g),当用户上传一个2g的文件时,只有已经传输完的包体超过1g才会通知用户文件过大,导致用户之前的操作全部白了;而基于此方法,可以直接读取请求头部的包体大小,如果过大,直接拒绝;避免做无用功;



3. limit_rate spped; #速率限制
限制客户端每秒传输的字节数;默认为0,表示没有限制。

4. limit_rate_after time; #响应不限速的时长
nginx向客户端发送响应报文时,如果时长超出了此处指定的时长,则后续的发送过程开始限速;

六、文件操作的优化:
1. sendfile on|off; #是否启用sendfile功能

2. aio on|off; #是否启用aio功能

3. open_file_cache max=N [inactive=time]|off; #是否打开文件缓存功能
max:缓存条目的最大值;当满了以后根据LRU算法进行置换;
inactive timeout:如果一个缓存条目在指定时间内没有被访问过,将自动被删除;默认为60秒

缓存的信息包括:
文件句柄(文件描述符)、文件大小和上次修改时间;
已经打开的目录结构;
没有找到或无权操作的信息;

4. open_file_cache_errors on|off; #是否缓存"文件没有找到或无权操作"的信息

5. open_file_cache_valid time; #多长时间检查一次缓存中的条目是否超出inactive时长
#默认为60秒

6. open_file_cache_min_use number; #inactive时长内的访问次数超过该参数定义的值,无论inactive是否超时,都不删除;

七、对客户端请求的特殊处理:
1. ignore_invalid_headers on|off; #是否忽略不合法的http首部
#如果为off,当请求首部中出现不合法的http首部时,拒绝响应

2. log_not_found on|off; #当用户访问的文件不存在时,是否将该信息记录到错误日志中

3. resolver address; #指定nginx使用的dns服务器地址

4. resover_timeout time; #指定dns解析超时时长,默认为30s;

5. server_tokens on|off; #是否显示nginx的版本号

八、nginx的http核心模块内置变量:
1. $uri:当前请求的URI,不带参数
2. $request_uri:请求的uri,带完整参数
3. $host:http请求报文中的host首部,如果请求中没有host首部,则以处理此请求的虚拟主机的主机名代替
4. $hostname:nginx服务运行在的主机的主机名
5. $remote_addr:客户端IP
6. $remote_port:客户端端口
7. $remote_user:启用用户认证时,客户端输入的用户名
8. $request_filename:用户请求中的uri经过本地root或alias转换后映射的本地文件路径
9. $request_method:请求方法
10. $server_addr:服务器地址
11. $server_name:服务器域名
12. $server_port:服务器端口
13. $server_protocol:服务器向客户端发送响应时的协议,如http/1.1
14. $scheme:在请求中使用scheme,如https://www.magedu.com/中的scheme
15. $http_HEADER:匹配请求报文中指定的HEADER,例如:$http_host匹配请求报文中的host首部
16. $sent_http_HEADER;匹配响应报文中指定的HEADER,例如$http_content_type匹配响应报文中content-type首部
17. $document_root:当前请求映射到的root配置项

九、nginx的基本配置:
1.定义一个虚拟主机:
server {
listen 80;
server_name www.a.com;
root /web/html;
#Location = / {
# root index.html
# index index.html
#}
}

2.定义访问控制:
#默认允许所有主机访问
allow 172.16.
deny all

3.用户认证限制:
auth_basic "提示信息";
auth_basic_user_file /etc/.nginxpasswd;
> htpasswd -c -m /etc/.nginxpasswd jerry

4.索引:
autoindex on|off; #如果没有首页文件是否列出目录中的所有文件
#一般用作下载站

5.限制:
limit requests; #限制同一客户端某时间内的最大请求数
limit conn; #限制客户端并发访问数

6.日志设置:
log_format:定义日志访问格式

7.防盗链的方法:
(1)valid_referers none | blocked | server_names | string ...; #定义合法的引用
none:通过浏览器直接访问
blocked:referers的首部被清除
server_names:来源的服务器名称(应该允许自己网站域名访问)

(2)$invalid_referer: #定义不合法的引用
Location可以使用if指令:
if ($invalid_referer) {
rewrite ^/ http://www.baidu.com break;
}

(1)正则表达式匹配:
~:与指定正则表达式模式匹配时返回"真",判断匹配与否时区分字符大小写;
~*:与指定正则表达式模式匹配时返回"真",判断匹配与否时不区分字符大小写;
!~:与指定正则表达式不匹配时返回"真",判断匹配与否时区分字符大小写;
!~*:与指定正则表达式不匹配是返回"真",判断匹配与否时不区分字符大小写;
==:等值比较

(2)文件及目录匹配判断
-f,!-f:判断指定的路径的文件是否存在
-d,!-d:判断指定的路径的目录是否存在
-e,!-e:判断指定的路径资源是否存在,文件和目录均可;
-x,!-x:判断执行的路径的文件是否存爱且可执行;

8.rewrite的URL地址重写:
可用在server {},location {},if
(1)rewrite regex replacment [flag];
regex:正则表达式
replacment:替换值
flag:标识位,避免死循环
last #一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite规则,而通过重写后的规则重新发起请求,如果该请求继续能够被rewrite到,陷入循环
break #一旦被当前规则匹配并重写立即停止检查后续的其他rewrite规则,而后继续其他模块处理(例如直接响应)
redirect #返回302临时重定向
permanent #返回301永久重定向

一旦陷入死循环,nginx最多循环10次,超出之后会返回500错误;
一般将rewrite写在location中时,都是用break标记,或者将rewrite写在if语句中;

(2)rewrite_log on|off; #是否把重写过程记录到错误日志中,默认为off,级别为notice级别;

(3)return code; #用于结束rewrite规则,并且为客户端返回状态码
可以使用的状态码有:204,400,402-400,500-504等;
if (condition) {
}

9.stub_status:
location /server-status {
stub_status on;
access_log off;
allow 172.16.10.1/24;
deny all;
}
active:活跃连接数
server accepts handled requests:服务器读取的连接数,已经处理的连接数,正在处理的请求数
reading:读取的请求个数
writing:正在处理请求或者正在把请求发往客户端
wating:保持连接的状态,等待用户请求

10.压缩功能:
gizp on|off
gizp_buffers 4 16k;申请4个单位为16k的内存作为压缩结果流缓存
gzip_com_level levle;:指定gzip压缩级别,1-9,级别越高,压缩比越大
gzip_disable regex ie6; 禁止在ie6上使用gzip压缩
gzip_min_length length; 最小压缩字节
gzip types text/palin ...; 压缩的文件类型
gizp_http_version 1.1; 压缩后使用什么协议传输
gzip_vary:让缓存服务器缓存gzip压缩过的数据

11. nginx内置变量补充

ngx_http_core_module 模块在处理请求时,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以用于其它
nginx 模块:

参数名称 注释
  1. $arg_PARAMETER HTTP 请求中某个参数的值,如/index.php?site=www.ttlsa.com,可以用$arg_site 取得 www.ttlsa.com 这个值.
  2. $args HTTP 请求中的完整参数。例如,在请求/index.php?width=400&height=200 中,$args 表示字符串 width=400&height=200.
  3. $binary_remote_addr 二进制格式的客户端地址。例如:\x0A\xE0B\x0E
  4. $body_bytes_sent 表示在向客户端发送的 http 响应中,包体部分的字节数
  5. $content_length 表示客户端请求头部中的 Content-Length 字段
  6. $content_type 表示客户端请求头部中的 Content-Type 字段
  7. $cookie_COOKIE 表示在客户端请求头部中的 cookie 字段
  8. $document_root 表示当前请求所使用的 root 配置项的值
  9. $uri 表示当前请求的 URI,不带任何参数
  10. $document_uri 与$uri 含义相同
  11. $request_uri 表示客户端发来的原始请求 URI,带完整的参数。$uri 和$document_uri 未必是用户的原始请求,在内部重定向后可能是重定向后的 URI,而$request_uri 永远不会改变,始终是客户端的原始 URI.
  12. $host 表示客户端请求头部中的 Host 字段。如果 Host 字段不存在,则以实际处理的 server(虚拟主机)名称代替。如果 Host 字段中带有端口,如 IP:PORT,那么$host 是去掉端口的,它的值为 IP。$host是全小写的。                   这些特性与 http_HEADER 中的 http_host 不同,http_host 只取出 Host 头部对应的值。
  13. $hostname 表示 Nginx 所在机器的名称,与 gethostbyname 调用返回的值相同
  14. $http_HEADER 表示当前 HTTP 请求中相应头部的值。HEADER 名称全小写。例如,示请求中 Host 头部对应的值 用 $http_host 表
  15. $sent_http_HEADER 表示返回客户端的 HTTP 响应中相应头部的值。HEADER 名称全小写。例如,用 $sent_http_content_type 表示响应中 Content-Type 头部对应的值
  16. $is_args 表示请求中的 URI 是否带参数,如果带参数,$is_args 值为 ?,如果不带参数,则是空字符串
  17. $limit_rate 表示当前连接的限速是多少,0 表示无限速
  18. $nginx_version 表示当前 Nginx 的版本号
  19. $query_string 请求 URI 中的参数,与 $args 相同,然而 $query_string 是只读的不会改变
  20. $remote_addr 表示客户端的地址
  21. $remote_port 表示客户端连接使用的端口
  22. $remote_user 表示使用 Auth Basic Module 时定义的用户名
  23. $request_filename 表示用户请求中的 URI 经过 root 或 alias 转换后的文件路径
  24. $request_body 表示 HTTP 请求中的包体,该参数只在 proxy_pass 或 fastcgi_pass 中有意义
  25. $request_body_file 表示 HTTP 请求中的包体存储的临时文件名
  26. $request_completion 当请求已经全部完成时,其值为 “ok” 。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range 访问的并不是文件的最后一块,那么其值也是空字符串。
  27. $request_method 表示 HTTP 请求的方法名,如 GET、PUT、POST 等
  28. $scheme 表示 HTTP scheme,如在请求 https://nginx.com/中表示 https
  29. $server_addr 表示服务器地址
  30. $server_name 表示服务器名称
  31. $server_port 表示服务器端口
  32. $server_protocol 表示服务器向客户端发送响应的协议,如 HTTP/1.1 或 HTTP/1.0



(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容