nginx搭建文件服务器

Nginx enginx X=Nginx http协议:web服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy Nginx is a free, open-source,high-performance HTTP server

Nginx

  • enginx X=Nginx
    • http协议:web服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy
    • Nginx is a free, open-source,high-performance HTTP server and reverse proxy,as well as an IMAP/POP3 proxy server.
    • C10K(10K Connections).
    • Tengine,OpenResty
  • http协议:
    • URL:scheme://username:password@host:port/path;params?query#frag
      • DocumentRoot:/PATH/TO/SOMEDIR
        • Location:URL
      • Alias
      • params:
        • key=value&key=vlaue
      • query:查询条件,过滤表达式
        • field=vlaue
      • 网页中的位置
    • http事务:
      • request:

          <method><URL><VERSION>
          HEADERS
          
          name:value
          
          <body>
        
      • response:

          <VERSION><STATUS><REASON-PHRASE>
          HEADERS
          
          <body>
        
      • Method:GET请求资源/HEAD头部/POST提交表单,PUT上传/DELETE,TRACES,OPTIONS方法

      • Status Code:

        • 1xx:
        • 2xx:成功类型响应码,200
        • 3xx:重定向类的响应码,301(permanent),302,304(not modified)
        • 4xx:客户端错误,403,404
        • 5xx:服务端错误,502
      • 认证:

        • 基于ip认证
        • 基于用户认证:basic(明文)/digest(校验后加密传输,但是支持较差)
      • httpd MPM:

        • prefork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责相应一个请求;
        • woker:线程模型,三级结构,主进程master负责生成多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求;
        • event:主进程master负责生成子进程,每个子进程相应多个请求;
  • I/O模型:
    • 阻塞型(两段都是阻塞型)、非阻塞型(第一阶段是非阻塞型,第二阶段是阻塞型)、复用型(,两阶段都为阻塞型,但是阻塞在多路IO上,不直接面向第一或第二阶段,即IO复用器,IO复用器可监控IO阻塞情况)、信号驱动型(第一阶段非阻塞型,第二阶段为阻塞型)、异步
    • 同步/异步:
      • 关注消息通知机制;
      • 消息通知:
        • 同步:等待对方发送消息;
        • 异步:被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态;
    • 阻塞/非阻塞:
      • 关注调用者在等待结果返回之前所处的状态;
        • 阻塞:blocking,调用结果返回之前,调用者被挂起;闲等
        • 非阻塞:nonblocking,调用结果返回之前,调用者不会被挂起;忙等,只能一遍一遍重复问调用结果情况,不能进行其他操作;
    • 一次文件IO请求,都会由两阶段组成:
      • 第一步:等待数据,即数据从磁盘到内核内存;
      • 第二步:复制数据,即数据内核内存到进程内存;
    • 复用型IO调用:
      • select():1024 prefork模型,最大并发数为1024
      • poll():nolimit
      • event-driven;
        • epoll(Linux):libevent
          • yum info libevent
        • Kquene(BSD):
        • /dev/poll(Solaris):
          在这里插入图片描述


  • httpserver
    • static
    • nmap,nmt
  • reverse proxy


  • nginx
    在这里插入图片描述


  • Nginx的架构
    • master/worker
      • 一个master进程:
        • 负责加载和分析配置文件、管理worker进程、平滑升级
      • 一个或多个woker进程
        • 处理并响应用户请求
      • 缓存相关的进程:
        • cache loader:载入缓存对象
        • cache manager:管理缓存对象
    • 特性:异步,时间驱动和非阻塞
      • 并发请求处理:通过kevent/epoll/select,/dev/poll
      • 文件IO:高级IO、sendfile、异步、mmap
    • nginx高度模块化,但其模块早期不支持DSO机制,近期版本支持动态装载和卸载;
      • 模块分类:
        • 核心模块:core module
        • 标准模块:
          • HTTP modules:
            • Standard HTTP modules
            • Optional HTTP modules
          • Mail modules
          • Stream modules
        • 3rd party modules
    • nginx的功用:
      • 静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器);
      • 结合fastcgi/uwsgi/scgi等协议反代动态资源请求;
      • http/https协议的反向代理;
      • imap4/pop3协议的反向代理;
      • tcp/udp协议的请求转发;


