nginx配置文件详解

nginx配置文件详细解说:

一、配置指令

1、main配置段常见的配置指令:

  1)分类:

    正常运行必备的配置

    优化性能相关的配置

    用于调试及定位问题相关的配置

    时间驱动相关的配置

2、正常运行必备的配置

  1)user

    systax:user user [group];   #可以配置一个组,不过一般默认都是nginx配置

  2)pid /PATH/TO/PID_FILE;

    指定存储nginx主进程号码的文件路径

  3)include file | mask;

    指明包含进来的其他配置文件片段;

  4)load_module file;

    指明要装载的动态模块;

3、性能优化相关的配置:

  1)worker_processes number | auto;

    worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;大于的话是没有什么用的。小于的话主要留很小一些核心数给其他服务来使用。

    auto:默认是当前主机物理CPU核心数(nginx自动匹配);

  2)worker_cpu_affinity cpumask ......;

    worker_cpu_affinity auto [cpumask];

      CPU MASK怎么表示呢?

     假如此时电脑有8颗CPU核心数。
      00000000:表示8颗CPU核心,下面这个是位图掩码表示法。
      00000001:0号CPU
      00000010:1号CPU
      00000100:2号CPU
      00001000:3号CPU
      00010000:4号CPU
      00100000:5号CPU
      01000000:6号CPU
      10000000:7号CPU

     案例演示:加入此时我的电脑是4颗CPU

      

      一旦将某个子进程绑定在了某个核心上,那么我们可以做个压测看一下,此时的子进程所使用的核心序号是一定的。

  3)进程优先级

    worker_priority number;

      指定worker进程的nice值,舍得worker进程优先级;[-20.20]

  4)文件数量大小

    worker_rlimit_nofile number;       #其中number的值要大于worker_processes*worker_connections的乘积。

    案例演示:

      

4、调试、定位问题:

  1)daemon on|off;

    是否以守护进程方式运行nginx,centos6中是守护模式,centos7中不必打开守护模式,因为由systemd统一管理。

  2)master_process on | off;

    是否以master/worker模型运行nginx,默认是on;我们使用的也是在on模式下。

  3)error_log file [level];

5、事件驱动相关的配置:

  events {

    .......

  }

  1)worker_connections number;

    每个worker进程所能够打开的最大并发连接数数量;

  2)use method;

    指明并发连接请求的处理方法;method一般有两种:select和epoll。select的最大限制是1024,而epoll的连接是无限制的,所以nginx肯定使用epoll并发请求机制。

    关于两者的区别:我们可以看一下:

  select epoll
性能 随着连接数增加,急剧下降。处理成千上万并发连接数时,性能很差。 随着连接数增加,性能基本上没有下降。处理成千上万并发连接时,性能很好。
连接数 连接数有限制,处理的最大连接数不超过1024。如果要处理超过1024个连接数,则需要修改FD_SETSIZE宏,并重新编译 。 连接数无限制。
内在处理机制 线性轮询 回调callback
开发难易程度

    比如:use epoll;

      

  3)accept_mutex on | off

    处理新的连接请求的方法;on以为着由worker轮流处理新请求,讲究起点公平。off以为着每个新请求的到达都会通知所有的worker进程,讲究结果公平。

二、主机配置

