第十三周《详细描述常见nginx常用..》上

2018-11-14  本文已影响0人  N32_Diamond

一丶详细描述常见nginx常用模块和模块的使用示例

1.前言
Nignx(Engine X)是一款高度模块化的,轻量级的,高性能的HTTP和反向代理服务,其特点是占有内存少,并发能力强。本文将会介绍Nginx的常用模块及相关案例,了解并掌握相应模块的配置将帮助我们更快更好地了解掌握Nginx服务的配置。官方的模块介绍链接为:http://nginx.org/en/docs/
2.I/O模型:
阻塞型、非阻塞型、复用型、信号驱动型、异步

阻塞型:第一步阻塞,第二步阻塞
非阻塞型: 第一步非阻塞,第二步阻塞
复用型:第一步阻塞,第二步阻塞;第一步阻塞在多路I/O上,调用内核复用器
信号驱动型:第一步完成后调用返回,非阻塞;第二步阻塞
异步:完全异步型I/O

  1. Nginx的程序架构:

4.模块分类:
核心模块:core module
HTTP modules(http模块):
Standard HTTP modules标准的http模块
Optional HTTP modules可选的http模块
Mail modules邮件模块
Stream modules:流模块,传输层代理,4层tcp和udp代理,传输层代理
3rd party modules第三方模块

5.nginx的功用:
静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器);
结合FastCGI/uwSGI/SCGI等协议反代动态资源请求;
http/https协议的反向代理;
imap4/pop3协议的反向代理;
tcp/udp协议的请求转发;

6.nginx安装与常用模块指令
6.1nginx安装

[root@wujunjie ~]# vim /etc/yum.repos.d/nginx.repo 
[nginx]
baseurl=https://mirrors.aliyun.com/epel/7Server/x86_64/
enabled=1
gpgcheck=0
[root@wujunjie ~]# yum install nginx -y
[root@wujunjie ~]# vim /etc/nginx/nginx.conf    #查看主配置文件
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;  #自动探测有几个cpu就启动几个进程
error_log /var/log/nginx/error.log;#错误日期目录
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf; #动态装载模块

events {
    worker_connections 1024;#单个进程响应1024个请求
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';#访问格式名称:地址;用户;本地时间;请求;响应码;字节数;引用;客户端代理;记录真正客户端地址;

    access_log  /var/log/nginx/access.log  main;#访问日志路径

    sendfile            on;#提升效能
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;#保持连接65秒
    types_hash_max_size 2048;#加入内存中匹配过的保存值大的hash值2048个类型

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;默认识别8进制数据流

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
 server {
        listen       80 default_server;  #默认虚拟主机监听80端口
        listen       [::]:80 default_server;
        server_name  _;    #匹配所有主机
        root         /usr/share/nginx/html;#页面根目录

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;#错误页面
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;错误页面
            location = /50x.html {
        }
    }

6.2主配置文件结构:

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

Nginx(2)

配置指令:

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

一. 正常运行必备的配置:

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_processes number | auto;
worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;
auto:当前主机物理cpu核心数;
2.worker_cpu_affinity cpumask ...
worker_cpu_affinity auto [cpumask];
CPU MASK:
00000000:表示8颗cpu核心
00000001:0号cpu
00000010:1号cpu
... ...
3.worker_priority number: 指定worker进程的nice值,设定worker进程的优先级;
优先级范围:[-20,20]
4.worker_rlimit_nofile number: worker进程能够打开的文件数量上限;

示例:
   [root@wujunjie nginx]# vim nginx.conf
        #在main配置文件中添加如下内容
        worker_cpu_affinity auto;  #添加此段用来自动绑定cpu,提升nginx服务器性能
        worker_priority -5;    #调整优先级为-5
        worker_rlimit_nofile 65536;   #进程所能够打开的文件数量为65535
   [root@wujunjie nginx]# nginx -s reload
[root@wujunjie nginx]# watch -n0.5 'ps axo comm,pid,psr,ni | grep nginx'                    
Every 0.5s: ps axo comm,pid,psr,ni | grep nginx                   Thu Nov  8 10:17:51 2018

nginx             1579   0   0
nginx             7071   0  -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
2.use method:指明并发连接请求的处理方法
use epoll;
3.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:发送缓冲区大小

3.server_name name ...; 指明虚拟主机的名称,后可根多个由空白字符分割的字符串;

<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.32.128;
              deny all;
          }
      }
      server {
          listen 80;
          server_name  www.ilinux.*;
          root /data/nginx/vhost1;
          location / {
              allow 192.168.32.128;
              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.32.128;
              deny all;
          }
      }

