2.Nginx核心配置

本文最后更新于:2023年12月5日 晚上

官方帮助文档:http://nginx.org/en/docs/

中文帮助文档:http://tengine.taobao.org/nginx_docs/cn/docs/ 不是很全

语法:

  1. 指令必须分号结尾

  2. 内建变量由 nginx 模块引入,可直接饮用;自定义变量由用户使用 set 命令自定义

    $variable_name 的形式饮用变量

配置文件结构

主配置文件 nginx.conf,包括四部分

# 1.main: 主配置段,即全局配置段,对http和mail都有效
...
# 事件驱动相关配置
event {
 ...
}

# 2.http/https协议相关配置
http {
 ...
}

# 3.mail协议相关配置,默认不包括
mail {
 ...
}

# 4.stream服务器相关配置
stream {
 ...
}

配置项说明

说明:在文档中,每个配置项都有详细的说明

范例:user 配置项,只能用于全局配置中

语法: user user [group];
默认值: user nobody nobody;
上下文: main

范例:charset 配置项,可以用于 http、server、location 配置中

语法: charset charset | off;
默认值: charset off;
上下文: http, server, location, if in location

全局配置

上下文是 main,全局生效,包括事件驱动相关配置

user www www;
# 启动worker进程的数量,注意并不是设置越大越好,建议设置为auto,worker进程数等于cpu核心数量
worker_processes [number | auto];
# 将worker进程和cpu核心绑定,避免了worker进程在不同的cpu核心上来回跳转,建议设置,可以有效提升nginx性能
# 0001:0号CPU、0010:1号CPU
worker_cpu_affinity 0001 0010 0100 1000;
# 错误日志配置
# error_log file [debug | info | notice | warn | error | crit | alert | emerg]
error_log /data/wwwlogs/error_nginx.log crit;
# pid文件保存路径
pid /var/run/nginx.pid;
# 工作进程优先级,-20~19,越小则优先级越高,建议调小
worker_priority 0;
# 所有worker进程能打开的文件数量上限,注意这里设置的值不能超过`ulimit -n`显示的值,否则没有意义,系统默认打开的最大文件数为1024,建议调大,具体怎么调整,查询其他笔记中的ulimit相关知识
worker_rlimit_nofile 65536;
# 前台运行Nginx服务,主要用于测试、docker等环境
daemon off;
# #是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为on
master_process off|on;

# 事件驱动相关配置
events {
 # nginx支持众多事件驱动,推荐设置为epoll
 use epoll;
 # 单个worker进程的最大并发连接
 worker_connections 51200;
 # 默认off,新请求回唤醒所有worker进程(惊群),推荐设置为on,worker进程轮流处理新请求
 accept_mutex on;
 # 默认off,推荐设置为on,一个worker进程可以同时接收多个新的网络连接
 multi_accept on;
}

http 配置

http {
 # server的公共配置
 ...
 ...
 # 每个server用于定义一个虚拟主机,第一个server为默认的虚拟服务器
 server {
  ...
 }
}
http {
 # 导入支持的文件类型,mime.types的格式:大类/小类 后缀
 include mime.types;
 # mime.types中没有的文件类型,默认为dafault_type设置的文件类型
 default_type application/octet-stream;
 # 默认off,不显示,建议改为utf-8,在响应头会显示:Content-Type: text/html; charset=utf-8
    charset utf-8;
    # 配置响应头的server,on:‘nginx/版本’;off:‘nginx’,不显示版本
    server_tokens on | off;

    sendfile on; # 开启零拷贝技术,减少I/O次数
    tcp_nopush on; # 在开启了sendfile的情况下,合并请求后统一发给客户端
    # 设置会话保持时间,第二个值为响应头的keep-Alived:timeout值,可以和第一个值不同,可省略
    # https://cloud.tencent.com/developer/article/1541434
    keepalive_timeout 120;
    # 在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500
    keepalive_requests 500;
    tcp_nodelay off; # off:延迟0.2s发送;on:立即发送,推荐设置为on,提高网络利用率

    server {
     listen 80;
     # 支持通配符,支持正则(主机名前加‘~’)
     # 处理请求头没有host字段的请求,server_name设置为空“”
     # ‘_’可以匹配所有的请求,其实也没什么特别,‘_’只是一个非法域名,当然也可以使用“--”和“!@#”等等
     # http://tengine.taobao.org/nginx_docs/cn/docs/http/server_names.html
     server_name localhost;
     access_log logs/host.access.log main;      # 日志设置 main是日志格式
     # location / { } 可以省略,将root和index放到server上下文中
     location / {
   root html;
   index index.html index.htm;
  }
  # 根目录使用root,其他子目录适合使用alias更直观
  location /about {
   # root about # http://host/about 访问的是about/about/index.html
   alias about; # http://host/about 访问的是about/index.html
  }
  location /img {
         default_type text/html;
         alias /data/wwwroot/default/qiniu/upload.html;
     }
  # 定义错误页面
  error_page 404 /404.html;
  error_page 500 502 503 504 /50x.html;
  location /50x.html {
   root html;
  }

    }
}