1、与套接字相关的配置

  1)server{......};

    配置一个虚拟主机;

    server {

      listen address[:PORT] | PORT;

      server_name SERVER_NAME;

      root /PATH/TO/DOCUMENT_ROOT;        #表示web服务的默认工作路径是在哪个地方

    #  proxy_pass  URL;      #表示nginx此时仅仅是一台反向代理服务器。

    }

  2) listen PORT | address [:port] | unix:/PATH/TO/SOCKET_FILE

    listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]

      default_server:设定为默认虚拟主机;

      ssl:限制仅能后通过ssl连接提供服务;

      backlog=number:后援队列长度;

      rcvbuf=size:接受缓冲区大小;

      sndbuf=size:发送缓冲区大小;

  3)server_name name .....;

    指明虚拟主机的主机名称;后可跟多个由空白字符分割的字符串;

      支持*通配任意长度的任意字符;server_name *.chaofeng.com   www.chaofeng.*

      支持~其实的字符做正则表达式模式匹配;server_name ~^wwwd+.chaofeng.com$

    匹配机制:

      (1)首先是字符串精准匹配

      (2)左侧*通配符

      (3)右侧*通配符

      (4)正则表达式;

  4)tcp_nodelay on | off;

    在keepalived模式下的连接是否启用TCP_NODELAY选项;

    delay:延迟发送

    tcp_nodelay on表示要求不要合并发送,请求一个发送一个;对非保持连接无效。

  5)tcp_nopush on | off

    在sendfile模式下,是否启用TCP_CORK选项

    tcp_nopush on :在一个包中发送响应头和文件的开头;以完整的包发送文件

  6)sendfile on | off

    是否启用sendfile功能;

    系统调用sendfile()函数通过DMA把硬盘数据拷贝到kernel buffer,然后数据被kernel直接拷贝到另外一个与socket相关的kernel buffer,这里没有user mode和kernel mode之间的切换,在kernel中直接完成了从一个个buffer到另一个buffer的拷贝;DMA把数据从kernel bueer直接拷贝到协议栈,没有切换,也不需要数据从user mode拷贝到kernel mode,因为数据就在kernel里面。步骤减少了,切换减少了,自然性能就提升了。

  7)root path;

    设置web资源路径映射,用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;可用的位置:http,server,location,if in location

  8)location [ = | ~ | ~* ^~ ] uri {.....}

      set configuration depending on a request URI

    在一个server中location配置段可存在多个,用于实现从URI到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应该其配置;

    =:对URI做精准匹配;

      location = / {

        ........

      }

      例如:会去匹配http://www.chaofeng.com/,但是不会匹配http://www.chaofeng.com/index.html

    ~:对URI做正则表达式模式匹配,区分字符大小写;

    ~ *:对URI做正则表达式模式匹配,不区分字符大小写;

    ^~:对URI的左半部分做匹配检查,不区分字符大小写;

    不带符号:匹配起始于此uri的所有的uri;

    匹配优先级:=  >  ^~  >  ~ / ~*   >  不带符号;

        两个普通的location(即不带符号),匹配目录最长的那个。

        两个正则(正则的前半部分是一样的,后半部分可能一个匹配的路径长,另外一个路径短),不管有序无序,只匹配到第一个正则。

     案例:  

server {
          listen 80;
          server_name www.ilinux.io;
          root /data/nginx/vhost1;
          error_page 404 /notfound.html;
          location / {
                  #root /data/nginx/vhost2;
                  allow all;
          }
          location ~*  .(jpg|png)$ {
                  allow all;
          }
          location ^~ /images/ {
                   alias /data/pictures/;
          }
      }

      在location中,如果内部定义了root指定映射的路径,则会覆盖掉server内部的那个root路径。也就是说他们是有继承关系的。我们可以把server的哪个root映射的路径当作父root路径,那么location中那个root映射的路径当作子root路径,父root路径统管全局作用,如果location没有定义子root路径,那么这些location默认会使用父root映射的路径下的内容,但是如果location中定义子root路径,那么子root路径将会继承父root路径,这里的继承是指子root路径覆盖父root路径的映射内容。还要注意的是,子root路径仅仅在当前自己所在的那个location中有效,子root路径只有局部作用。

  9)alias path

      定义路径别名,文档映射的另一种机制;仅仅能用于location上下文;

    注意:

      location中使用root指令和alias指令的意义不同;

      a)root,给定的路径对应于location中的/URI/左侧的/;

      b)alias,给定的路径对应于location中的/URI/右侧的/;

     案例:

      

      现在我们访问一下:

        

      现在我们修改一下配置:

      

      

        我的images目录下是没有header.jpg这张图片的。

       现在我们访问一下:

      

      总结:    alias ,匹配/images/中的第二个/,即访问 www.nginx_vhosts1.io/images/header.jpg 。为路径 /var/nginx_lt1/ 下的header.jpg.如上图

   10)error_page code uri;

    浏览器返回给用户的错误界面404其实也是一个页面,只有当状态码为404的时候,web服务器会调用这个界面然后返回给浏览器。所以我们也可以定义一个错误页面返回给我们。

    案例:

      

      然后我们在/var/nginx_lt1/目录下定义一个错误页面

      

      打开浏览器故意访问一个不存在的页面:

      

  11)index file .......;

    默认资源:http,server,location

