scaoping 发表于 2018-11-10 09:10:17

nginx 配置参数

  系统内核参数配置
  net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1800
  net.ipv4.ip_conntrack_max = 16777216 # 如果使用默认参数,容易出现网络丢包
  net.ipv4.netfilter.ip_conntrack_max = 16777216# 如果使用默认参数,容易出现网络丢包
  net.ipv4.tcp_max_syn_backlog = 65536
  net.core.netdev_max_backlog = 32768
  net.core.somaxconn = 32768
  net.core.wmem_default = 8388608
  net.core.rmem_default = 8388608
  net.core.rmem_max = 16777216
  net.core.wmem_max = 16777216
  net.ipv4.tcp_timestamps = 0
  net.ipv4.tcp_synack_retries = 2
  net.ipv4.tcp_syn_retries =
  net.ipv4.tcp_tw_recycle = 1
  net.ipv4.tcp_tw_reuse = 1
  net.ipv4.tcp_mem = 94500000 915000000 927000000
  net.ipv4.tcp_max_orphans = 3276800
  net.ipv4.ip_local_port_range = 1024 65535
  location的配置选项及说明
  语法规则: location [=|~|~*|^~] /uri/ { … }
  = 表示精确匹配,这个优先级也是最高的
  ^~ 表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
  ~ 表示区分大小写的正则匹配
  ~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写)
  !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则
  / 通用匹配,任何请求都会匹配到,默认匹配.
  下面讲讲这些语法的一些规则和优先级
  多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
  优先级=>^~>
  首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。 例子,有如下匹配规则:
  root&alias文件路径配置
  root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
   语法:root path
  默认值:root html
  配置段:http、server、location、if
   语法:alias path
  配置段:location
  location ~ ^/weblogs/ {
  root /path/to/weblogs/site.com;
  autoindex on;
  auth_basic "Restricted";
  auth_basic_user_file passwd/weblogs;
  }
  root会根据完整的URI来映射,就是/path/uri
  location ^~ /binapp/ {
  limit_conn limit 4;
  limit_rate 200k;
  internal;
  alias /path/to/site/statics/bin/apps/;
  }
  alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
  1. 使用alias时,目录名后面一定要加”/”。
  2. alias可以指定任何名称。
  3. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
  4. alias只能位于location块中
  ngx_http_core_module模块的变量
  $arg_PARAMETER   HTTP请求中某个参数的值,如/index.php?site=www.domain.com,可以用$arg_site取得www.domain.com 这个值。
  $args HTTP 请求中的完整参数。例如,在请求/index.php?width=400&height=200 中,$args表示字符串width=400&height=200.
  $binary_remote_addr 二进制格式的客户端地址。例如:\x0A\xE0B\x0E
  $body_bytes_sent 表示在向客户端发送的http响应中,包体部分的字节数
  $content_length 表示客户端请求头部中的Content-Length 字段
  $content_type 表示客户端请求头部中的Content-Type 字段
  $cookie_COOKIE 表示在客户端请求头部中的cookie 字段
  $document_root 表示当前请求所使用的root 配置项的值
  $uri 表示当前请求的URI,不带任何参数
  $document_uri 与$uri 含义相同
  $request_uri 表示客户端发来的原始请求URI,带完整的参数。$uri和$document_uri未必是用户的原始请求,在内部重定向后可能是重定向后的URI,而$request_uri 永远不会改变,始终是客户端的原始URI.
  $host 表示客户端请求头部中的Host字段。如果Host字段不存在,则以实际处理的server(虚拟主机)名称代替。如果Host字段中带有端口,如IP:PORT,那么$host是去掉端口的,它的值为IP。$host 是全小写的。这些特性与http_HEADER中的http_host不同,http_host只取出Host头部对应的值。
  $hostname 表示 Nginx所在机器的名称,与 gethostbyname调用返回的值相同
  $http_HEADER 表示当前 HTTP请求中相应头部的值。HEADER名称全小写。例如,示请求中 Host头部对应的值 用 $http_host表
  $sent_http_HEADER 表示返回客户端的 HTTP响应中相应头部的值。HEADER名称全小写。例如,用 $sent_ http_content_type表示响应中 Content-Type头部对应的值
  $is_args 表示请求中的 URI是否带参数,如果带参数,$is_args值为 ?,如果不带参数,则是空字符串
  $limit_rate 表示当前连接的限速是多少,0表示无限速
  $nginx_version 表示当前 Nginx的版本号
  $query_string 请求 URI中的参数,与 $args相同,然而 $query_string是只读的不会改变
  $remote_addr 表示客户端的地址
  $remote_port 表示客户端连接使用的端口
  $remote_user 表示使用 Auth Basic Module时定义的用户名
  $request_filename 表示用户请求中的 URI经过 root或 alias转换后的文件路径
  $request_body 表示 HTTP请求中的包体,该参数只在 proxy_pass或 fastcgi_pass中有意义
  $request_body_file 表示 HTTP请求中的包体存储的临时文件名
  $request_completion 当请求已经全部完成时,其值为 “ok”。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range访问的并不是文件的最后一块,那么其值也是空字符串。
  $request_method 表示 HTTP请求的方法名,如 GET、PUT、POST等
  $scheme 表示 HTTP scheme,如在请求 https://nginx.com/中表示 https
  $server_addr 表示服务器地址
  $server_name 表示服务器名称
  $server_port 表示服务器端口
  $server_protocol 表示服务器向客户端发送响应的协议,如 HTTP/1.1或 HTTP/1.0
  日志配置
  如access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。
  1. access_log指令
  语法: access_log path ]];
  access_log path format gzip[=level] ;
  access_log syslog:server=address[,parameter=value] ;
  access_log off;
  默认值: access_log logs/access.log combined;
  配置段: http, server, location, if in location, limit_except
  gzip压缩等级。
  buffer设置内存缓存区大小。
  flush保存在缓存区中的最长时间。
  不记录日志:access_log off;
  使用默认combined格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;
  2. log_format指令
  语法: log_format name string …;
  默认值: log_format combined “…”;
  配置段: http
  name表示格式名称,string表示等义的格式。log_format有一个默认的无需设置的combined日志格式,相当于apache的combined日志格式,
  log_formatcombined'$remote_addr - $remote_user[$time_local]'
  ' "$request"$status$body_bytes_sent'
  ' "$http_referer""$http_user_agent" ';
  nginx作为负载均衡,squid,nginx反向代理后,$remote_addr获取反向代理的IP地址。反向代理服务器中在转发请求的http头信息中,增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。
  log_formatporxy'$http_x_forwarded_for - $remote_user[$time_local]'
  ' "$request"$status $body_bytes_sent '
  ' "$http_referer""$http_user_agent" ';
  $remote_addr, $http_x_forwarded_for 记录客户端IP地址
  $remote_user 记录客户端用户名称
  $request 记录请求的URL和HTTP协议
  $status 记录请求状态
  $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
  $bytes_sent 发送给客户端的总字节数。
  $connection 连接的序列号。
  $connection_requests 当前通过一个连接获得的请求数量。
  $msec 日志写入时间。单位为秒,精度是毫秒。
  $pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
  $http_referer 记录从哪个页面链接访问过来的
  $http_user_agent 记录客户端浏览器相关信息
  $request_length 请求的长度(包括请求行,请求头和请求正文)。
  $request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
  $time_iso8601 ISO8601标准格式下的本地时间。
  $time_local 通用日志格式下的本地时间。
  3. open_log_file_cache指令
  语法: open_log_file_cache max=N ;
  open_log_file_cache off;
  默认值: open_log_file_cache off;
  配置段: http, server, location
  对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off),格式如下:
  参数注释如下:
  max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。
  inactive:设置存活时间,默认是10s
  min_uses:设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次
  valid:设置检查频率,默认60s
  off:禁用缓存
  4. log_not_found指令
  语法: log_not_found on | off;
  默认值: log_not_found on;
  配置段: http, server, location
  是否在error_log中记录不存在的错误。默认是。
  5. log_subrequest指令
  语法: log_subrequest on | off;
  默认值: log_subrequest off;
  配置段: http, server, location
  是否在access_log中记录子请求的访问日志。默认不记录。
  6. rewrite_log指令
  由ngx_http_rewrite_module模块提供的。用来记录重写日志的。对于调试重写规则建议开启。 Nginx重写规则指南
  语法: rewrite_log on | off;
  默认值: rewrite_log off;
  配置段: http, server, location, if
  启用时将在error log中记录notice级别的重写日志。
  7. error_log指令
  语法: error_log file | stderr | syslog:server=address[,parameter=value] ;
  默认值: error_log logs/error.log error;
  配置段: main, http, server, location
  配置错误日志。
  nginx的rewrite模块
  重写规则就是正则匹配,依赖于PCRE库
  nginx的重写模块是一个简单的正则表达式匹配与一个虚拟堆叠机结合。
  指令
  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
  nginx隐藏版本号
  nginx.conf中修改http zone中的变量值: server_tokens off;
  php-fpm fastcgi.conf中的变量值: fastcgi_param SERVER_SOFTWARE nginx;
  nginx正向代理
  server {
  listen 8090;
  location / {
  resolver 218.85.157.99 218.85.152.99;
  resolver_timeout 30s;
  proxy_pass http://$host$request_uri;
  }
  access_log/data/httplogs/proxy-$host-aceess.log;
  }
  resolver指令
  语法: resolver address ... ;
  默认值: —
  配置段: http, server, location
  配置DNS服务器IP地址。可以指定多个,以轮询方式请求。
  nginx会缓存解析的结果。默认情况下,缓存时间是名字解析响应中的TTL字段的值,可以通过valid参数更改。
  resolver_timeout指令
  语法: resolver_timeout time;
  默认值: resolver_timeout 30s;
  配置段: http, server, location
  解析超时时间。
  haproxy、 nginx、 varnish的CDN调度
  nginx的TCP代理
  nginx的反向代理
  nginx+keepalived+proxy_cache高可用nginx集群和高速缓存
  nginx优化

页: [1]
查看完整版本: nginx 配置参数