商业版本的 nginx 中,可以自定义 nginx 的名称,免费的社区版本不支持,但是可以通过修改源码自定义:

server_tokens on:修改 src/core/nginx.h 修改第13-14行,如下示例
#define NGINX_VERSION "1.68.9"
#define NGINX_VER "lnginx/" NGINX_VERSION

server_tokens off:修改 src/http/ngx_http_header_filter_module.c第49行,如下示例:
static char ngx_http_server_string[] = "Server: nginx" CRLF;
把其中的nginx改为自己想要的文字即可,如:lujinkaix

核心配置示例

ngx_http_core_module

基于不同的 IP、端口、域名实现不同的虚拟主机,依赖于核心模块:ngx_http_core_module

location 语法

一个 server 中可以配置多个 location

  • 精确匹配 =

    通常用于匹配相对固定的 url

    location = /logo.jpg {
     root /data/nginx/images;
     index index.html;
    }
  • 区分大小写的正则匹配 ~

    location ~ .*\.(js|css)?$ {
     expires 7d;
     access_log off;
    }
  • 不区分大小写的正则匹配 ~*

    # 注意:这里只是对img不分区大小写,img、imG都会被匹配到,但是具体到文件,还是区分大小写的
    location ~* /img {
     alias /images;
    }
  • 匹配 URI 开始 ^~

    通常用于匹配目录,注意:不支持正则

    location ^~ /images {
     root /data/nginx/;
     index index.html;
    }

匹配的优先级:=、^、~*、/

作为上传服务器

以下指令控制上传数据

# 允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
client_max_body_size 1m;
# 用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此值,则暂存在client_body_temp_path指定的目录下
client_body_buffer_size size;
# level1、level2、level3表示的是目录层级1、2、3级的命名,具体规律看下面的范例
client_body_temp_path path [level1 [level2 [level3]]];

范例:

client_max_body_size 100m; # 如果php上传,还需要修改php.ini的相关配置
client_body_buffer_size 1024k;
client_body_temp_path /data/nginx/client_body_temp/ 1 2 2;

将上传的文件进行 hash 取值,例如 hash 值为:95f6f65f498c74938064851b1bb963d4,因为设置 1 2 2,所以从后往前去分截取 1、2、2 位,即 4、3d、96,最终的目录名称就是把 16 进制转换为十进制后的数字,即:

/data/nginx/client_body_temp/
├── 4
  └── 61
   └── 150

ngx_http_access_module

访问控制,可以通过匹配客户源 ip 地址进行限制

注意:如果能在防火墙设备进行控制,最好就不要在 nginx 上配置,可以更好的节约资源

范例:

location = /login/ {
    root /data/nginx/html/pc;
    allow 10.0.0.0/24;
    deny all;
}
location /about {
    alias /data/nginx/html/pc;
    index index.html;
    deny 192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny all; # 按小范围到大范围排序
}

ngx_http_auth_basic_module

提供账户认证功能,某些网页例如状态页需要通过认证才能访问

ngx_http_autoindex_module

ngx_http_autoindex_module 模块处理以斜杠字符 “/“ 结尾的请求,并生成目录列表,可以做为下载服
务配置使用

autoindex on | off; # 自动文件索引功能,默认为off
autoindex_exact_size on | off; # 计算文件大小(单位bytes),off 显示大概大小(单位K、M),默认on
autoindex_localtime on | off; # 显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp; # 显示索引的页面文件风格,默认html
limit_rate rate; # 限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即bytes/second,默认值0,表示不限速,此指令由ngx_http_core_module提供

范例:实现下载站点

location /download {
    root /data/nginx/html/pc;
    autoindex on;
    autoindex_exact_size on;
    autoindex_localtime on;
    limit_rate 1024k;
}

error_page

定义错误页面

语法: error_page code … [=[response]] uri;
默认值: —
上下文: http, server, location, if in location

范例:

error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;
# =response 可以改变响应码
error_page 404 =200 /empty.gif;
# 对错误处理进行重定向
error_page 403      http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;
# 将URI发送到被代理的服务器或者FastCGI服务器处理
error_page 404 = /404.php;

