呕心沥血整理,Nginx看这个就够了

Posted 果子哥丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了呕心沥血整理,Nginx看这个就够了相关的知识,希望对你有一定的参考价值。

nginx

Nginx官方文档

OpenResty官方文档

一、Nginx概述

Nginx是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器

官方文档:https://www.nginx.cn/doc/

特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile

基本功能

  • 静态资源的web服务器
  • http协议反向代理服务器
  • pop3/imap4协议反向代理服务器
  • FastCGI(LNMP),uWSGI(python)等协议
  • 模块化(非DSO),如zip,SSL模块

web服务相关的功能

  • 虚拟主机(server)
  • 支持keep-alive 和 管道连接
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewrrite
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程
  • Memcached的GET接口

正向代理和反向代理

正向代理,代理客户端。
反向代理,代理服务器。

Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。

负载均衡

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略很多。

Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

二、Nginx结构

Nginx 的高并发得益于其采用了 epoll 模型,与传统的服务器程序架构不同,epoll 是Linux 内核 2.6 以后才出现的,Nginx 采用 epoll 模型,异步非阻塞,而 apache 采用的是select 模型

Nginx 默认以 80 端口监听在服务器上,并且启动一个 master 进程,同时有 master 进程生成多个工作进程,当浏览器发起一个 HTTP 连接请求,每个进程都有可能处理这个连接。

Nginx有两种工作模式:master-worker模式和单进程模式(方便调试)。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。

Nginx的程序架构:master/worker架构

  • 一个master架构:负载加载和分析配置文件、管理worker进程(启动,杀死,监控,发送消息/信号等)、平滑升级。不负责业务执行

  • 一个或多个worker进程:处理并响应用户请求。真正提供服务的是worker进程,通过worker进程来实现重启服务,平滑升级,更换日志文件,配置文件生效等功能。

  • 缓存相关的进程:

    • cache loader:载入缓存对象
    • cache manager:管理缓存对象

​ ​ ​ ​ ​ ​ ​ 首先每个 worker 进程都是从 Master 进程 fork 出来,在 Master 进程里面,建立好需要listen 的 socket(listenfd)之后,会 fork 出多个 worker 进程。
  所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,在读事件里调用 accept 接受该连接。
  当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求,产生数据后,再返回给客户端,最后才断开连接,这样形成一个完整的请求流程。如图

master-worker这种模式:

  1. 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。
  2. 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
  3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务

⭐️Nginx配置文件结构
默认的 nginx 配置文件 nginx.conf 内容结构如下:

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server	#每个server用于定义一个虚拟主机
    {
      ...
      server_name 虚拟主机名
      root 主目录
      alias 路径别名
      location [PATTERN] 
      {
      	...
      	if CONDITION {
      	
      	}
      }
    }
    ...     #http全局块
}
mail{
	... #mail协议相关配置段
}
stream{
	... #stream服务器相关配置段
}
  • 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  • 5、location块:配置请求的路由,以及各种页面的处理情况。

如下:

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_processes  1;		# nginx进程数,一般设置成和CPU个数一样
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志 
    
    # 日志格式
    log_format myFormat '$remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    
    # 服务器配置
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

上面是nginx的基本配置,需要注意的有以下几点:

1、几个常见配置项:

  • 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
  • 2.$remote_user :用来记录客户端用户名称;
  • 3.$time_local : 用来记录访问时间与时区;
  • 4.$request : 用来记录请求的url与http协议;
  • 5.$status : 用来记录请求状态;成功是200;
  • 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
  • 7.$http_referer :用来记录从那个页面链接访问过来的;
  • 8.$http_user_agent :记录客户端浏览器的相关信息;
remote_addr #客户端 IP 地址
remote_port #客户端端口
server_addr #服务端 IP 地址
server_port #服务端端口
server_protocol #服务端协议
binary_remote_addr #二进制格式的客户端 IP 地址
connection #TCP 连接的序号,递增
connection_request #TCP 连接当前的请求数量
uri #请求的URL,不包含参数
request_uri #请求的URL,包含参数
scheme #协议名, http 或 https
request_method #请求方法
request_length #全部请求的长度,包含请求行、请求头、请求体
args #全部参数字符串
arg_参数名 #获取特定参数值
is_args #URL 中是否有参数,有的话返回 ? ,否则返回空
query_string #与 args 相同
host #请求信息中的 Host ,如果请求中没有 Host 行,则在请求头中找,最后使用 nginx 中设置的 server_name 。
http_user_agent #用户浏览器
http_referer #从哪些链接过来的请求
http_via #每经过一层代理服务器,都会添加相应的信息
http_cookie #获取用户 cookie
request_time #处理请求已消耗的时间
https #是否开启了 https ,是则返回 on ,否则返回空
request_filename #磁盘文件系统待访问文件的完整路径
document_root #由 URI 和 root/alias 规则生成的文件夹路径
limit_rate #返回响应时的速度上限值

