闲不下来-nginx 配置文件
咱们都知道,nginx 架构采用一个 master 主进程管理多个 worker 进程,master 主要负责管理 worker 进程,就比如 leader 管理多个自己的手下,真正干事的就是自己的手下 worker。
worker 的线程一般和 cpu 的核数一致,为什么这么说呢?目的是防止切换进程带来的损耗,当然,worker 之间通过一些进程间通信机制实现负载均衡等功能。
如上图,清晰明了...
咱们知道,Nginx 服务启动时会读入配置文件,后续的行为则按照配置文件中的配置进行。Nginx 的配置文件可以说是类似于 txt 纯文本文件。
默认安装 Nginx 后,其配置文件一般在/usr/local/nginx/conf
目录下。其中,nginx.conf
为主配置文件。配置文件以#
开始的行,或者前面有若干空格或者 TAB 键,然后再跟``的行,都被认为是注释。这里只是了解主配置文件的结构。
关于 Nginx 的配置文件,但凡我们需要部署一些服务,需要用到它的反向代理、或者其他的功能的时候,不得不去接触它的配置文件,鄙人相信你肯定会查一下 nginx 的一些相关配置,让自己的服务完美运行。
我们讲一讲 nginx 配置文件的结构,首先它是以 block 形式组织,每个 block 都是以一个块名字和一对大括号"{}"表示组成。
block 又分为几个层级,整个配置文件为 main 层级,即最大的层级;在 main 层级下可以有 event、http、mail 等层级,而 http 中又有 server block,server block 中可以包含 location block。即块之间是可以嵌套的,内层块继承外层块。
最基本的配置项语法格式是“配置项名 配置项值 1 配置项值 2 配置项值 3 ... ”;每个层级可以有自己的指令(Directive),例如 worker_processes 是一个 main 层级指令,它指定 Nginx 服务的 Worker 进程数量。
有的指令只能在一个层级中配置,如 worker_processes 只能存在于 main 中,而有的指令可以存在于多个层级,在这种情况下,子 block 会继承父 block 的配置,同时如果子 block 配置了与父 block 不同的指令,则会覆盖掉父 block 的配置。
指令的格式是“指令名 参数 1 参数 2 … 参数 N;”,注意参数间可用任意数量空格分隔,最后要加分号。
我们看一下 block 层级图:
Nginx 服务运行时,需要加载几个核心模块和一个事件模块,这些模块运行时所支持的配置项称为基本配置;基本配置项大概可分为以下四类:
- 用于调试、定位的配置项
- 正常运行的必备配置项
- 优化性能的配置项
- 事件类配置项
接下来,简单的看看各个模块的配置项:
配置项
nginx 服务基本配置项
- 以守护进程 Nginx 运行方式:
语法:daemon off | on;
默认:daemon on;
- error 日志设置:
路径 错误级别
语法:error_log /path/file level;
默认:error_log logs/error.log error;
其中/path/file是一个具体文件;level是日志的输出级别,其取值如下:
debug info notice warn error crit alert emerg
从左至右级别增大;若设定一个级别后,则在输出的日志文件中只输出级别大于或等于已设定的级别;
- 处理特殊调试点:
语法:debug_points [stop | abort]
这个设置是来跟踪调试 Nginx 的;
- 仅对指定的客户端输出 debug 级别的日志:
语法:debug_connection [IP | DIR]
- 限制 coredump 核心转储文件的大小:
语法:worker_rlimit_core size;
- 指定 coredump 文件的生成目录
语法:working_directory path;
正常运行的配置项
- 定义环境变量
语法:env VAR | VAR=VALUE;
VAR 是变量名,VALUE 是目录;
- 嵌入其他配置文件
语法:include /path/file;
include 配置项可以将其他配置文件嵌入到 Nginx 的 nginx.conf 文件中;
- pid 的文件路径
语法:pid path/file;
默认:pid logs/nginx.pid;
保存 master 进程 ID 的 pid 文件存放路径;
- Nginx worker 运行的用户及用户组
语法:user username [groupname];
默认:user nobody nobody;
- 指定 Nginx worker 进程可打开最大句柄个数
语法:worker_rlimit_nofile limit;
- 限制信号队列
语法:worker_rlimit_sigpending limit;
设置每个用户发给 Nginx 的信号队列大小,超出则丢弃;
优化性能配置项
- Nginx worker 进程的个数
语法:worker_process number;
默认:worker_process 1;
- Nginx worker 进程到指定的 CPU 内核
语法:worker_cpu_affinity cpumask [cpumask...]
- SSL 硬件加速
语法:ssl_engine device;
- 系统调用 gettimeofday 的执行频率
语法:timer_resolution t;
- Nginx worker 进程优先级设置
语法:worker_priority nice;
默认:worker_priority 0;
事件类配置项
- 是否打开 accept 锁
语法格式:accept_mutex [on | off];
- lock 文件的路径
语法格式:lock_file path/file;
- 使用 accept 锁后到真正建立连接之间的延迟时间
语法格式:accept_mutex_delay Nms;
- 批量建立新连接
语法格式:multi_accept [on | off];
- 选择事件模型
语法格式:use [kqueue | rtisg | epoll | /dev/poll | select | poll | eventport];
- 每个 worker 进行的最大连接数
语法格式:worker_connections number;
HTTP 核心模块的配置 为 http 而服务... 这一块还是挺重要的
- 监听端口
语法:listen address:port[default | default_server | [backlong=num | rcvbuf=size | sndbuf=size |
accept_filter | deferred | bind | ipv6only=[on | off] | ssl]];
默认:listen:80;
配置块范围:server
说明一下:
- default 或 default_server:将所在的 server 块作为 web 服务的默认 server 块;当请求无法匹配配置文件中的所有主机名时,就会选择默认的虚拟主机;
- backlog=num:表示 TCP 中 backlog 队列存放 TCP 新连接请求的大小,默认是-1,表示不予设置;
- rcvbuf=size:设置监听句柄 SO_RCVBUF 的参数;
- sndbuf=size:设置监听句柄 SO_SNDBUF 的参数;
- accept_filter:设置 accept 过滤器,只对 FreeBSD 操作系统有用;
- deferred:设置该参数后,若用户发起 TCP 连接请求,并且完成 TCP 三次握手,但是若用户没有发送数据,则不会唤醒 worker 进程,直到发送数据;
- bind:绑定当前端口 / 地址对,只有同时对一个端口监听多个地址时才会生效;
- ssl:在当前端口建立的连接必须基于 ssl 协议;
- 主机名称
语法:server_name name[...];
默认:server_name "";
配置块范围:server
- server name 是使用散列表存储的,每个散列桶占用内存大小
语法:server_names_hash_bucket_size size;
默认:server_names_hash_bucker_size 32|64|128;
- 散列表最大 bucket 数量
语法:server_names_hash_max_size size;
默认:server_names_hash_max_size 512;
默认:server_name_in_redirect on;
配置块范围:server、http、location
- 处理重定向主机名
语法:server_name_in_redirect on | off;
默认:server_name_in_redirect on;
配置块范围:server、http、location
- location
location[= | ~ | ~* | ^~ | @] /uri/ {}
配置块范围:server
说明:
location 尝试根据用户请求中的 URI 来匹配 /uri 表达式,若匹配成功,则执行{}里面的配置来处理用户请求, 以下是 location 的一般配置项
1、以 root 方式设置资源路径
语法格式:root path;
2、以 alias 方式设置资源路径 语法格式:alias path;
3、访问首页 语法格式:index file...;
4、根据 HTTP 返回码重定向页面 语法格式:error_page code [code...] [= | =answer-code] uri | @named_location;
5、是否允许递归使用 error_page 语法格式:recursive_error_pages [on | off];
6、try_files 语法格式:try_files path1 [path2] uri;
- root 方式设置资源路径
语法:root path;
默认:root html;
配置块范围:server、http、location、if
- 以 alias 方式设置资源路径
语法:alias path;
配置块范围:location
- 访问主页
语法:index file...;
默认:index index.html;
配置块范围:http、server、location
- 根据 HTTP 返回码重定向页面
语法:error_page code [code...] [= | =answer-code] uri | @named_location;
配置块范围:server、http、location、if
- 是否允许递归使用 error_page
语法:recursive_error_pages [on | off];
配置块范围:http、server、location
- try_files
语法:try_files path1 [path2] uri;
配置块范围:server、location
- HTTP 包体只存储在磁盘文件中
语法:client_body_in_file_only on | clean | off;
默认:client_body_in_file_only off;
配置块范围:http、server、location
- HTTP 包体尽量写入到一个内存 buffer 中
语法:client_body_single_buffer on | off;
默认:client_body_single_buffer off;
配置块范围:http、server、location
- 存储 HTTP 头部的内存 buffer 大小
语法:client_header_buffer_size size;
默认:client_header_buffer_size 1k;
配置块范围:http、server
- 存储超大 HTTP 头部的内存 buffer 大小
语法:large_client_header_buffer_size number size;
默认:large_client_header_buffer_size 4 8k;
配置块范围:http、server
- 存储 HTTP 包体的内存 buffer 大小
语法:client_body_buffer_size size;
默认:client_body_buffer_size 8k/16k;
配置块范围:http、server、location
- HTTP 包体的临时存放目录
语法:client_body_temp_path dir-path [level1 [level2 [level3]]];
默认:client_body_temp_path client_body_temp;
配置块范围:http、server、location
- 存储 TCP 成功建立连接的内存池大小
语法:connection_pool_size size;
默认:connection_pool_size 256;
配置块范围:http、server
- 存储 TCP 请求连接的内存池大小
语法:request_pool_size size;
默认:request_pool_size 4k;
配置块范围:http、server
- 读取 HTTP 头部的超时时间
语法:client_header_timeout time;
默认:client_header_timeout 60;
配置块范围:http、server、location
- 读取 HTTP 包体的超时时间
语法:client_body_timeout time;
默认:client_body_timeout 60;
配置块范围:http、server、location
- 发送响应的超时时间
语法:send_timeout time;
默认:send_timeout 60;
配置块范围:http、server、location
- TCP 连接的超时重置
语法:reset_timeout_connection on | off;
默认:reset_timeout_connection off;
配置块范围:http、server、location
- 控制关闭 TCP 连接的方式
语法:lingering_close off | on | always;
默认:lingering_close on;
配置块范围:http、server、location
- always 表示关闭连接之前无条件处理连接上所有用户数据;
- off 表示不处理;on 一般会处理;
- lingering_time
语法:lingering_time time;
默认:lingering_time 30s;
配置块范围:http、server、location
- lingering_timeout
语法:lingering_timeout time;
默认:lingering_time 5s;
配置块范围:http、server、location
- 对某些浏览器禁止 keepalive 功能
语法:keepalive_disable [mise6 | safari | none]...
默认:keepalive_disable mise6 safari;
配置块范围:http、server、location
- keepalive 超时时间
语法:keepalive_timeout time;
默认:keepalive_timeout 75;
配置块范围:http、server、location
- keepalive 长连接上允许最大请求数
语法:keepalive_requests n;
默认:keepalive_requests 100;
配置块范围:http、server、location
- tcp_nodelay
语法:tcp_nodelay on | off;
默认:tcp_nodelay on;
配置块范围:http、server、location
- tcp_nopush
语法:tcp_nopush on | off;
默认:tcp_nopush off;
配置块范围:http、server、location
- MIME type 与文件扩展的映射
语法:type{...}
配置块范围:http、server、location
多个扩展名可映射到同一个 MIME type
- 默认 MIME type
语法:default_type MIME-type;
默认:default_type text/plain;
配置块范围:http、server、location
- type_hash_bucket_size
语法:type_hash_bucket_size size;
默认:type_hash_bucket_size 32 | 64 | 128;
配置块范围:http、server、location
- type_hash_max_size
语法:type_hash_max_size size;
默认:type_hash_max_size 1024;
配置块范围:http、server、location
- 按 HTTP 方法名限制用户请求
语法:limit_except method...{...}
配置块:location
method 的取值如下:
GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、
PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH
- HTTP 请求包体的最大值
语法:client_max_body_size size;
默认:client_max_body_size 1m;
配置块范围:http、server、location
- 对请求限制速度
语法:limit_rate speed;
默认:limit_rate 0;
配置块范围:http、server、location、if
0 表示不限速
- limit_rate_after 规定时间后限速
语法:limit_rate_after time;
默认:limit_rate_after 1m;
配置块范围:http、server、location、if
- sendfile 系统调用
语法:sendfile on | off;
默认:sendfile off;
配置块:http、server、location
- AIO 系统调用
语法:aio on | off;
默认:aio off;
配置块:http、server、location
- directio
语法:directio size | off;
默认:directio off;
配置块:http、server、location
- directio_alignment
语法:directio_alignment size;
默认:directio_alignment 512;
配置块:http、server、location
- 打开文件缓存
语法:open_file_cache max=N [inactive=time] | off;
默认:open_file_cache off;
配置块:http、server、location
- 是否缓存打开文件的错误信息
语法:open_file_cache_errors on | off;
默认:open_file_cache_errors off;
配置块:http、server、location
- 不被淘汰的最小访问次数
语法:open_file_cache_min_user number;
默认:open_file_cache_min_user 1;
配置块:http、server、location
- 检验缓存中元素有效性的频率
语法:open_file_cache_valid time;
默认:open_file_cache_valid 60s;
配置块:http、server、location
- 忽略不合法的 HTTP 头部
语法:ignore_invalid_headers on | off;
默认:ignore_invalid_headers on;
配置块:http、server
- HTTP 头部是否允许下划线
语法:underscores_in_headers on | off;
默认:underscores_in_headers off;
配置块:http、server
- If_Modified_Since 头部的处理策略
语法:if_modified_since [off | exact | before]
默认:if_modified_since exact;
配置块:http、server、location
- 文件未找到时是否记录到 error 日志
语法:log_not_found on | off;
默认:log_not_found on;
配置块:http、server、location
- 是否合并相邻的“/”
语法:merge_slashes on | off;
默认:merge_slashes on;
配置块:http、server、location
- DNS 解析地址
语法:resolver address...;
配置块:http、server、location
- DNS 解析的超时时间
语法:resolver_timeout time;
默认:resolver_timeout 30s;
配置块:http、server、location
- 返回错误页面是否在 server 中注明 Nginx 版本
语法:server_tokens on | off;
默认:server_tokens on;
配置块:http、server、location
nginx 配置例子
看看我博客的 nginx 的配置:
user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
http
{
include mime.types;
include luawaf.conf;
include proxy.conf;
default_type application/octet-stream;
server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server_tokens off;
access_log off;
server
{
listen 888;
server_name phpmyadmin;
index index.html index.htm index.php;
root /www/server/phpmyadmin;
location ~ /tmp/ {
return 403;
}
error_page 404 /404.html;
include enable-php.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /www/wwwlogs/access.log;
}
include /www/server/panel/vhost/nginx/*.conf; #这里加载了vhost的nginx下面的所有conf, 包括下面博客的 server 的配置
}
看看我博客的 server 的配置:
server
{
listen 80;
listen 443 ssl;
server_name tc.dreamcat.ink;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/tc.dreamcat.ink;
SSL-START #SSL相关配置,请勿删除或修改下一行带注释的404规则
error_page 404/404.html;
ssl_certificate /etc/ssl/tc/full_chain.pem;
ssl_certificate_key /etc/ssl/tc/private.key;
SSL-END
ERROR-PAGE-START #错误页配置,可以注释、删除或修改
error_page 404 /404.html;
error_page 502 /502.html;
ERROR-PAGE-END
PHP-INFO-START #PHP引用配置,可以注释或修改
include enable-php-74.conf;
PHP-INFO-END
REWRITE-START #URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/tc.dreamcat.ink.conf;
REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log off;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log off;
access_log /dev/null;
}
access_log /www/wwwlogs/tc.dreamcat.ink.log;
error_log /www/wwwlogs/tc.dreamcat.ink.error.log;
}
小结
这一块理解一下 nginx 配置文件的形式即可,想配置什么,寻找一下配置项即可。