nginx配置

nginx内置变量 nginx文档

概述

main            #全局块
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
events {         #events块
}
http      #http块
{
    ...   #http全局块
    include mime.types ;//表示引人的 mime.types 文件是相对于当前配置文件nginx. conf 
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 192.168.1.3; #允许的ip           
        }  
    }
}
1、全局块:配置影响nginx全局的指令;
2、events块:配置影响nginx服务器或与用户的网络连接。
   有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
   如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。

配置说明

如果你想通过http获取客户的真是ip而不是获取代理服务器的ip地址,那么要做如下的设置。
- proxy_set_header Host $host; 
  #只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口  www.taobao.com:80
- proxy_set_header X-Real-IP $remote_addr;  
  #把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  #在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;
  #代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP

- root /var/www/html
  定义服务器的默认网站根目录位置。如果locationURL匹配的是子目录或文件,root没什么作用,一般放在server指令里面或/下。
- index index.jsp index.html index.htm
  定义路径下默认访问的文件名,一般跟着root放
- proxy_pass http:/backend
  请求转向backend定义的服务器列表,即反向代理,对应upstream负载均衡器。也可以proxy_pass http://ip:port。
- 列出目录 autoindex
  Nginx默认是不允许列出整个目录的。如需此功能,打开nginx.conf文件,在location,server 或 http段中加入autoindex on;,
  另外两个参数最好也加上去,
   autoindex_exact_size off; 默认为on,显示出文件的确切大小,单位是bytes。
      改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
   autoindex_localtime on;
      默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间

常用设置字段

  • accept_mutex on|off

    unix中有个惊群问题(thundering herd problem),指某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但是只有一个进程可以连接; 如果每次唤醒的进程数目太多,会影响系统性能。nginx多进程下也会出现这个问题;此时设置accept_mutex on, 会对多个nginx进程接收连接进行序列化,防止多个进程对连接的争抢;

  • muti_accept on|off

    每个nginx的worker process都有能力同时接收多个新到达的网络连接,默认为off,即一次只能接收一个新到达的连接;

  • use select poll kqueue epoll rtsig /dev/poll eventport 事件驱动模型
  • keepalive_request number

    nigunx和用户端建立会话后,用户端通过此连接发送请求,这个指令用于限制用户通过某一连接向nginx服务器发送请求的次数;

  • listen

    默认是 listen :80|:8000即监听所有80和8000端口; listen 192.168.1.10 #监听具体ip的所有端口 listen 8000 #监听所有ip的8000端口; listen 192.168.1.111 default_server backlog #默认请求处理,最多允许1024网络同时处于挂起状态;

  • root path 配置服务器在指定的根目录查找资源;
  • alias path 更改laotion的uri

    path是修改后的根路径;例如:location ~ ^/data/(.+.(html|htm))${alias /test/pages/$1}
    当location收到/data/index.html请求时,匹配成功,然后根据alias,去/test/pages/查找index.html;

  • index file 设置网站的默认首页

    nginx负载均衡配置

down,表示当前的server暂时不参与负载均衡。

backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

upstream mysvr { 
    server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
    server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1; 
    server 192.168.101.121 backup;       
}

用户和组

Nginx 服务是由一个主进程( master process)和多个 工作进程( worker process)组成 的 。其 中,主进程以 root 权限运行,而 工 作进程在默认情况下以 nobody 用户运行 。原因在 于 nobody 用户是一个不能登录的账号,有一个专用的 ID,可将每个运行的工作进程隔离出 来,这样即使黑客破坏了服务器程序,因其不是 root 用户,也不会影响其他数据 。 因此,为工作进程设置的执行用户权限越低,则服务器安全系数越高

访问控制

Nginx中提供了两个用于配置访问权限控制的指令,分别为 allow 和 deny。 
allow 用于设置允许访问的权限、 deny 用于设置禁止访问的权限。 
在使用时,权限指令后只需跟上允许或禁止的 P,IP 段或 all 即可 。 其中,all 表示所有的 。
需要特别注意以下几个点 :
- 单个 IP 指定作用范围最小, all 指定作用范围最大 。
- 同一块下,若同时存在多个权限指令( deny、allow) ,则先出现的访问权限设置生效,
  并且会对后出现的设置进行破盖,未覆盖的范围依然生效,否则以先出现的设置为准 。
- 当多个块(如 http、server、location)中都出现了权限设置指令,则内层块中的权限级别要比外层块中设置的权限级别高 。

auth_basic on|off 基于密码配置nginx访问权限 auth_basic_user_file file 包含用户信息的文件;

location

location [=|~|~ *|^ ~] URI { ... }   #语法类型 1
location @name (... } #语法类型 2