三、定义客户端请求的相关配置

  1)keepalive_timeout timeout [header_timeout];

    设定保持连接的超时时长,0表示禁止长连接;默认时75s;

  2)keepalive_requests number;

    在一次长连接上所允许请求的资源的最大数量,默认是100。

  3)keepalive_disable none | browser .....;

    对那种浏览器禁用长连接;(目前市面的浏览器都是比较新的,所以这一项不必过于关注)

  4)send_timeout time;

    向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长。

  5)client_body_buffer_size size;

    用于接收客户端请求报文的body部分的缓冲区大小;默认是16k;超出此大小时,其将暂存到磁盘上的由client_body_temp_path指令所定义的位置

  6)client_body_temp_path apth [level1 [level2 [level3]]];

    设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;(设定文件路径路由的方式)

      主要使用16进制的数字;

      client_body_temp_path   /var/tmp/client_body 2 1 1

        2 :表示256个一级子目录。

        1 :每个一级子目录下有16个二级子目录

        1 :每个二级子目录下有16个三级子目录

          计算:那么一共有256*16*16个三级子目录。

四、对客户端进行限制的相关配置:

  1)limit_rate rate;

  • 限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
    Context: http, server, location, if in location

  2)limit_except method ... {...}

  • 限制对指定的请求方法之外的其它方法的使用客户端
  • 示例:
             limit_except GET {
             allow 192.168.1.0/24;
             deny all;
         }
         #除了GET和HEAD之外,其它所有的method都允许192.168.1.0/24网络地址访问,其它ip地址都拒绝;

五、文件操作优化配置

  1)aio on | off |threads[=pool];

  • 是否启用aio功能;默认为off。使用默认就行
  • Context: http, server, location

  2)directio size | off;

    在linux主机启用IO_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如:directio 4m;

    directio与sendfile功能讲解:

    要使aio生效需把directio设置为打开状况,并且如果aio生效,那么将自动不使用sendfile(),这在linux下这是显然的,要么利用aio读到缓存区,要么利用sendfile()直接发送出去,两者不可兼用,而对于freebsd系统下aio和sendfile并用的情况,我并不了解,所以也就不妄加评论;

可以看到directio是针对每个请求的文件大小而决定是否开启directio的,因此对于上面的整个示例配置,也就会针对每个请求的不同而不同: 如果某处请求的文件大于等于512k,那么将启用directio,从而aio生效,进而sendfile不生效; 如果某处请求的文件小于512k,那么将禁用directio,从而aio也就不生效,转而使用sendfile(),即sendfile生效;

这种设计貌似刚好把linux下aio和sendfile两种机制的优点很好的结合起来使用。对于大文件采用aio,节省cpu,而对于小文件,采用sendfile,减少拷贝;并且对于大文件aio采用directio,避免挤占文件系统缓存,让文件系统缓存更多的小文件。 从理论上来看,这种配置比较适合系统内存有限、小文件请求比较多、间隔有几个大文件请求的Web环境;如果内存足够大,那么应该充分利用文件系统缓存,而directio使得aio无法使用缓存是衡量最终是否需要采用aio的一个需要仔细考虑的因素;网上有人总结说nginx+aio很好,也有人说其很差,其实根据特定的系统环境和应用场景来做配置调节,才能达到性能的最优,nginx提供的 AIO 只是一套工具,没有固定的好与差之分,就看你能否恰当的用好它,但据nginx官网论坛来看,在linux系统的大部分场景下,目前因使用aio功能附加的限制而带来的实际效果估计并不太理想:
  3)open_file_cache off;
  open_file_cache max=N [inactive=time];

    Configures a cache that can store;

    nginx可以缓存以下三种信息:

- <1> 文件的描述符、文件大小和最近一次的修改时间;
- <2> 打开的目录结构;
- <3> 没有找到的或者没有权限访问的文件的相关信息;

        •  max=N: 可缓存的缓存项上限;达到上限后会使用LRU算法(最近最少使用)实现缓存管理;
      •     inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项;

  4)open_file_cache_valid time;

      •     缓存项有效性的检查频率;默认为60s;

  5)open_file_cache_min_uses number;

      •     在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;

  6)open_file_cache_errors on|off;

      •     是否缓存查找时发生错误的文件一类的信息;

六、权限

  1)ngx_http_auth_basic_module模块:实现基于用户的访问控制,使用basic机制进行用户认证

    nginx使用htpasswd(包为httpd-tools)制作账号密码,然后添加在虚拟主机中。

    

  2)ngx_http_stub_status_module模块:用于输出nginx的基本状态信息

    stub_status;

