Nginx 学习笔记1--在web服务中的使用配置

I/O模型:

阻塞型、非阻塞型、复用型、信号驱动型、异步

  • 同步/异步:关注消息通知机制
  • 消息通知:
    • 同步:等待对方返回消息
    • 异步:被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态
  • 阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
    • 阻塞:blocking,调用结果返回之前,调用者被挂起;
    • 非阻塞:nonblocking,调用结果返回之前,调用者不会被挂起;
  • 一次文件IO请求,都会由两个阶段组成:
    第一步:等待数据,即数据从磁盘到内核内存
    第二步:复制数据,即数据内核内存到进程内存
    1. 阻塞型:第一步阻塞,第二步阻塞
    2. 非阻塞型: 第一步非阻塞,第二步阻塞
    3. 复用型:第一步阻塞,第二步阻塞;第一步阻塞在多路I/O上,调用内核复用器
    4. 信号驱动型:第一步完成后调用返回,非阻塞;第二步阻塞
    5. 异步:完全异步型I/O
  • 复用型IO调用
    • select(): 1024
    • poll(): 无限制
  • enent-driven:
    • epoll(linux):libevent
    • Kqueue(BSD):
    • /dev/poll (Solaris)

Nginx的程序架构:

  • master/worker

    • 一个master进程:负责加载和分析配置文件,管理worker进程,平滑升价
    • 一个或多个worker进程:处理并相应客户请求
    • 缓存相关的进程:
      • cache loader:载入缓存对象
      • cache manager:管理缓存对象
  • 特性:异步、事件驱动和非阻塞

    • 并发请求处理:通过epoll/select
    • 文件IO:高级IO sendfile,异步,mmap
  • nginx模块:高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载;

    • 模块分类:
      • 核心模块:core module
      • 标准模块:
        • HTTP module:
          • 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的安装配置:
  • 官方的预制包:
    http://nginx.org/packages/centos/7/x86_64/RPMS/
    发行版的EPEL仓库;

  • 编译安装:

          [root@localhos]# yum groupinstall "Development Tools" "Server Platform Development"
          [root@localhos]# yum install pcre-devel openssl-devel zlib-devel
          [root@localhos]# useradd -r nginx
          [root@localhos]# cd nginx-1.10.0
          [root@localhost nginx-1.10.0]#  ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio
          [root@localhos]# make && make install
    
  • 程序环境

    • 配置文件的组成部分:
      • 主配置文件:/etc/nginx/nginx.conf
      • include conf.d/*.conf
      • fastcgi,uwsgi,scgi等协议相关的配置文件
      • mime.types: 支持的mime类型;)多用途互联网邮件扩展类型
    • 主程序文件:/usr/sbin/nginx
    • Unit File: nginx.service
  • 配置:

    • 主配置文件的配置指令:
      directive value [value2 ...];
    • 注意:
    1. 指令必须以分号结尾;
    2. 支持使用配置变量;
      • 内建变量:由Nginx模块引入,可直接引用
      • 自定义变量:由用户使用set命令定义;set variable_name value;
        - 引用变量:$variable_name
  • 主配置文件结构:

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

  • http协议相关的配置结构

      http{
          ...
          ...:各server的公共配置
          server {
              ...
          }:  每个server用于定义一个虚拟主机;
          server {
              ...
              listen
              server_name
              root
              alias
              location [OPERATOR] URL {
                  ...
                  if CONDITION {
                      ...
                      }
                  }
              }
          }
      
    
      示例:
      #在192.168.43.125的主机上添加server配置
      [root@localhost ~]# systemctl start nginx.service
      [root@localhost ~]# mkdir /data/nginx/vhost1 -pv
      [root@localhost ~]# vim /data/nginx/vhost1/index.html
          <h1>Nginx Vhosts</h1>
          <h2>192.168.43.125</h2>
      [root@localhost ~]# vim /etc/nginx/conf.d/vhost1.conf
      #在vhost1.conf文件中添加如下内容:
          server {
              listen 80;
              server_name www.ilinux.io;
              root /data/nginx/vhost1;
          }
      [root@localhost ~]# nginx -t     #检查语法错误
      nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
      nginx: configuration file /etc/nginx/nginx.conf test is successfu
      [root@localhost ~]# nginx -s reload    #重载配置
    
      #使用另外的主机访问此服务测试成功
      [root@localhost ~]# curl http://www.ilinux.io
      <h1>Nginx Vhosts</h1>
      <h2>192.168.43.125</h2>
    

Nginx(2)

配置指令:

  • main配置段常见的配置指令:
    分类:
    • 正常运行必备的配置
    • 优化性能相关的配置
    • 用于调试及定位问题相关的配置
    • 事件驱动相关的配置
一. 正常运行必备的配置:
  1. user:定义工作进程使用的用户和组,如果省略组,则使用名称等于用户名的组。
  • syntax:user user [group];
  • Default: user nobody nobody;
  • Context: main
  1. pid /PATH/TO/PID_FILE:指定存储nginx主进程进程号码的文件路径。
  2. include file | mask :指明包含进来的其他配置文件片段。
  3. load_module file:指明要装载的动态模块。
二. 性能优化相关的配置:
  1. worker_processes number | auto;
  • worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;
  • auto:当前主机物理cpu核心数;
  1. worker_cpu_affinity cpumask ...
  • worker_cpu_affinity auto [cpumask];
  • CPU MASK:
    • 00000000:表示8颗cpu核心
    • 00000001:0号cpu
    • 00000010:1号cpu
    • ... ...
  1. worker_priority number: 指定worker进程的nice值,设定worker进程的优先级;
  • 优先级范围:[-20,20]
  1. worker_rlimit_nofile number: worker进程能够打开的文件数量上限;
示例:
    [root@localhost ]# cd /etc/nginx/conf.d
    [root@localhost conf.d]# vim ../nginx.conf
        #在main配置文件中添加如下内容
        worker_cpu_affinity auto;
        worker_priority -5;
        worker_rlimit_nofile 65536;
    [root@localhost conf.d]# nginx -s reload
    [root@localhost conf.d]# watch 'ps axo comm,pid,psr | grep nginx'
        Every 0.5s: ps axo comm,pid,psr |grep nginx                                                     Sun Aug  5 21:04:58 2018

        nginx             5007   0
        nginx            10423   0
        nginx            10424   1
        nginx            10425   2
        nginx            10426   3
    #使用ab压测www.ilinux.io/index.html
    [root@localhost ~]# ab -n 100000 -c 100 http://192.168.43.125/index.html
    [root@localhost conf.d]# ps axo comm,pid,psr,ni | grep nginx
        nginx             5007   0   0
        nginx            10423   0  -5
        nginx            10424   1  -5
        nginx            10425   2  -5
        nginx            10426   3  -5
三.调试、定位问题:
  1. daemon on | off:是否以守护进程方式运行Nginx;
  2. master_process on | off: 是否以master/worker模型运行nginx; 默认为on;
  3. error_log file [level];定义错误日志路径与级别;
四.事件驱动相关的配置:
event {
    ...
}
  1. worker_connections number:每个worker进程所能打开的最大并发连接数量;
  • 总的最大并发响应数量:worker_reocesses*worker_connections
  1. use method:指明并发连接请求的处理方法
  • use epoll;
  1. accept——mutex on | off:处理新的连接请求的方法
  • on:意味着由各worker轮流处理新请求
  • off:意味着每个新请求的到达都会通知所有的worker进程

http协议相关的配置

一. 与套接字相关的配置
  1. server { ... } :配置一个虚拟主机

     server {
         listen address[:PORT]|PORT;
         server_name SERVER_NAME;
         root /PATH/TO/DOCUMENT_ROOT;                            
     }
    
  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:发送缓冲区大小
  1. server_name name ...; 指明虚拟主机的名称,后可根多个由空白字符分割的字符串;
  • 支持*通配任意长度的任意字符;例:server_name .magedu.com www.magedu.

  • 支持~起始的字符做正则表达式模式授权;例:server_name ~^www.\d+.magedu.com$

  • 匹配机制:

    • <1> 首先是字符串精确匹配;
    • <2> 左侧*通配符;
    • <3> 右侧*通配符;
    • <4> 正则表达式;

    练习:定义四个虚拟主机,混合使用三种类型的虚拟主机;仅开放给来自于本地网络中的主机访问;(开放给本地网络中的主机把allow 后的IP地址改为网络地址192.168.0.0/16即可)

            #在/etc/nginx/conf.d目录下编辑配置文件
      [root@localhost conf.d]# vim vhost1.conf
          server {
              listen 80;
              server_name 192.168.43.125;
              root /data/nginx/vhost1;
              location / {
                  allow 192.168.43.143;
                  deny all;
              }
          }
          server {
              listen 80;
              server_name  www.ilinux.*;
              root /data/nginx/vhost1;
              location / {
                  allow 192.168.43.143;
                  deny all;
              }
          }
          server {
              listen 80;
              server_name ~^www\d+\.ilinux\.com$;
              root /data/nginx/vhost1;
              location / {
                  allow 192.168.0.0/16;
                  deny all;
              }
          }
          server { 
              listen 192.168.43.125:8080;
              server_name www3.ilinux.*;
              root /data/nginx/vhost2/;
              location / {
                  allow 192.168.43.143;
                  deny all;
              }
          }
    
  1. tcp_nodelay on | off;
  • 在keepalived模式下的连接是否启用TCP_NODELAY选项;
  • delay:延迟发送;nodelay on:要求不要合并发送,请求一个发送一个;对非保持连接无效;
  1. tcp_nopush on | off
  • 在sendfile模式下,是否启用TCP_CORK选项
  • nopush on :在一个包中发送响应头和文件的开头;以完整的包发送文件
  1. sendfile on | off;
  • 是否启用sendfile 功能;
  • 系统调用sendfile()通过 DMA把硬盘数据拷贝到 kernel buffer,然后数据被 kernel直接拷贝到另外一个与 socket相关的 kernel buffer,这里没有 user mode和 kernel mode之间的切换,在 kernel中直接完成了从一个 buffer到另一个 buffer的拷贝;DMA 把数据从 kernelbuffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里。步骤减少了,切换减少了,拷贝减少了,自然性能就提升了
二. 定义路径相关的配置:
  1. root path
  • 设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;
  • 可用的位置:http, server, location, if in location;
  1. location [ = | ~ | ~* | ^~ ] uri { ... }
  • 根据请求的URI设置配置

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

  • 匹配符:
    - = :对uri做精确匹配
    - ~: 对uri做正则表达式模式匹配,区分字符大小写
    - ~*:对uri做正则表达式模式匹配,不区分字符大小写
    - ^~: 对uri的左半部分做匹配检查,不区分字符大小写
    - 不带符号:匹配起始于次uri的所有url

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

      示例:
      #编辑配置文件
      [root@localhost ~]# vim /etc/nginx/conf.d/vhost1.conf 
              server {
              listen 80;
              server_name www.ilinux.io;
              root /data/nginx/vhost1;
              location / {
                      #root /data/nginx/vhost2;
                      allow all;
              }
              location ~*  \.(jpg|png)$ {
                      allow all;
              }
              location ^~ /images/ {
                      root /data/pictures/;
      #创建目录
      [root@localhost ~]# mkdir -pv /data/pictures/images
      [root@localhost ~]# mv sky.jpg /data/pictures/images/
      #使用另外主机访问测试,显示正常如图;
    
sky.png
  • 注意:在location /images/{}中的第一个/ 匹配/data/pictures/目录;因此访问www.ilinux.io/images/sky.jpg,即为/data/pictures/images/sky.jpg;

...

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

  • 注意:location中使用root指令和alias指令的意义不同
    - root,给定的路径对应于location中的/uri/左侧的/;
    - alias,给定的路径对应于location中的/uri/右侧的/;

      示例:
      #将上文配置中的location上下文中的root修改为alias即可
          location ^~ /images/ {
                  alias /data/pictures;
              }
      #复制图片到/data/pictures目录下访问测试
      [root@localhost vhost1]# cp dice.jpg /data/pictures/
      #使用另外主机访问测试如下图所示
    
dice.png

...

  1. index file ...;
  • 默认资源;可用于http,server,location中。
  1. error_page code ... [=[response]] uri;
  • 定义错误显示的URI

       示例:
       #修改配置文件
       [root@localhost ]# vim /etc/nginx/conf.d/vhost1.conf
           server {
              listen 80;
              server_name www.ilinux.io;
              root /data/nginx/vhost1;
              error_page 404 =200 /notfound.html;
              location / {
                      #root /data/nginx/vhost2;
                      allow all;
              }
              location ~*  \.(jpg|png)$ {
                      allow all;
              }
              location ^~ /images/ {
                       alias /data/pictures/;
              }
              location = /notfound.html {
                      root /data/nginx/error_pages;
              }
             }
             #创建目录,和错误页面信息
             [root@localhost ~]# mkdir /data/nginx/error_pages
             [root@localhost ~]# vim /data/nginx/error_pages/notfound.html
                 <h1>。。。。。。。</h1>
                  <h2> you are sha X</h2>
              [root@localhost ~]# nginx -s reload
    

使用另外的主机随便访问不存在的页面测试如下图

shaX.png
三. 定义客户端请求的相关配置
  1. keepalive_timeout timeout [header_timeout];
  • 设定保持连接的超时时长,0表示禁止长连接;默认为75s;
  • Context: http, server, location
  1. keepalive_requests number;
  • 在一次长连接上所允许请求的资源最大数量,默认为100;
  • Context: http, server, location
  1. keepalive_disable none | browser ...;
  • 对哪种浏览器禁用长连接;
  • Context: http, server, location
  1. send_timeout time;
  • 向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长;
  1. client_body_temp_path path [level1 [level2 [level3]]];
  • 设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量
  • 16进制的数字表示:client_body_temp_path /var/tmp/client_body 2 1 1
    • 2: 表示用2位16进制数字表示一级子目录;00-ff
    • 1: 表示用1位16进制数字表示2级子目录;0-f
    • 1:表示用1位16进制数字表示3级子目录;0-f
四. 对客户端进行限制的相关配置:
  1. limit_rate rate;
  • 限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
  • Context: http, server, location, if in location
  1. 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
  1. directio size | off;
  • 在linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如:directio 4m;
  1. 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指令所指定的次数的缓存项即为非活动项;
  1. open_file_cache_valid time;
  • 缓存项有效性的检查频率;默认为60s;
  1. open_file_cache_min_uses number;
  • 在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;
  1. open_file_cache_errors on|off;
  • 是否缓存查找时发生错误的文件一类的信息;
六. ngx_http_access_module模块:实现基于ip的访问控制功能
  1. allow address | CIDR | unix:| all;
  2. deny address | CIDR | unix | all;
  • 可用的位置:http,server,location,limit_except
七. ngx_http_auth_basic_module模块:实现基于用户的访问控制,使用basic机制进行用户认证;
  1. auth_basic string | off;
  • Default:auth_basic off;
  • Context: http, server, location, limit_except
  1. auth_basic_user_file file;
  • 注意:htpasswd命令由httpd-tools所提供;

      示例:
      [root@localhost ~]# yum -y install httpd-tools
      [root@localhost ~]# htpasswd -c -m /etc/nginx/.ngxpasswd tom
      New password: 
      Re-type new password: 
      Adding password for user tom
      #修改nginx配置文件
      [root@localhost ~]# 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@localhost ~]# mkdir /data/nginx/vhost1/admin
      [root@localhost ~]# vim /data/nginx/vhost1/admin/index.html
      [root@localhost ~]# nginx -t
      [root@localhost ~]# nginx -s reload
    

使用另外主机测试访问:


auth_basic.png
八. ngx_http_stub_status_module模块:用于输出nginx的基本状态信息
  1. stub_status;

    配置示例:
         [root@localhost ~]# 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@localhost ~]# nginx -s reload
    

访问测试:


status.png
  • Active connections: 活动状态的连接数;
  • accepts:已经接受的客户端请求的总数;
  • handled:已经处理完成的客户端请求的总数;
  • requests:客户端发来的总的请求数;
  • Reading:处于读取客户端请求报文首部的连接的连接数;
  • Writing:处于向客户端发送响应报文过程中的连接数;
  • Waiting:处于等待客户端发出请求的空闲连接数;
九. ngx_http_log_module模块:用于以指定的格式写入请求日志
  1. log_format name string ...;
  • string 可以使用nginx核心模块及其它模块的内嵌变量
  • 注意:此配置只能用于http段中
  1. access_log path [format [buffer=size] [gzip=[level1]] [flush=time][if=condition]];
    access_log off;
  • 访问日志文件路径,格式及相关的缓冲的配置;
    - buffer=size: 设置日志缓冲区大小
    - flush=time:定义清空时长
  1. 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@localhost ~]# 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@localhost ~]# vim /etc/nginx/conf.d/vhost1.conf
          server {
              ...
              access_log /var/log/nginx/vhost1-access.log comd;
              ...
          }   
      #访问测试后查看日志格式
      [root@localhost ~]# 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"
    
十. ngx_http_gzip_module:用gzip格式压缩响应;
  1. gzip on | off;
  • Enables or disables gzipping of responses.
  1. gzip_comp_level level;
  • Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.
  1. gzip_disable regex ...;
  • Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.
  1. gzip_min_length length;
  • 启用压缩功能的响应报文大小阈值;
  1. gzip_buffers number size;
  • 支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;
  1. 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的值为此三者中任何一个,则启用压缩功能;
  1. 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模块:
  1. ssl on | off;
  • 是否启用htttps协议
  1. ssl_certificate file;
  • 当前虚拟主机使用PEM格式的证书文件;
  1. ssl_certificate_key file;
  • 当前虚拟主机上与其证书匹配的私钥文件;
  1. ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1][TLSv1.2]
  • 支持ssl协议版本,默认为后三个;
  1. ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
  • builtin[:size]:使用Openssl内建的缓存,此缓存为每worker进程私有;
  • [shared:name:size]:在各worker之间使用一个共享的缓存;
  1. ssl_session_timeout time;
  • 客户端一侧的连接可以服用ssl session cache中缓存的ssl参数的有效时长;

      配置示例:
          #创建私有CA自签证书,以192.168.1.106为CA
          [root@localhost CA]# mkdir /etc/pki/CA/{private,certs,crl,newcerts} -pv
          [root@localhost CA]# cd /etc/pki/CA
          [root@localhost CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
          [root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
          ...
          -----
          Country Name (2 letter code) [XX]:CN
          State or Province Name (full name) []:SD
          Locality Name (eg, city) [Default City]:JN
          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
          [root@localhost CA]# touch index.txt
          [root@localhost CA]# echo 01 > serial
          #在nginx主机上生成私钥和申请证书
          [root@www1 ~]# (umask 077;openssl genrsa -out /etc/nginx/ssl/.nginx.key 2048)
          [root@www1 ~]# openssl req -new -key /etc/nginx/ssl/.nginx.key -out /etc/nginx/ssl/nginx.crs -days 365
          [root@www1 ~]# scp /etc/nginx/ssl/nginx.crs root@192.168.1.106:/tmp
          #在CA上签署证书
          [root@localhost CA]# openssl ca -in /tmp/nginx.crs -out certs/nginx.crt -days 365
          #把签署好的证书nginx.crt传会nginx主机
          [root@localhost CA]# scp certs/nginx.crt root@192.168.1.105:/etc/nginx/ssl
          root@192.168.1.105's password: 
          #修改nginx配置文件,启用ssl
          [root@www1 ~]# 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 comp;
                  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 / {
                      root /data/nginx/vhost2;
                      deny 192.168.1.108;
                      allow all;
                      }
                  location ~*.(jpg|png)$ {
                      deny 192.168.1.107;
                      allow all;
                      }
                  location ^~ /images/ {
                      alias /data/pictures/;
                      allow all;
                      }
                  location  /notfound.html {
                      root /data/nginx/error_pages;
                      }
                  location ~* ^/(admin|login) {
                      auth_basic "admin area or login url";
                      auth_basic_user_file /etc/nginx/.ngxpasswd;
                      index flower.jpg;
                      }
                  location /ngxstatus/ {
                      stub_status;
                      auth_basic ngxstatus;
                      auth_basic_user_file /etc/nginx/.ngxpasswd;
                      }
                  }
          #检查语法,重载配置
          [root@www1 ~]# nginx -t
          nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
          nginx: configuration file /etc/nginx/nginx.conf test is successful
          [root@www1 ~]# nginx -s reload
    

使用外部主机访问测试:


ssl1.png
丧失了.png
十二. ngx_http_rewrite_module模块:

-将用户请求的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给客户端,由客户端重新发起请求;
  1. return
  • 停止处理并将指定的代码返回给客户端

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

  1. rewrite_log on |off;
  • 是否开启重写日志
  1. if (condition) {...}
  • 引入一个新的配置上下文:条件满足是,执行配置块中的配置指令;

  • 可用于server和location段中

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

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

    简单示例:
    #重新编辑配置文件vhost.conf
    [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
    

访问测试.png能否重写为.jpg

day.png

十三. 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.
  1. 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;
                }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容