2、惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。

3、每个指令必须有分号结束。

4、log_format只能出现在http指令块中,而access_log则可以出现在http和server,location这些指令块中。

在nginx中存储值得指令继承规则是向上覆盖。当子配置存在时,直接覆盖父配置块, 子配置不存在时,直接使用父配置块。

三、Nginx模块

从结构上分为如下三类:
核心模块: HTTP模块、EVENT模块和MAIL模块
标准模块:

  • HTTP模块:ngx_http_* ,HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块、HTTP Rewrite模块;
    HTTP Core modules 默认功能
    HTTP Optional modules 需编译时指定
  • Mail模块:ngx_mail_*
  • Stream模块:ngx_stream_*

第三方模块:HTTP Upstream Request Hash模块、Notice模块 和 HTTP Access Key模块、Limit_req模块等;

从功能上分为如下三类:

  • Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作,Handlers处理器模块一般只能有一个;
  • Filters(过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出;
  • Proxies(代理类模块):此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGl等进行交互,实现服务代理和负载均衡等功能。(upstream的模块提供数据转发功能,upstream使nginx跨越单机的限制,完成网络数据的接收、处理和转发)

  • http_ssl_module:实现服务器加密传输的模块,部署完成后可使用https://协议进行数据传输,保证数据传输过程的安全。

    worker_processes 1;
    http {
      server {
        listen               443;
        ssl                  on;
        ssl_certificate      /usr/local/nginx/conf/cert.pem;
        ssl_certificate_key  /usr/local/nginx/conf/cert.key;
        keepalive_timeout    70;
      }
    }
    
  • http_image_filter_module:通过该模块可以实现图片裁剪,将过大的图片裁剪为指定大小的图片,生成缩略图,保证传输速率,该选项默认不开启,需要人为指定 image_filter resize $h $w;

    编译安装参数配置:--with-http_image_filter_module  
    
    location /img/ {
        proxy_pass     http://backend;
        image_filter   resize  150 100;
        error_page     415   = /empty;
    
    }
     
    location = /empty {
        empty_gif;
    }
    
  • http_rewrite_module
    Nginx的地址重写模块,功能同Apache的一样,可以实现通过正则匹配来完成条件判断,然后进行域名或url的重写。例如:多域名、http ——》https

    • nginx rewrite 规则中 last、break、redirect、permanent 的含义。
  答:不写last和break - 那么流程就是依次执行这些rewrite
  1.rewrite break - url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求,地址栏url不变
  2.rewrite last - url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变
  3.rewrite redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
  4.rewrite permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url
  
  301	永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
  302	临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
  
  
  break
  作用域: server, location, if
  if ($slow) {
   limit_rate  10k;
   break;
  }
  
  if
  作用域: server, location
  匹配符:=,!=,~*,~,!~,!~*
  使用-f以及!-f检测一个文件是否存在
  使用-d以及!-d检测一个目录是否存在
  使用-e以及!-e检测是否存在一个文件,一个目录或者一个符号链接
  
  return
  作用域: server, location, if
  这个指令根据规则的执行情况,返回一个状态值给客户端。可使用值包括:204,400,402-406,408,410,411,413,416以及500-504。也可以发送非标准的444代码-未发送任何头信息下结束连接。
  
  rewrite
  作用域: server, location, if
  
  
  
  permanent 和 redirect关键字的区别
  rewrite … permanent 永久性重定向,请求日志中的状态码为301
  rewrite … redirect 临时重定向,请求日志中的状态码为302
  我们常用的80端口转443,即http转https的一种配置方案为:
  
  server {
      listen 80;
      server_name demo.com;
      rewrite ^(.*)$ https://${server_name}$1 permanent; 
  }
  server {
      listen       443;
      server_name  demo.com;
      charset utf-8;
      location / {
         alias   /data/web;
         index  index.html index.htm;
      }
}
  会返回301永久重定向到对应的https
  • nginx配置文件,rewrite和proxy_pass区别 (两种常见的资源定向)

    • 区别 https://www.jianshu.com/p/10ecc107b5ee https://blog.51cto.com/853056088/2126498

    • rewrite 通过使用flag可以终止定向后进一步的处理

    • 是否影响浏览器地址栏,proxy_pass不影响浏览器地址栏的url

    • proxy_pass配合upstream实现负载均衡

      • - proxy_set_header Host $host; 作用web服务器上有多个站点时,用该参数header来区分反向代理哪个域名。比如下边的示例。
        - proxy_set_header X-Forwarded-For $remote_addr; 作用是后端服务器上的程序获取访客真实IP,从该header头获取。部分程序需要该功能。
  • http_proxy_module
    Nginx反向代理功能,由于Nginx的高并发特性,很多时候我们都选择使用Nginx为网站的前置服务器,一般会和upstream模块一起使用,完成压力分摊工作。

      location / {
      	proxy_pass        http://localhost:8000;
      	proxy_set_header  X-Real-IP  $remote_addr;
      }
    
      如果想将/a的请求,直接转到80/a路径下
          location /a/ {
      		proxy_pass http://120.76.x.x:80/;
          }
      http://127.0.0.1:8000/a/  访问就会跳到80/a
      
      作用域:http,server,location
    

    搭建一台Nginx方向代理服务器,让后端服务器还能够获取到用户的IP地址
    1.反向代理NGINX端设置记录转发请求的HTTP头信息,记录原有的客户端IP和原有客户端请求的服务器地址
    2.后台服务端利用log_format指令设置日志格式,记录代理端返回来的日志信息

    一、配置反向代理端的nginx服务器
    在server后面增加如下这三个参数用于记录IP:

      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    

    二、在后端服务器配置如下
    在后端服务器的nginx_http处配置如下:
    配置log_format信息, 后续的日志后面也需要加上main这个参数

    log_format  main '$remote_addr $remote_user [$time_local] "$request" '                                                                                                                                                           
                      '$status $body_bytes_sent "$http_referer" '                                                                                                                                                                               
                      '$http_user_agent $http_x_forwarded_for $request_time $upstream_response_time $upstream_addr $upstream_status'; 
    
  • http_upstream_module
    Nginx的负载均衡模块,一般和http_proxy模块一起使用,用来对后台服务器的任务调度及分配,分配原则可以通过算法进行控制。常见模式:Nginx+Apache、Nginx+Tomcat

    upstream backend  {
      server backend1.example.com weight=5;
      server backend2.example.com:8080;
      server unix:/tmp/backend3;
    }
     
    server {
      location / {
        proxy_pass  http://backend;
      }
    }
    
    Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
    
    	upstream group1{
    		server 192.168.0.1:80 weight=1;
    		server 192.168.0.1:81 weight=1;
    	}
        server {
            listen       8000;
            server_name  localhost;
    		default_type text/html
    		
    		location /{
    			echo "hello";
    		}
    
    		location /a/ {
    			proxy_pass http://group1/;
    		}
    	}
    
  • http_gzip_module
    网络传输压缩模块,这个模块支持在线实时压缩输出数据流

    : gzip             on;   开启gzip模块
    : gzip_min_length  1000;
    : gzip_proxied     expired no-cache no-store private auth;
    : gzip_types       text/plain application/xml;
    
    内置变量 $gzip_ratio 可以获取到gzip的压缩比率
    
  • cache_purge
    实现缓存清除功能

ngx_http_core_module(location、rewrite)

ngx_http_core_module
与套接字相关的配置:
1、server{...}   在http块
配置一个虚拟主机
server{
	listen address[:PORT]|PORT;  
	server_name SERVER_NAME;
	root /PATH/TO/DUCUMENT_ROOT;
}

include /etc/nginx/conf.d/vhosts/*.conf;
server{
	listen 8080;   
	//加上default就是默认,不加就按vhosts目录下的文件顺序找。 
	//listen 80 default_server;  listen IP地址:80 default_server
	server_name www.b.com;
	root /data/siteb;
}


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)基于port;
listen PORT;       指令监听在不同的端口
(2)基于ip的虚拟主机
listen IP:PORT;    IP地址不同
(3)基于hostname
server_name fqdn;  指令指向不同的主机名

3、server_name name...;
虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
支持*通配任意长度的任意字符
  server_name *.abc.com www.abc.*
支持~起始的字符做正则表达式模式匹配,性能原因慎用(要计算匹配,最好精确)
  server_name  ~^www\\d+\\.abc\\.com$
  说明:\\d 表示[0-9]
匹配优先级机制从高到低:
(1)首先是字符串精确匹配 如:www.abc.com
(2)右侧*通配符 如:*.abc.com
(3)右侧*通配符 如:www.abc.*
(4)正则表达式 如:~^.*\\.abc\\.com$
(5)default_server


4.tcp_nodelay on|off;
在keepalived模式下的连接是否启用TCP_NODELAY选项
当为off时,延迟发送,合并多个请求后再发送
默认On时,不延迟发送
可用于:http,server,location

5、sendfile on|off
是否启用sendfile功能,在内核中封装报文直接发送
默认off

6、server_tokens on|off|build|string
是否在相应报文的Server首部显示nginx版本

匹配,root、location、alias

7、root
设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http,server,location,if in location
server{
	...
	root /data/www/vhosts;
}
示例:http://www.abc.com/images/logo.jpg
         -->/data/www/vhosts/images/logo.jpg
访问/images/logo.jpg 相当于访问 /data/www/vhosts/images/logo.jpg


8、location [=|~|~*|^~]uri{..}
   location @name{..}
放在server块和location块
  在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置
示例:
	server{...
		server_name www.abc.com;
		location /images/{
			root /data/imgs/;
			}
	}
	http://www.abc.com/images/logo.jpg
		--> /data/imgs/images/logo.jpg
访问images的时候,实际访问的是/data/imgs下的 images

精确匹配:
=:对URI做精确匹配;
		location = /{
		...
		}
		http://www.abc.com/  匹配
		http://www.abc.com/index.html  不匹配
		
正则匹配
^~:对URI的最左边部分做匹配检查,不区分字符大小写,一般用来匹配目录
~:对URI做正则表达式模式匹配,区分字符大小写
~*:对URI做正则表达式模式匹配,不区分字符大小写

内部location
@

不带符号:匹配起始于此uri的所有uri
匹配优先级从高到低: =,^~,~/~*,不带符号(相当于直接一个杠/)
匹配顺序:精确匹配、记录最长前缀匹配、使用第一个正则匹配、使用前面记录的最长前缀匹配

示例1:匹配http://www.abc.com/
location = / {
	...
}

示例2:匹配http://www.abc.com/index.html
location / {
	...
}

示例3:匹配http://www.abc.com/documents/linux.txt
location /documents/{
	...
}

示例4:匹配http://www.abc.com/documents/logo.jpg
location ~* \\.(gif|jpg|jpeg)${
	...
}

示例5:匹配以/images/开头
location ^~ /images/  

示例6:匹配数字,字母和下划线
location ~ /\\w

nginx中location匹配顺序
    首先先检查使用前缀字符定义的location,选择最长匹配的项并记录下来。
    如果找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。
    然后按顺序查找使用正则定义的location,如果匹配则停止查找,使用它定义的配置。
    如果没有匹配的正则location,则使用前面记录的最长匹配前缀字符location。

location匹配规则小结:
1 =|^~|~| 普通文本 四个优先级较高的先匹配
(2,4都是匹配开头,优先级不一样)
2 同优先级的,匹配程度较高的先匹配
3 匹配程度也一样,则写在前面的先匹配

9.alias
	路径别名,文档映射的另一种机制;仅能用于location上下文
示例:
访问 http://www.abc.com/bbs/index.php
location /bbs/{
	alias /web/forum/;
} --> /web/forum/index.html  实际访问

location /bbs/{
	root /web/forum/;
} --> /web/forum/bbs/index.html  实际访问

注意:location中使用root指令和alias指令的意义不同
(a)root,给定的路径对应于location中的/uri/左侧的/
(b)alias,给定的路径对应location中的/uri/右侧的/
10.index file ...;
指定默认网页文件,注意:ngx_http_index_module模块

11、error_page code .. [=[response]] uri;   在server块
模块:ngx_http_core_module
定义错误页,以指定的响应状态码进行响应
可用位置:http,server,location,if in location
error_page 404 /404.html
error_page 404 = 200 /404.html   访问其实是404,强行把状态改为200

示例:
server{
error_page 404 /404.html;
location /404.html{
	root /data/sitea/error/;
	}
}
#mkdir /data/sirea/error/
vim /data/sitea/error/404.html


12、try_files file ... uri;
	try_files file ... = code;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误
location /images/{
	//假设找/images/a.jpg,如果没有a.jpg就返回default.gif
	try_files $uri /images/default.gif;
}
location /{
	try_files $uri $uri/index.html $uri.html = 404;
}

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

13、keepalive_timeout timeout [header_timeout];
设定保持连接超时时长,0表示禁止长连接,默认为75s

14、keepalive_requests number;
在一次长连接上锁允许请求的资源的最大数量,默认为100

15、keepalive_disable none|broswer...
对哪种浏览器禁用长连接

16、send_timeout time;
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长

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

18、client_body_temp_path path [level1 [level2 [level3]]];
设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量
目录名为16进制的数字;
client_body_temp_path /var/tmp/client_body 1 2 2
1 1级目录占1位16进制,即2^4=16个目录 0-f
2 2级目录占2位16进制,即2^8=256个目录 00-ff
2 3级目录占2位16进制,即2^8=256个目录 00-ff

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

19、limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second
默认值0表示无限制

20、limit_except method ... {...},仅用于location
限制客户端使用除了指定的请求方法之外的其他方法
method:GET,HEAD,POST,PUT,DELETE
MKCOL,COPY,MOVE,OPTIONS,PROPFIND,
PROPPATCH,LOCK,UNLOCK,PATCH
limit_except GET{
	allow 192.168.1.0/24;
	deny all;
}除了GET和HEAD之外其他方法仅允许192.168.1.0/24网段主机使用

文件操作优化的配置

21、aio on|off|threads|[=pool];
是否启用aio功能,默认不启动

22、directio size|off;
当文件大于等于给定大小时,例如directio 4m,同步(直接)写磁盘,而非写缓存

23、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1)文件元数据:文件的描述符、文件大小和最近一次的修改时间
(2)打开的目录结构
(3)没有找到的或者没有权限访问的文件的相关信息
max=N:可缓存的缓存项上限;达到上限后会使用LRU(最近最少)算法实现管理
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的活命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即非活动项,将被删除

24、open_file_cache_errors on|off;
是否缓存查找时发生错误的文件一类的信息
默认值为off

25、open_file_cache_min_uses number;
open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项
默认值为1

26、open_file_cache_valid time;
缓存项有效性的检查频率
默认值为60s

ngx_http_access_module

实现基于ip的访问控制功能

1、allow address|CIDR|unix:|all;
2、deny address|CIDR|unix:|all;
http,server,location,limit_except
自上而下检查,一旦匹配,将生效,条件严格的置前
示例:
location /{
	deny 192.168.1.1;
	allow 192.168.1.0/24;
	allow 10.1.1.0/16;
	allow 2001:0db8::/32;
	deny all
}

实现基于用户的访问控制

使用basic机制进行用户认证

1、auth_basic string|off;
2、auth_basic_user_file file;
	location /admin/{
		auth_basic "Admin Area";   # 提示信息
		auth_basic_user_file /etc/nginx/conf.d/vhosts/nginxuser;   # 其实也可以创建隐藏文件 .nginxuser
	}
	用户口令文件:
	1、明文文本:格式name:password:comment
	2、加密文本:由htpasswd命令实现  (通过httpd-tools。 #rpm -ivh httpd-tools)

#htpasswd -cm nginxuser httpuser1  第一次创建要加参数c
#htpasswd -m nginxuser httpuser2

ngx_http_stub_status_module

用于输出nginx的基本状态信息

Active connections:291
server accepts handled requests
	    16630948 16630948 31070465
上面三个数字分别对应accepts,handled,requests三个值
Reading:6 Writing:179 Waiting:106

Activeconnections:当前状态,活动状态的连接数
accepts:统计总值,已经接受的客户端请求的总数
handled:统计总值,已经处理完成的客户端请求的总数
requests:统计总值,客户端发来的总的请求数
Reading:当前状态,正在读取客户端请求报文首部的连接的连接数 (请求头)
Writing:当前状态,正在向客户端发关响应报文过程中的连接数 (响应头)
Waiting:当前状态,正在等待客户端发出请求的空闲连接数 (等待的请求数)

1、stub_status;
示例:
location /status{
	stub_status;
	#allow 172.16.0.0/16;
  #deny all;
}
作用域:server,location

ngx_http_log_module

指定日志格式记录请求。搭配access_log

只能在http的作用域下
#vim /etc/nginx/nginx.conf
1、log_format name string ...;
string可以使用nginx核心模块及其它模块内嵌的变量

2、access_log path [format[buffer=size][gzip[=level]][flush=

以上是关于呕心沥血整理,Nginx看这个就够了的主要内容,如果未能解决你的问题,请参考以下文章

真的,Web安全入门看这个就够了!

整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划

快速入门 Nginx,这篇就够了!

Nginx 性能优化有这篇就够了!

关于Kafka知识看这一篇就够了,Apache Kafka互联网实战整理PDF

大老闭关7天整理,137页Python学习笔记,全面总结看这一篇就够了