前缀        说明
 =       根据其后的指定模式进行精准匹配
 ~       使用正则表达式完成 location 的匹配,区分大小写 
 ~*      使用正则表达式完成 location 的匹配,不区分大小写 
 ^~      不使用正则表达式,nginx找到和请求字符串匹配度最高的location后,立即处理,不在使用正则;
 @       用于定义一个location 块,且该块不能被外部客户端所访问,只能被nginx内部配置指令所访问

 因此,当多种类型的 location 匹配同时出现时,最终执行结果为
 “= ”匹配 > “ ^~ ”匹配 > 正则匹配 > 普通的最大前缀匹配 。 
 同级别的只要优先的 location 匹配成功,就不会执行其他的 location。

 浏览器会对url编码,^~也会;所以,如果location收到的url为'/html/%20/img',
 nginx搜到配置为'^~/html//img'的location时匹配成功;

servername指令的使用

server_name name1 name2 ...;
1.name若使用*,只能出现在首尾;
2.使用正则,要用~作为正则开始的标记;

- 基于端口号配置虚拟主机
  listen 8001;

- 基于 IP配置虚拟主机
  listen 80;
  server_name 192.168.78.4; 
- 基于域名配置虚拟主机
   #以*通配符开始的字符.
   server_name  *.test.com; 
   #以*通配符结束的字符串
   server_name  www.*;
   #匹配正则表达式
   server name ~^(?.+)\.domain\.com$ ;
   server_name 指令的几种设置方式,在使用中只要有一项匹配成功,则停止继续匹配其他设置,
   即统一优先级的多次匹配,首次匹配为准。 
   且匹配的优先级顺序依次为,精准匹配> 以通配符开始的字符串> 以通配符结束的字符串> 正则表达式 。

阻止处理不明确主机名的请求

客户请求头中,可能会有host不明确的情况,如果不想处理这类请求,可以定义一个默认的server丢弃这类请求;

server{
    listen 80 default_server;
    server_name _;
    return 444;
}
使用不存在的域名_作为服务器名字,并返回444以关闭这个链接;

请求头

add_header name value  为http添加响应头;
只有响应码为200,204,301,302,304时才有效;
需要注意的是除了last-modified头以外,该指令可以在输出的头列表加一个新的头,但是不能重写已经存在的头信息;

root与alias

#收到”/img/itheima.png”请求时,将请求映射为"/var/www/image/itheima.png” 
location /img/ {
   alias /var/www/image/;
}
#收到”/img/itheima.png”请求时,将请求映射为"/var/www/image/img/itheima.png” 
location /img/ {
   root /var/www/image/;
}

子配置文件的引入

include file | mask;
在上述语法中, file 用于指定包含的文件名称, mask 用于指定某一路径下的文件,其路 径可以是相对路径,也可以是绝对路径 。
其中,在使用相对路径的情况下,相对的路径是 Nginx 的安装路径下的conf目录 /usr/ local/ nginx/ conf。

常用缓存配置指令

指令                               说 明
proxy_cache_bypass               用于配置 Nginx 向客户端发送响应数据时,不从缓存中获取的条件
proxy_cache_lock                 用于设置是否开启缓存的锁功能
proxy_cache_lock_timeout         用于设置缓存的锁功能开启以后锁的超时时间
proxy_no_cache                   配置在什么情况下不使用缓存功能
proxy_cache_min_uses             当同一个URL被重复请求达到指定的次数后,才对该URL进行缓存
proxy_cache_revalidate           用于当缓存内容过期时,Nginx 通过一次If-Modified-Since的请求头去验证缓存内容是否过期
proxy_cache_use_stale            设置状态,用于内容源Web服务器处于这些状态时, Nginx向客户端响应历史缓存数据

重写与重定向

如果在server级别执行rewrite指令,则请求在location确定前执行,如果被选择的location仍有rewrite指令,同样会被执行; 如果这个location仍有rewrite指令,则会再次改变uri,这种重复周期为10次,10次之后仍找不到具体uri,nginx返回500;

rewrite regex replacement [flag] ;
flag可选参数值:
参数值         说明
last        终止在本location块中处理接收的uri,并将此处重写的uri作为新的uri,使用各location继续处理;
break       终止rewrite,不再继续匹配
redirect    临时重定向,返回的HTTP状态码为302
permanent   永久重定向,返回的HTTP状态码为301
if(!-e $request_filename) {
   rewrite ”^/.*" /default/default.html break;
}

set name value 用于设置一个新的变量;name要以$开头,且不能和nginx预设的全局变量同名。

rewrite 常用全局变量

变量                    说明
$args                  存放url的参数部分,如http://aa.com?a=1&b=2中的a=1&b=2
$content_length        存放请求头中的Content_Length字段
$content_type          存放请求头中的Content_Type字段 
$document_root         存放针对当前请求的根路径 
$document_uri          存放请求中的当前uri,不包括参数部分,如http://aa.com/path?a=1&b=2中的/path
$host                  请求信息中的host头信息,url的主机部分,如http://aa.com/path中的aa.com,
                       如果请求中主机字段不可用或者为空,则存放该server块中server_name的值