配置示例:
   

  访问一下:

  

    对输出内容做解释:

  Active connections: 活动状态的连接数;
  accepts:已经接受的客户端请求的总数;
  handled:已经处理完成的客户端请求的总数;
  requests:客户端发来的总的请求数;
  Reading:处于读取客户端请求报文首部的连接的连接数;
  Writing:处于向客户端发送响应报文过程中的连接数;
  Waiting:处于等待客户端发出请求的空闲连接数

   3)ngx_http_log_module模块:用于以指定的格式写入请求日志

    log_format name string ...;

    •   string 可以使用nginx核心模块及其它模块的内嵌变量
    •   注意:此配置只能用于http段中

    access_log path [format [buffer=size] [gzip=[level1]] [flush=time][if=condition]];
    access_log off;      #这个功能在一些不必要的location中可以关闭日志功能

    •   访问日志文件路径,格式及相关的缓冲的配置;
        - buffer=size: 设置日志缓冲区大小
             - flush=time:定义清空时长

        示例:

      

  4)open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
    open_log_file_cache off;

    •   缓存各日志文件相关的元数据信息;
    •   max:缓存的最大文件描述符数量;
    •   min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项;
    •   inactive:非活动时长
    •   valid:验证缓存中各缓存项是否为活动项的时间间隔
  案例演示:
    
示例:为nginx定义使用类似于httpd的combined格式的访问日志
  #在/etc/nginx/nginx.conf文件中http段配置日志格式
  [root@wujunjie ~]# vim /etc/nginx/nginx.conf
      http {
           log_format comd '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $bytes_sent '
                           '"$http_referer" "$http_user_agent"';
          ...
      }
  #给vhost1主机添加访问日志,设置为comd格式
  [root@wujunjie ~]# vim /etc/nginx/conf.d/vhost1.conf
      server {
          ...
          access_log /var/log/nginx/vhost1-access.log comd;
          ...
      }   
  #访问测试后查看日志格式
  [root@wujunjie ~]# tail -2 /var/log/nginx/vhost1-access.log 
  192.168.1.106 - tom [06/Aug/2018:23:18:27 +0800] "GET /images HTTP/1.1" 301 388 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
  192.168.1.106 - tom [06/Aug/2018:23:18:27 +0800] "GET /images/ HTTP/1.1" 403 324 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
  5)ngx_http_gzip_module:用gzip格式压缩响应;

    1.gzip on | off;
      Enables or disables gzipping of responses.
    2.gzip_comp_level level;
      Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.
    3.gzip_disable regex ...;
      Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.
    4.gzip_min_length length;
      启用压缩功能的响应报文大小阈值;
    5.gzip_buffers number size;
      支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;
    6.gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
      nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;
      off:对代理的请求不启用
      no-cache, no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能;
    7.gzip_types mime-type ...;
      压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能;

配置示例:   
  gzip  on;
  gzip_comp_level 6;
  gzip_min_length 64;
  gzip_proxied any;
  gzip_types text/xml text/css  application/javascript;  

案例演示: 

    此配置可用位置:http, server, location(在http中定义表示对所有的server生效,在server中定义,表示对所有的location生效。在location中定义,表示对某个location生效)

     如何查找压缩的数据类型呢?

      

  6)ngx_http_ssl_module模块:

    1.ssl on | off;
      是否启用htttps协议
    2.ssl_certificate file;
      当前虚拟主机使用PEM格式的证书文件;
    3.ssl_certificate_key file;
      当前虚拟主机上与其证书匹配的私钥文件;
    4.ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1][TLSv1.2]
      支持ssl协议版本,默认为后三个;
    5.ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
      builtin[:size]:使用Openssl内建的缓存,此缓存为每worker进程私有;
      [shared:name:size]:在各worker之间使用一个共享的缓存;
    6.ssl_session_timeout time;
      客户端一侧的连接可以服用ssl session cache中缓存的ssl参数的有效时长;

案例:

    

配置示例:

 #创建私有CA自签证书,以192.168.32.132为CA

[root@www ~]# cd /etc/pki/CA

[root@www CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)

Generating RSA private key, 2048 bit long modulus

........................................................................+++

..................................+++

e is 65537 (0x10001)