4.tcp_nodelay on | off;

二. 定义路径相关的配置

7.root path

- = :对uri做精确匹配
- ~: 对uri做正则表达式模式匹配,区分字符大小写
- ~*:对uri做正则表达式模式匹配,不区分字符大小写
- ^~: 对uri的左半部分做匹配检查,不区分字符大小写

  示例:
  #编辑配置文件
 [root@wujunjie ~]# 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@wujunjie ~]# mkdir -pv /data/pictures/images
  [root@wujunjie ~]# mv sky.jpg /data/pictures/images/
使用另外主机访问测试,显示正常如图;
  示例:
  #将上文配置中的location上下文中的root修改为alias即可
      location ^~ /images/ {
              alias /data/pictures;
          }
  #复制图片到/data/pictures目录下访问测试
  [root@wujunjie vhost1]# cp dice.jpg /data/pictures/
使用另外主机访问测试如下图所示
  1. index file ...;

11.error_page code ... [=[response]] uri;

   示例:
   #修改配置文件
   [root@wujunjie ~]# 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
使用另外的主机随便访问不存在的页面测试如下图
三. 定义客户端请求的相关配置

12.keepalive_timeout timeout [header_timeout];

13.keepalive_requests number;

14.keepalive_disable none | browser ...;

15.send_timeout time;

16.client_body_temp_path path [level1 [level2 [level3]]];

2: 表示用2位16进制数字表示一级子目录;00-ff
1: 表示用1位16进制数字表示2级子目录;0-f
1:表示用1位16进制数字表示3级子目录;0-f

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

18.limit_rate rate;

19.limit_except method ... {...}

示例:
         limit_except GET {
         allow 192.168.1.0/24;
         deny all;
     }
     #除了GET和HEAD之外,其它所有的method都允许192.168.1.0/24网络地址访问,其它ip地址都拒绝;
五. 文件操作优化的配置

20.aio on | off |threads[=pool];

21.directio size | off;

22.open_file_cache off;

open_file_cache max=N [inactive=time];

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

23.open_file_cache_valid time;

24.open_file_cache_min_uses number;

25.open_file_cache_errors on|off;

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

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

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

28.auth_basic string | off;

29.auth_basic_user_file file;

示例:
  [root@wujunjie ~]# yum -y install httpd-tools
  [root@wujunjie ~]# htpasswd -c -m /etc/nginx/.ngxpasswd tom
  New password: 
  Re-type new password: 
  Adding password for user tom
  #修改nginx配置文件
  [root@wujunjie ~]# 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@wujunjie ~]# mkdir /data/nginx/vhost1/admin
  [root@wujunjie ~]# vim /data/nginx/vhost1/admin/index.html
  [root@wujunjie ~]# nginx -t
  [root@wujunjie ~]# nginx -s reload
使用另外主机测试访问:
八. ngx_http_stub_status_module模块:用于输出nginx的基本状态信息

30.stub_status;

配置示例:
     [root@wujunjie ~]# 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@wujunjie ~]# nginx -s reload
访问测试:

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

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

31.log_format name string ...;

32.access_log path [format [buffer=size] [gzip=[level1]] [flush=time][if=condition]];
access_log off;

33.open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;

示例:为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"
十. 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

十一. 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
检验效果图
十二. ngx_http_rewrite_module模块:

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/

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

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

2.return

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

3.rewrite_log on |off;

4.if (condition) {...}

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

5.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
十三. ngx_http_referer_module模块
          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;
                }
上一篇下一篇

猜你喜欢

热点阅读