如果处理uri产生了错误,那么 nginx 将最后一次出错的 HTTP 响应状态码返回给客户端。

error_log

语法: error_log file | stderr [debug | info | notice | warn | error | crit | alert | emerg];
默认值: error_log logs/error.log error;
上下文: main, http, server, location

范例:

error_log /data/wwwlogs/error_nginx.log crit;

第一个参数是错误日志路径,如果设置为特殊值stderr,nginx 会将日志输出到标准错误输出。

第二个参数是日志级别,debug 到 emerg 严重性由轻到重,如果要设置为 debug,编译时需要添加--with-debug编译选项。

try_files

语法: try_files file … uri;
try_files file … =code;
默认值: —
上下文: server, location

内置变量 $uri 和 $request_uri:

如果用户请求的完整 url:http://s1.lujinkai.cn/www/nav/v1/index.html#/nav

  • $uri:/www/nav/v1,不包含?和#等参数
  • $request_uri:/www/nav/v1/index.html#/nav,包含?和#等参数

try_files 会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部 URI 的指向。最后一个参数是回退 URI 且必须存在,否则会出现内部 500 错误。

范例:

location / {
    root /data/nginx/html/pc;
    index index.html;
    try_files $uri $uri.html $uri/index.html /about/default.html;
    #try_files $uri $uri/index.html $uri.html =489;
}

[root@centos8 ~]$ echo "default page" >> /data/nginx/html/pc/about/default.html
# 重启nginx并测试,当访问到http://www.magedu.org/about/xx.html等不存在的uri会显示default.html,如果是自定义的状态码则会显示在返回数据的状态码中

# 注释default.html行,启用上面489行生效后,再观察结果
[root@centos8 ~]$ curl -I http://www.magedu.org/about/xx.html
HTTP/1.1 489 # 489就是自定义的状态返回码
Server: nginx
Date: Thu, 21 Feb 2019 00:11:40 GMT
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=65

其他配置

  • 针对行为异常的浏览器关闭长连接功能:

    语法: keepalive_disable none | browser …;
    默认值: keepalive_disable msie6;
    上下文: http, server, location

  • 限制客户端使用除了指定的请求方法之外的其它方法:

    语法: limit_except method … { … }
    默认值: —
    上下文: location

    method :GETHEADPOSTPUTDELETEMKCOLCOPYMOVEOPTIONSPROPFINDPROPPATCHLOCKUNLOCK 或者 PATCH。 指定methodGET方法的同时,会自动添加HEAD方法

    # 除了GET和HEAD 之外其它方法仅允许192.168.1.0/24网段主机使用
    limit_except GET {
        allow 192.168.1.0/32;
        deny  all;
    }
    ​```
  • 异步 I/O:

    # 是否开启异步I/O功能,如果开启,编译时需要加入--with-file-aio
    aio on | off;
    # 如果开启aio,必须同时开启directio,否则读取将是阻塞的,注意打开了directio则自动关闭sendfile
    directio size | off;

    范例:

    location /video/ {
        aio            on;
        directio       512;
        # 从磁盘读取响应的缓冲区的数量和大小。默认1 32k
        output_buffers 1 128k;
    }
  • 缓存:

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

    1. 文件元数据:文件的描述符、文件大小和最近一次的修改时间
    2. 打开的目录结构
    3. 没有找到的或者没有权限访问的文件的相关信息
    # 是否缓存打开过文件信息,默认off
    # max:可缓存的缓存项上限数量;
    # inactive:缓存项的非活动时长在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,将被删除
    open_file_cache off | max=N [inactive=time];
    
    open_file_cache_valid time; # 缓存项有效性的检查验证频率,默认值为60s
    open_file_cache_errors on | off; # 是否缓存查找时发生错误的文件一类的信息,默认值为off
    open_file_cache_min_uses number;  # open_file_cache指令的inactive参数指定的时长内,至少被命中几数方可被归类为活动项,默认值为1

    范例:

    open_file_cache max=10000 inactive=60s; # 最大缓存10000个文件,非活动数据超时时长60s
    open_file_cache_valid 60s; # 每间隔60s检查一下缓存数据有效性
    open_file_cache_min_uses 5; # 60秒内至少被命中访问5次才被标记为活动数据
    open_file_cache_errors on; # 缓存错误信息

2.Nginx核心配置
http://blog.lujinkai.cn/运维/Nginx/2.Nginx核心配置/
作者
像方便面一样的男子
发布于
2020年12月25日
更新于
2023年12月5日
许可协议