[root@www CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [XX]:CN

State or Province Name (full name) []:ZHEJIANG

Locality Name (eg, city) [Default City]:NINGBO

Organization Name (eg, company) [Default Company Ltd]:ilinux.com

Organizational Unit Name (eg, section) []:opt

Common Name (eg, your name or your server's hostname) []:www.ilinux.com

Email Address []:

[root@www CA]# touch index.txt

[root@www CA]# echo 01 > serial

 #在nginx主机上生成私钥和申请证书

[root@wujunjie ~]# mkdir /etc/nginx/ssl

[root@wujunjie ~]# (umask 077;openssl genrsa -out /etc/nginx/ssl/.nginx.key 2048)

[root@wujunjie ~]# openssl req -new -key /etc/nginx/ssl/.nginx.key -out /etc/nginx/ssl/nginx.crs -days 365

 [root@wujunjie ssl]# scp nginx.csr [root@192.168.32.132:/tmp](mailto:root@192.168.32.132:/tmp)

 #在CA上签署证书

 [root@www CA]# openssl ca -in /tmp/nginx.csr -out certs/nginx.crt -days 365

 #把签署好的证书nginx.crt传会nginx主机

[root@www CA]# scp certs/nginx.crt root@192.168.32.128:/etc/nginx/ssl #修改nginx配置文件,启用ssl

 [root@wujunjie ~]# vim /etc/nginx/conf.d/vhost1.conf

server {

 listen 443 ssl;

 server_name www1.ilinux.com;

 root /data/nginx/vhost1;

 index index.html

 error_page 404 =200 /notfound.html;

 access_log /var/log/nginx/vhost1-access.log main;

 ssl on;

 ssl_certificate /etc/nginx/ssl/nginx.crt;

 ssl_certificate_key /etc/nginx/ssl/.nginx.key;

 ssl_protocols sslv2 sslv3 tlsv1 tlsv1.1 tlsv1.2;

 ssl_session_cache shared:SSL:10m;

 location / {

  allow all;

 }

 }

[root@wujunjie ~]# vim /data/nginx/vhost1/index.html

<h1>nginx</h1>

<h2>192.168.32.128</h2>

 #检查语法,重载配置

 [root@wujunjie ~]# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@wujunjie ~]# nginx -s reload

   补充一篇博客的说明:

    

    

    

    

   7)ngx_http_rewrite_module模块:

    用于使用正则表达式模式更改请求URI,返回重定向,并有条件的选择配置
      例如:

    bbs.magedu.com/ --> www.magedu.com/bbs/
    http://www.magedu.com/ --> https://www.magedu.com/
    http://www.magedu.com/login.php;username=tom --> http://www.magedu.com/tom/
    http://www.ilinux.io/bbs/ --> http://bbs.ilinux.io/

    将用户请求的URI基于regex所描述的模式进行检查,然后完成替换;

    1.rewrite  regex  replacement  [flag]
      将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI;

      注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而上逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;

      如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端;301:永久重定向;

      [flag]

      last:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后对新的URI启动新的一路重写检查;提前重启新一轮循环;
      break:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后直接跳转至重写规则配置块之后的其他配置;循环结束;
      redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,有客户端重新发起请求;不能以http://或https://开头;
      permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;

    案例:

[root@www1 conf.d]# vim vhost.conf

      server {
      listen 80;
      server_name www.ilinux.com;
      root /data/nginx/vhost1;
      rewrite /(.*).png$ /$1.jpg;
      }
  [root@www1 conf.d]# nginx -s reload

    注意:如果没有加flag,默认就是permanent

    http重定向为https

    [root@www1 conf.d]# vim vhost.conf

          server {
          listen 80;
          server_name www.ilinux.com;
          root /data/nginx/vhost1;
          rewrite /(.*)$ https://%{HTTP_HOST} /$1
          }
      [root@www1 conf.d]# nginx -s reload

    2、return

      停止处理并将指定的代码返回给客户端    

      return code [text];
      return code URL;
      return URL;

    3、rewrite_log on |off;

      是否开启重写日志

    4.if (condition) {...}

      引入一个新的配置上下文:条件满足是,执行配置块中的配置指令;

      可用于server和location段中

condition:
比较操作符:
===
~:模式匹配,区分字符大小写
~:模式匹配,区分字符大小写
!~:模式不匹配,区分字符大小写
!~:模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e, !-e
-f, !-f
-d, !-d
-x, !-x

    5、set $variable_value

      用户自定义变量

   7)ngx_http_referer_module模块
      作用:The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the “Referer” header field.

    格式:valid_referers none | blocked | server_names | string ...;
             定义referer首部的合法引用用值;

 none:请求报文首部没有referer首部;
          blocked:请求报文的referer首部没有值;
          server_names:参数,其可以有值作为主机名或主机名模式;
              arbitrary_string:直接字符串,但可使用*作通配符;
              regular expression:被指定的正则表达式模式匹配到的字符串;要使用~打头,例如 ~.*.magedu.com;
              $invalid_referer : 模块内置变量,非法引用,只要没被valid_referers定义匹配到的就是非法引用
...

    示例:

  配置示例:
                valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~.magedu.;
                
                if($invalid_referer) {
                    return http://www.magedu.com/invalid.jpg;
                }

    示例:  

    




原文地址:https://www.cnblogs.com/FengGeBlog/p/10516894.html