$http_host             同$host,但是如果请求host为空,则为空;          
$http_user_agent       浏览器信息
$http_cookie           cookie
$http_x_forwarded_for  网络访问路径
$is_args               如果有$args有值,则等于”?“,否则=空
$limit_rate            存放nginx服务器对网络连接速率的限制;即nginx配置中limit_rate的值;
$remote_addr           客户端地址
$remote_port           端口号
$remote_user           客户端用户名
$request               客户端请求
$request_body_file     发给服务器的本地文件
$request_method        客户端的请求方式
$request_filename      当前请求的资源文件的路径名
$request_uri           当前请求的uri,带参数
$query_string          url参数部分
$scheme                协议
$server_protocol       协议版本
$server_addr           服务器地址
$server_name           服务器名称
$server_port           服务器端口号
$uri                   同$document_uri

if指令判断符号

判断符号      说明  
=           判断变量与内容相等
~           区分大小写正则匹配
!~          区分大小写正则不匹配
~*          不区分大小写正则匹配
-f          判断文件存在
-d          判断目录存在
-e          判断文件或目录存在
-x          判断可执行文件
正则表达式字符串一般不需要加引号,但如果含有}或者;时,必须给整正则表达式加引号;

valid_referers 配置图片防盗链

location ~ * \.(gif|jpg|png|swf|flv)$ { 
   valid_referers www.ng.test ng.test; 
   if($invalid referer){
    return 403;
   }}}

valid_referers 指令的参数可以叠加设置,中间使用空格分隔即可 。 
 valid_referers指令后可以设置的参数值以及相关说明如表   
 参数值        说明
 none         匹配没有 Referer 的 HTTP 请求,如 valid_referers none;
 blocked      匹配 HTTP 请求中含有 Referer,但是被防火墙或者代理服务器修改,
              去掉了https://或 http://的情况,如 valid_referers blocked;
server names   允许文件资源链出的域名白名单,如 valid_referers www.ng.test  ng.test;
string         任意的字符串,如 valid_referers *.ng.test  bxg.* ;
regular expression   正则表达式,如 valid_referers ~\.img\.;

日志文件

 log_format指令进行自定义;
 存储路径、缓存大小等可使用access_log 指令设置。 
 通过访问日志的配置,可以记录用户 IP、访问时间、请求方式、响应状态、地域来源、跳转来源、使用终端等信息。

与日志格式相关的内置变量:
内置变量           说明
$remote_addr    客户端的 IP 地址
$remote user    客户端用户名,用于记 录浏览者进行身份验证时提供的名称,如果没有登录则为空
$time local     访问的时间与时区,如21/Sep/2016:12:21,25 +0800,时间信息最后的+0800表示服务器所处时区位于UTC 之后的8小时
$request        请求的 URI 和 HTTP 协议
$status         记录请求返回的 HTTP 状态码
$body_bytes_sent  发送给客户端的文件主体内容的大小
$http_referer    来路 URL 地址
$http_user_agent  客户端浏览器信息
$http_x_forwarded for 客户端 IP 地址列表(包括中间 经 过的代理 )

错误日志是由 error_log 指令设置的,主要是用来记录客户端在访问 Nginx 时出错的记 录,且该错误显示格式不支持自定义功能。
关闭访问日志:access_log off;
关闭错误日志:error_log /dev/null;

错误页面

  • 自定义错误页面的大小必须大于512字节,否则错误页面的展示将使用 IE 默认的错误页面 。
error_page code [=response] uri
uri 错误页面的路径或者网站地址,如果是路径,则以nginx安装路径下html目录为根路径的相对路径;
errr_page 500 502 503 504 /50x.html;

1.为每种类型的错误设置单独的处理方式
#指定网站极目呆下的页商 40x.html,处琦 403错误
errr_page 403 /40x.html ; 
40x.html在nginx安装路径/html/40x.html
#指定网站根目录下的网片 404.j间,处理 404错误 
error_page 404 /404 . jpg;
2.利用在线资源进行处理错误
error_page 403 http://example.com/forbidden.html;
3.更改晌应状态码
要隐藏服务器返回的真实状态码信息,则可以利用=进行自定义设置,如:
error_page 404 =301 /301.html;
在发生404错误时,返回301状态码,使用nginx安装路径/html/301.html页面展示,
另外,更改响应状态码时还可以不指定确切的码值,而是由重定向后实际处理的真实结果来决定 。 

以上,uri实际上是一个相对于nginx服务器安装路径的相对路径。
如果不想把错误页面放在安装路径下,可以使用location定向;如:
error_page 404 /404.html ;
location /404.html{root /yourpath/}