nginx的安装

  1. rpm(epel源)安装,官方有文档
  2. 源码编译安装
  3. 二进制安装

  • 配置:
    • 配置文件的组成部分:
      • /etc/nginx/nginx.conf
      • /etc/nginx/conf.d/*.conf
      • include conf.d/*.conf
      • fastcgi,uwsgi,scgi等协议相关的配置文件
      • mime.types:支持的mime类型:多用途互联网邮件扩展类型
    • 主程序文件:
      • /usr/sbin/nginx
        • nginx -V #查看nginx安装时的配置以及版本和编译环境
        • nginx -t #检查nginx配置文件语法
        • nginx -s signal #向nginx进程发送信号,有reload|restart|start|sop等
        • nginx -p #设置配置文件路径
      • Unit File:nginx.service
    • 主配置文件的配置指令:
      • directive value [value2…];
      • 注意:
        • 指令必须以分号结尾
        • 支持使用配置变量;
          • 内建变量:由nginx模块引入,可直接引用;
          • 自定义变量:由用户使用set命令定义:
            • set variable_name value;
            • 引用变量:$variable_name
    • 主配置文件结构:

main block:主配置段,也即全局配置段
      event {
              ...
       }:事件驱动相关的配置;
      http {
              ...
       }:http/https协议相关的配置段
      mail {
              ...
       }
      stream {
              ...
       }

    • http协议相关的配置结构

http {
        ...
        ...:各server的公共配置
        server {
                ...
         }:每个server用于定义一个虚拟主机;
        server {
                ...
                listen              监听地址端口
                server_name     主机名
                root                相当于DocumentRoot
                alias               路径别名
                location [OPERATOR] URL {
                        ...
                        if CONDITION {
                                ...
                        }
                }
        }
 }

main配置段常见的配置指令


    • main配置段常见的配置指令
      • 分类:

        • 正常运行必备的配置
        • 优化性能相关的配置
        • 用于调试及定位问题相关的配置
        • 事件驱动相关的配置
      • 正常运行必备的配置:

        1. user
          syntax:user user [group];
          Default:user nobody nobody;
          Context:main

        2. pid /PATH/TO/PID_FILE;
          指定存储nginx主进程进程号码的文件路径;

        3. include file | mask;
          指明包含进来的其他配置文件片段;

        4. load_module file;
          指明要装载的动态模块

      • 性能优化相关的配置:

        1. worker_process number | auto;
          woker进程的数量;通常应该小于等于当前主机的cpu的物理核心数;
          auto:当前主机物理cpu核心数;
        2. worker_cpu_affinity cpumask …;
          worker_cpu_affinity auto | [cpumask];
          CPUMASK:
          00000001:0号CPU
          00000010:1号CPU
          … …
          将进程绑定在指定CPU上
          ps axo comm,pid,psr | grep nginx:查看进程运行在哪个cpu上
        3. woker_priority number;
          指定woker进程的nice值,设定woker进程优先级;[-20,20]
          ps axo comm,pid,psr,ni | grep nginx:查看进程优先级
          woker_priority -5
        4. woker_rlimit_nofile number;
          woker进程能够打开的文件数量上限;需要先上调nginx用户的ulimit数;
          woker_rlimit_nofile 65535;
      • 调试、定位问题:

        1. daemon on | off;
          是否以守护进程方式运行nginx
        2. master_process on | off;
          是否以master/worker模型运行nginx;默认为on;
        3. error_log_file [level];
      • 事件驱动相关的配置:

events {
      ...
}
  •       1. woker_connections number;
             每个worker进程所能够打开的最大并发连接数数量;
             worker_processes * worker_connections
          2. use method;
             指明并发连接请求的处理方法;
             use epoll;
          3. accept_mutex on | off;   
             处理新的连接请求的方法;on意味着由各worker轮流处理新请求,off意味着每个新请求的到达都会通知所有的worker进程; 
    

http协议的相关配置


    • http协议的相关配置:
      • 与套接字相关的配置:
        • server {…}

          • 配置一个虚拟主机;
            server {
            listen address[:PORT] | PORT;
            server_name SERVER_NAME;
            root /PATH/TO/DOCUMENT_ROOT; #web服务器
            #proxy_pass http://192.168.79.7 #反代
            }
        • listen PORT | address[:port]|unix:/PATH/TO/SOCKET_FILE

        • listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
          defualt_server:设定为默认虚拟主机;
          ssl:限制仅能够通过ssl连接提供服务;
          backlog=number:后援队列长度;
          rcvbuf=size:接收缓冲区大小;
          sndbuf=size:发送缓冲区大小

        • server_name name …

          • 指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;
            • 支持*通配任意长度的任意字符串;server_name *.magedu.com www.magedu.*
            • 支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+.magedu.com$
          • 匹配机制:
            • 首先是字符串精确匹配
            • 左侧*通配符;
            • 右侧*通配符;
            • 正则表达式;
          • 练习:定义四个虚拟主机,混合使用三种类型的虚拟主机;仅开放给来自于本地网络中的主机访问;
server {
        listen 80;
        server_name www.a.com;
        root /data/test;
        location / {
                allow 192.168.79.27;
                deny all;
        }
}

server {
        listen 192.168.79.47:8080;
        server_name www.b.cn;
        root /data/test2;
        location / {
                allow 192.168.79.27;
                deny all;
        }
}

server {
        listen 8080;
        server_name www.c.org;
        root /data/test3;
        location / {
                allow 192.168.79.27;
                deny all;
        }
}
  • tcp_nodelay on | off;
    • 仅对keepalive连接生效,使之不等待合并一起发送;
  • tcp_nopush on | off;
    • 仅当sendfile为on时生效,先将响应报文的首部和文件头部在一个报文中进行发送,然后将一个完整的文件通过一个完整的报文发送出去;
    • 在sendfile模式下,是否启用TCP_CORK选项;文件内容与应用层首部合并起来一块发送
  • types_hash_max_size 2048;
    • 设定保存类型hash表的最大值;
  • sendfile on | off;
    • 是否启用sendfile功能
  • 路径相关的配置
  • root path;
location = / {
        ...
}
    • 设置web资源路径映射;用于指明用户请求的rul所对应的本地文件系统上的文档所在目录路径;可用的位置:http,server,location,if in location;
      • location [ = | ~ | ~* | ^~ ] uri {…}
        • set configuration depending on a request URI.
          • 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其哦欸之;

          • =:对URI做精确匹配;例如,http://www/magedu.com/,http://www/magedu.com/index.html

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

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

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

          • 不带符号:匹配起始与此URL的所有url;

          • 匹配优先级:=,^,,~*,不带符号;

root /vhsots/www/htdocs/
        http://www.magedu.com/index.html -->/vhosts/www/htdocs/index.html
        
server {
        root /vhosts/www/htdocs/
        
        location /admin/ {
                root /webapps/app1/data/
        }
}
    • alias path:
      • 定义路径别名,文档映射的另一种机制;仅能用于location上下文;
        • 注意:location中使用root指令和alias指令的意义不同;
          • root,给定的路径对应于location中的/url/最左侧的/;
          • alias,给定的路径对应于location中的/url/最右侧的/;
        • index file …;
          • 默认资源:http,server,location;
        • error_page code … [=[response]] url;
          • Defines the URL that will be shown for the specified errors.
        • try_files file … url;

2019/5/28 2:24

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


    • 定义客户端请求的相关配置
      • keepalive_timeout timeout [header_timeout];

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

        • 在上一次长连接上所允许请求的资源的最大数量,默认为100;
      • keepalive_disable none | browser …;

        • 对哪种浏览器禁用长连接;
      • send_timeout time;

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

        • 用于接收客户端请求报文的body部分的缓冲区大小;默认为16K;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
      • client_body_temp_path path [level1 [level2 [level3]]];

        • 设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
          • 16进制的数字;
          • client_body_temp_path path /var/tmp/client_body 2 1 1
            • 1:表示用一位16进制数字表示一级子目录;0-f
            • 2:表示用2位16进制数字表示二级子目录;00-ff
            • 2:表示用2位16进制数字表示二级子目录;00-ff
      • limit_rate rate;

        • 限制响应给客户端的传输速率,单位时bytes/second,0表示无限制;
      • limit_except method … { … }

        • 限制对指定的请求方法之外的其他方法使用客户端;
          limit_except GET {
          allow 192.168.1.0/24; 仅允许192.168.1.0/24的主机使用GET以外的请求方法
          deny all;
          }
文件操作优化的配置
    • aio on | off | threads=[pool];
      • 是否启用aio功能;异步非阻塞,建议设置为on
    • directio size | off;
      • 在linux主机启用O_DIRECT标记,此处意味着文件大于等于给定的大小时使用,例如directio 4m;
    • open_file_cache off;
    • open_file_cahce max=N [inactive=time]; 建议设置
      • nginx可以缓存一下三种信息:
        • 1.文件的描述符、文件大小和最近一次的修改时间;
        • 2.打开的目录结构;
        • 3.没有找到的或者没有权限访问的文件的相关信息;
          • max=N:可缓存的缓存项上线;达到上限后会使用LRU算法实现缓存管理;
          • inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_users指令所指定的次数的缓存项即为非活动项;
    • open_file_cache_valid time;
      • 缓存项有效性的检查频率;默认为60s;
    • open_file_cache_min_users number;
      • 在open_file_cache指令的inactive参数指定的时长内,至少应该呗命中多少次方可被归类为活动项;
    • open_file_cache_erroes on | off;
      • 是否缓存查找时发生错误的文件一类的信息;缓存否定应答

ngx_http_access_module模块:实现基于ip的访问控制功能


  • allow address | CIDR | unix:| all;
  • deny address | CIDR | unix | all;
    可用的位置:http,server,location,limit_except

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


  • auth_basic string | off;
    Default:auth_basic off;
    Context: http, server, location, limit_except

  • auth_basic_user_file file;
    注意:htpasswd命令由httpd-tools所提供;
    示例:
    [root@www ~]# yum -y install httpd-tools
    [root@www ~]# htpasswd -c -m /etc/nginx/.ngxpasswd tom
    New password:
    Re-type new password:
    Adding password for user tom
    #修改nginx配置文件
    [root@www ~]# vim /etc/nginx/conf.d/vhost1.conf
    #在vhost1.conf配置中添加新的location,如下:
    location ~* ^/(admin|login) {
    auth_basic “admin area or login url”;
    auth_basic_user_file /etc/nginx/.ngxpasswd;
    #创建目录和admin主页
    [root@www ~]# mkdir /data/nginx/vhost1/admin
    [root@www ~]# vim /data/nginx/vhost1/admin/index.html
    [root@www ~]# nginx -t
    [root@www ~]# nginx -s reload
    使用另外主机测试访问:

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


  • stub_status;

配置示例:
[root@www ~]# vim /etc/nginx/conf.d/vhost1.conf
location ~* ^/(admin|login) {
auth_basic “admin area or login url”;
auth_basic_user_file /etc/nginx/.ngxpasswd;
stub_status;
}
[root@www ~]# nginx -s reload
访问测试:

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

curl --silent hhtp://www/ilinux.io/ngxstatus | awk '/^Active/{print $2}' 处于活动状态的连接数

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;

    • 访问日志文件路径,格式及相关的缓冲的配置;
      • buffer=size: 设置日志缓冲区大小
      • flush=time:定义清空时长
  • 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@www ~]# 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@www ~]# vim /etc/nginx/conf.d/vhost1.conf
      server {
          ...
          access_log /var/log/nginx/vhost1-access.log comd;
          ...
      }   
  #访问测试后查看日志格式
  [root@www ~]# tail -2 /var/log/nginx/vhost1-access.log 
 192.168.79.1 - - [31/May/2019:11:34:07 +0800] "GET /image/flower.png HTTP/1.1" 200 3572 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"

ngx_http_gzip_module:用gzip格式压缩响应;


  • gzip on | off;
    Enables or disables gzipping of responses.

  • gzip_comp_level level;
    Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.

  • gzip_disable regex …;
    Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.

  • gzip_min_length length;
    启用压缩功能的响应报文大小阈值;

  • gzip_buffers number size;
    支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;

  • 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的值为此三者中任何一个,则启用压缩功能;

  • 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

ngx_http_ssl_module模块:


  • ssl on | off;
    Enables the HTTPS protocol for the given virtual server.
    是否启用htttps协议

  • ssl_certificate file;
    当前虚拟主机使用PEM格式的证书文件;

  • ssl_certificate_key file;
    当前虚拟主机上与其证书匹配的私钥文件;

  • ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1][TLSv1.2]
    支持ssl协议版本,默认为后三个;

  • ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
    builtin[:size]:使用Openssl内建的缓存,此缓存为每worker进程私有;
    [shared:name:size]:在各worker之间使用一个共享的缓存;

  • 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) []:beijing

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

Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:devops

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

Email Address []:

[root@www CA]# touch index.txt

[root@www CA]# echo 01 > serial

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

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

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

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

[root@www ssl]# scp nginx.csr 192.168.79.37:/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.79.37:/etc/nginx/ssl #修改nginx配置文件,启用ssl

[root@www ~]# vim /etc/nginx/conf.d/test.conf

server {
       listen 443;
       ssl on;
       root /var/www/html;
       gzip on;
       gzip_comp_level 9;
       gzip_types text/xml text/css;

       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;
       index index.html;

       location / {
               allow all;
       }

       location /etc {
               autoindex on;
               alias /var/www/html/etc/;
               access_log /var/log/nginx/ssl_nginx_test.log;
       }

       location /image {
               rewrite /(.*)\.png$ /$1.jpg break;
               return http://192.168.79.27;
               autoindex on;
               allow all;
}

[root@www ~]# vim /var/www/html/index.html

<h1>nginx</h1>

<h2>192.168.79.7</h2>

#检查语法,重载配置

[root@www ~]# nginx -t

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

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

[root@www ~]# nginx -s reload

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所描述的模式进行检查,然后完成替换;

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

    • 注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而上逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;
      如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端;301:永久重定向;
    • [flag]:
      • last:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后对新的URI启动新的一路重写检查;提前重启新一轮循环;感觉容易发生死循环,返回500报错。

      • break:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后直接跳转至重写规则配置块之后的其他配置;循环结束;

      • redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,有客户端重新发起请求;不能以http://或https://开头;

      • permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;

      • redirect和permanent可以重定向至其他服务器。

  • return
    停止处理并将指定的代码返回给客户端
    return code [text];
    return code URL;
    return URL;

  • rewrite_log on |off;
    是否开启重写日志

  • if (condition) {…}
    引入一个新的配置上下文:条件满足时,执行配置块中的配置指令;
    可用于server和location段中

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

  • set $variable value
    用户自定义变量

简单示例:
#重新编辑配置文件vhost.conf
[root@www 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
访问测试.png能否重写为.jpg

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;
                }
知秋君
上一篇 2024-07-12 16:48
下一篇 2024-07-12 16:12

相关推荐