nginx--基础--4.1--参数--参数详情
nginx–基础–4.1–配置–参数详情
1、位置介绍
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
1.1、全局块:配置影响nginx全局的指令
- 一般有运行nginx服务器的用户组
- nginx进程pid存放路径
- 日志存放路径
- 配置文件引入
- 允许生成worker process数等。
1.2、events块:配置影响nginx服务器或与用户的网络连接。
- 有每个进程的最大连接数
- 选取哪种事件驱动模型处理连接请求
- 是否允许同时接受多个网路连接
- 开启多个网络连接序列化等。
1.3、http块
- 可以嵌套多个server
- 配置代理,缓存,日志定义等。
- 文件引入
- mime-type定义
- 日志自定义
- 是否使用sendfile传输文件
- 连接超时时间
- 单连接请求数等。
1.4、server块
- 配置虚拟主机的相关参数
- 一个http中可以有多个server。
1.5、location块
- 配置请求的路由
- 各种页面的处理情况。
2、常用配置
2.1、user administrator administrators
配置用户或者组,默认为nobody nobody。
2.2、worker_processes 2
允许生成的进程数,默认为1
2.3、pid /nginx/pid/nginx.pid;
指定nginx进程运行文件存放地址
2.4、error_log log/error.log debug;
- 制定日志路径、级别。
- 这个设置可以放入全局块,http块,server块,
- 级别:
- debug
- info
- notice
- warn
- error
- crit
- alert
- emerg
2.5、accept_mutex on;
设置网路连接序列化,防止惊群现象发生,默认为on
2.6、multi_accept on;
设置一个进程是否同时接受多个网络连接,默认为off
2.7、use epoll
事件驱动模型
- select
- poll
- kqueue
- epoll
- resig
- /dev/poll
- eventport
2.8、worker_connections 1024;
最大连接数,默认为512
2.9、include mime.types;
文件扩展名与文件类型映射表
2.10、default_type application/octet-stream;
默认文件类型,默认为text/plain
2.11、access_log off
取消服务日志
2.12、log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
自定义日志格式
2.13、access_log log/access.log myFormat
combined为日志格式的默认值,这里是设置日志格式
2.14、sendfile on
允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
2.15、sendfile_max_chunk 100k
- 每个进程每次调用传输数量不能大于设定的值
- 默认为0,即不设上限。
2.16、keepalive_timeout 65;
连接超时时间,默认为75s,可以在http,server,location块。
2.17、error_page 404 https://www.baidu.com;
错误页
2.18、keepalive_requests 120;
单连接请求上限次数。
2.19、listen 4545;
监听端口
2.20、server_name 127.0.0.1
监听地址
2.21、location ~*^.+$
- 请求的url过滤
- 正则匹配
2.22、root path
根目录
2.23、index index.html
设置默认页
2.24、proxy_pass http://mysvr;
请求转向mysvr 定义的服务器列表
2.25、deny 127.0.0.1;
拒绝的ip
2.26、allow 172.18.5.54;
允许的ip
2.27、以上的配置文件
#配置用户或者组,默认为nobody nobody。
user administrator administrators;
#允许生成的进程数,默认为1
worker_processes 2;
#指定nginx进程运行文件存放地址
pid /nginx/pid/nginx.pid;
#制定日志路径、级别。这个设置可以放入全局块,http块,server块,
#级别:debug|info|notice|warn|error|crit|alert|emerg
error_log log/error.log debug;
events {
#设置网路连接序列化,防止惊群现象发生,默认为on
accept_mutex on;
#设置一个进程是否同时接受多个网络连接,默认为off
multi_accept on;
#事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
#use epoll;
#最大连接数,默认为512
worker_connections 1024;
}
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型,默认为text/plain
default_type application/octet-stream;
#取消服务日志
#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';
#combined为日志格式的默认值
access_log log/access.log myFormat;
#允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile on;
#每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
sendfile_max_chunk 100k;
#连接超时时间,默认为75s,可以在http,server,location块。
keepalive_timeout 65;
#错误页
error_page 404 https://www.baidu.com;
server {
#单连接请求上限次数。
keepalive_requests 120;
#监听端口
listen 4545;
#监听地址
server_name 127.0.0.1;
#请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
location ~*^.+$ {
#根目录
#root path;
#设置默认页
#index index.html;
#请求转向mysvr 定义的服务器列表
proxy_pass http://mysvr;
#拒绝的ip
deny 127.0.0.1;
#允许的ip
allow 172.18.5.54;
}
}
}
3、日志变量
3.1、变量
$remote_addr
客户端IP地址
$http_x_forwarded_for
- 这是一个请求头字段,表示
原始客户端的IP地址 - 如果请求经过了多个代理服务器,则可能包含多个IP地址(以逗号分隔),例如:client_ip(原始客户端IP),proxy1_ip,proxy2_ip。
$proxy_add_x_forwarded_for
- 这是一个 Nginx 内置变量,用于将当前连接的
客户端IP地址添加到X-Forwarded-For请求头中,值是$remote_addr和http_x_forwarded_for的组合。 - 如果有经过代理(反向代理或负载均衡器)转发时,
X-Forwarded-For头部通常会包含原始客户端IP 地址及其前面的所有代理的IP地址。使用$proxy_add_x_forwarded_for可以获取这个头部中包含的所有IP地址。 - 如果没有经过代理转发时,
$proxy_add_x_forwarded_for与$remote_addr相同
$remote_user
客户端用户的用户名(如果进行 HTTP 认证)
$request
请求的完整内容,包括方法、URI 和协议版本,如 GET /index.html HTTP/1.1。
$status
响应的状态码,比如 200、404 等。
$body_bytes_sent
响应体的字节数,不包括响应头。
$bytes_sent
服务器向客户端发送的总字节数
$connection
与客户端的 TCP 连接的 ID
$connection_requests
表示当前连接上处理的请求数量。每当同一个 TCP 连接上有新的请求到达时,这个变量的值会增加。
$msec
表示当前时间的秒数(以毫秒为单位),通常用于记录请求的时间戳
$pipe
用于指示当前请求是否通过管道(HTTP/1.1 的 Keep-Alive 连接)进行处理。这个变量的值可以是 on 或 off,表示请求是否使用了管道化。
$http_referer
用于指示用户从哪个页面链接到当前请求的页面
$http_user_agent
记录客户端浏览器相关信息
$request_length
客户端请求的长度(以字节为单位)。它涵盖了整个请求的大小,包括请求行、头部和请求体。
$request_time
- 处理请求所花费的时间(以秒为单位)。
- 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601
- ISO8601标准格式下的本地时间。
- 格式:2024-10-14T14:49:21+08:00
$time_local
- 通用日志格式下的本地时间。
- 格式:14/Oct/2024:11:16:51 +0800
$upstream_addr
上游服务器Ip或者后端地址
$host
请求中的主机名
$upstream_response_time
- 表示从上游服务器(如代理或负载均衡器)接收到响应所花费的时间。这个时间通常是以秒为单位,包含小数部分,表示请求处理的延迟。
- 后端响应时间
$upstream_connect_time
- 用于记录与上游服务器(如反向代理或负载均衡器)建立连接所花费的时间。
- 时间以秒为单位,支持小数部分。
$upstream_header_time
- 用于记录从上游服务器接收到响应头所花费的时间,这段时间是指从代理发起请求到接收到上游服务器的响应头的总时长
- 时间以秒为单位,支持小数部分。
$http_x_b3_traceid
- 用于获取请求中的 X-B3-TraceId 值
- 通常用于分布式追踪系统,以跟踪请求在不同服务间的流转
$http_x_b3_spanid
- 用于获取请求中的 X-B3-SpanId 值
- 通常用于分布式追踪系统,标识特定的操作或调用链中的一个节点。
$http_x_b3_parentspanid
- 用于获取请求中的 X-B3-ParentSpanId 值
- 通常用于分布式追踪系统,以帮助建立调用链中父子关系。
3.2、案例
# 定义日志格式,main是日志格式名称
# 时间戳|请求端 IP|客户端 IP|HOST|整体响应时间|后端响应时间|"HTTP 方法 请求地址 HTTP协议版本"|响应码|响应体大小|请求体大小|"跳转来源"|"客户端信息"|后端地址|Trace ID| Span ID|Parent Span ID
log_format main '$time_iso8601|$http_x_forwarded_for|$remote_addr|$host|$request_time|$upstream_response_time|'
'"$request"|$status|$body_bytes_sent|$content_length|"$http_referer"|'
'"$http_user_agent"|$upstream_addr|$http_x_b3_traceid|$http_x_b3_spanid|$http_x_b3_parentspanid';
日志格式:
2024-10-14T08:04:31+00:00|58.250.107.126, 100.77.56.66, 100.79.24.17, 100.77.23.66, 10.244.9.2|10.244.44.98|dcoas.cm-worklink.com|0.131|0.131|"POST /api/framework/v1/page/businessList HTTP/1.1"|200|153|197|"https://zc.cm-qq.com/qt/"|"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"|10.245.36.73:8888|-|-|-
4、代理相关参数
4.1、proxy_pass
代理服务
4.2、proxy_redirect off;
是否允许重定向
4.3、proxy_set_header Host $host;
传header参数至后端服务
4.4、proxy_set_header X-Forwarded-For $remote_addr;
设置request header,即客户端IP地址
4.5、proxy_connect_timeout 90;
连接上游服务超时时间
4.6、proxy_send_timeout 90;
发送数据到上游服务的请求发送最大时间
4.7、proxy_read_timeout 90;
获取上游服务器响应的最大时间
4.8、proxy_buffer_size 4k;
- 申请read_buf的大小
- 大小指定了upstream header最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。
4.9、proxy_buffers 4 32k;
- 设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小。
- 开辟4个长度为32k大小的read_buf用来存储body,当然不是连接建立初始化时就开辟4个,而是当当前read_buf不够存响应body时才会新申请一个,最多申请4个read_buf。
4.10、proxy_busy_buffers_size 64k;
- proxy_busy_buffers_size不是独立的空间,是proxy_buffers和proxy_buffer_size的一部分。
- nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。
- proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。
- 如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给客户端;
- 如果完整数据大小不小于busy_buffer大小,则装满busy_buffer后,马上传给客户端;
4.11、proxy_temp_file_write_size 64k;
- 设置同时写入临时文件的数据量的总大小。
- 通常设置为8k或者16k。
4.12、`以上的配置文件
server {
listen 8088;
server_name www.learnDemo.com;
location / {
proxy_pass http://60.205.188.229:8090;
}
}
5、负载参数
5.1、service
反向服务地址加端口
5.2、weight
权重
5.3、max_fails
失败多少次认为主机已挂掉则,踢出
5.4、fail_timeout
踢出后重新探测时间
5.5、backup
- 备用服务
5.6、max_conns
允许最大连接数
5.7、负载均衡算法
5.7.1、轮询+权重
- 轮询+权重
- 默认
- 缺点:其中一个节点连接满了,nginx还是会将连接转发过去,导致节点连接越来越多,速度越来越慢,不够自动化和智能化。
5.7.2、ip_hash
upstream learnDemo{
ip_hash;
server 60.205.188.229:8090 ;
server 60.205.188.229:8092 ;
}
- 基于Hash计算,用于保持session一至性,解决分布式session同步问题。
- 缺点
- 现在很多小区或者学校都是用的一根光纤,大部分人的ip是一样的,容易导致某个服务连接数量过多,出现负载不均衡的情况,
- 机器挂掉,会话随着会丢失。
5.7.3、url_hash
upstream learnDemo{
hash $request_uri;
server 60.205.188.229:8090 ;
server 60.205.188.229:8092 ;
}
- 静态资源缓存,节约存储,加快速度
- 基于Hash计算,可以把一些静态资源平均分布到各个服务中,节省空间
- 需要安装第三方插件
5.7.4、least_conn
- 最少链接,优先把请求分给和nginx连接最少的服务,最大化的利用资源
- 需要安装第三方插件
5.7.5、least_time
- 最小的响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重(第三方),2. 可以充分利用性能好的机器
- 需要安装第三方插件
5.7.7、以上的配置文件
upstream learnDemo{
ip_hash;
server 60.205.188.229:8090 fail_timeout=10s max_fails=3;
server 60.205.188.229:8092 fail_timeout=10s max_fails=3;
server 60.205.188.229:8093 backup;
}
- backup
- 全部服务(8090,8092)都意外停止,备用服务(8093)才会顶上来!
- 只要有一台服务(8090,8092)重新启动,那么备份服务8093)就不会起作用了。
- fail_timeout=30s max_fails=1
- 如果我们将8092停止了,下一次负载到8092,连接不可达,fails=1,将请求转发给8090,直到fails=10,这个时候nginx会将8092标记为不可用节点,以后请求都发给8090了,而且nginx会每过30秒会检测8092节点,如果节点回复,请求会转发给8092。
- 8090 weight=1,8092 weight=2
- 请求会按照1:2的比例转发给8090,8092。
- ip_hash
- 基于ip分配上游服务器

6、缓存参数
6.1、proxy_cache_path
缓存路径
6.2、levels
缓存层级及目录位数
6.3、keys_zone 缓冲区的名字 大小
缓冲区的名字 大小
6.4、inactive
有效期
6.5、max_size
硬盘大小
6.6、proxy_cache 缓冲区的名字;
指定缓存区
6.7、proxy_cache_key $host$uri$is_args$args;
以全路径md5值做做为Key
6.8、proxy_cache_valid 200 304 12h;
- 对不同的HTTP状态码设置不同的缓存时间
- h:小时
7、location匹配模式及顺序(降序)
location = /uri地址
= 开头表示精确匹配,只有完全匹配上才能生效。
location ^~ /uri地址
^~ 开头对URL路径进行前缀匹配,并且在正则之前。
location ~ 正则表达式
~ 开头表示区分大小写的正则匹配。
location ~* 正则表达式
~*开头表示不区分大小写的正则匹配。
location /uri地址
不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
location /
通用匹配,拦截所有,但是优先级最低,只有前面都没有被拦截的情况下,才会被拦截到这里
8、流量限速
8.1、limit_rate
- 语法:limit_rate rate;
- 向客户端传送响应的速率限制。参数rate的单位是字节/秒
- nginx按连接限速,如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。
- 默认值:limit_rate 0;
- 关闭限速
- 作用域:
- http
- server
- location
- if
- in
- location
8.2、limit_rate_after
- 语法:limit_rate_after size;
- 设置不限速传输的响应大小,当传输量大于此值时,超出部分将限速传送。
- 默认值:limit_rate_after 0;
- 作用域
- http
- server
- location
- if
- in
- location
8.3、案例
location / {
root html;
limit_rate_after 3m;
limit_rate 20k;
}
9、并发连接数限制
9.1、limit_conn_zone
- 语法: limit_conn_zone zone_name $variable the_size
- 本指令定义了一个数据区,里面记录会话状态信息。
- variable:定义判断会话的变量
- the_size:定义记录区的总容量。
- 默认值: no
3 作用域: http
9.2、limit_conn
- 语法:limit_conn zone_name the_size
- 指定一个会话最大的并发连接数。
- 当超过指定的最发并发连接数时,服务器将返回 “Service unavailable” (503)
- 默认值:no
- 作用域:
- http
- server
- location
9.3、案例
http {
limit_conn_zone $binary_remote_addr zone=one:10m;
...
server {
...
location /seven/ {
limit_conn one 1;
.....
}
- 定义一个叫"one"的记录区。
- 总容量为 10M,以变量$binary_remote_addr作为会话的判断基准(即一个地址一个会话)。
- 限制/seven/目录下,一个会话只能进行一个连接。
- /seven/目录下,一个IP只能发起一个连接,超过一个连接,一律返回503。
10、gzip压缩
- 将要传输的数据压缩。
- 降低数据传输的时间。
10.1、gzip on|off
- 开启或者关闭gzip模块
- 默认: off
10.2、gzip_static on|off
- 对静态文件的处理模块,该模块可以读取预先压缩的gz文件,这样可以减少每次请求进行gzip压缩的CPU资源消耗。
- on
- nginx首先检查是否存在请求静态文件的gz结尾的文件,如果有则直接返回该gz文件内容。
- 为了要兼容不支持gzip的浏览器,启用gzip_static模块就必须同时保留原始静态文件和gz文件。这样的话,在有大量静态文件的情况下,将会大大增加磁盘空间。我们可以利用nginx的反向代理功能实现只保留gz文件。
10.3、gzip_comp_level 4
- gzip压缩比/压缩级别
- 压缩级别 1-9,级别越高压缩率越大,当然压缩时间也就越长(传输快但比较消耗cpu)
- 默认值:1(建议选择为4)
10.4、gzip_buffers 4 16k`
- 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。
- 原始数据大小以16k为单位的4倍申请内存。
- 默认:是申请跟原始数据相同大小的内存空间去存储gzip压缩结果
10.5、gzip_types mime-type [mime-type ...]
-
压缩类型,匹配MIME类型进行压缩
-
默认值: gzip_types text/html (默认不对js/css文件进行压缩)
-
不能用通配符 text/*
-
无论是否指定,text/html默认已经压缩,设置哪压缩种文本文件可参考 conf/mime.types
10.6、gzip_min_length 1k
- 设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
- 建议设置成大于1k的字节数,小于1k可能会越压越大。
- 即: gzip_min_length 1024
- 建议设置成大于1k的字节数,小于1k可能会越压越大。
- 默认值: 0 ,不管页面多大都压缩
10.7、gzip_http_version 1.0|1.1
- 识别http的协议版本,只有该版本的才进行gzip压缩
- 默认值: 1.1(就是说对HTTP/1.1协议的请求才会进行gzip压缩)
- 早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。
- 99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可。
- 假设我们使用的是默认值1.1,如果我们使用了proxy_pass进行反向代理,
- 那么nginx和后端的upstream server之间是用HTTP/1.0协议通信的
- 如果我们使用nginx通过反向代理做Cache Server,而且前端的nginx没有开启gzip,同时,我们后端的nginx上没有设置gzip_http_version为1.0,那么Cache的url将不会进行gzip压缩
10.8、gzip_proxied[off|expired|nocache|nostore|private|no_last_modified|no_etag|auth|any] ...
- Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的header头。
- 参数说明
0. off
1. 关闭所有的代理结果数据的压缩
2. 默认值- expired
- 启用压缩,如果header头中包含"Expires"头信息
- no-cache
- 启用压缩,如果header头中包含"Cache-Control:no-cache"头信息
- no-store
- 启用压缩,如果header头中包含"Cache-Control:no-store"头信息
- private
- 启用压缩,如果header头中包含"Cache-Control:private"头信息
- no_last_modified
- 启用压缩,如果header头中不包含"Last-Modified"头信息
- no_etag-启用压缩
- 如果header头中不包含"ETag"头信息
- auth-启用压缩
- 如果header头中包含"Authorization"头信息
- any
- 无条件启用压缩
- expired
10.9、gzip_varyon
- 根据客户端的HTTP头来判断,是否需要压缩
- 和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩
11、include
可以在nginx的任意位置加入include。
include 会读取对应的配置到指定位置。
11.1、格式
include file | *;
file:一个或多个文件的路径,路径之间可以用空格分隔。如果是通配符(如*.conf),则匹配所有符合条件的文件。*:如果仅使用*,Nginx会尝试包含同一目录下的所有文件
11.2、案例
nginx.conf 配置
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location = /50x.html {
root html;
}
}
#在这个位置加载内容,读取nginx2.conf的内容,写到这个位置
include nginx2.conf;
}
nginx.conf2 配置
server {
listen 8081;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
最终效果
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location = /50x.html {
root html;
}
}
#在这个位置加载内容,读取nginx2.conf的内容,写到这个位置
server {
listen 8081;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}
12、其他
12.1、server_names_hash_bucket_size 128;
- 用于指定
名称哈希表的大小。 - 主要在处理大量服务器名称(例如,在反向代理或负载均衡配置中)时非常有用,因为它决定了哈希表桶的数量,进而影响哈希冲突的概率和性能。
- 性能:合适的
server_names_hash_bucket_size可以减少哈希冲突,从而提高 Nginx 处理请求的效率。
12.2、client_header_buffer_size 16k
- 用于设置请求头的缓冲区大小
- 如果客户端发送的请求头过大,超过了设置的缓冲区大小,Nginx 会返回一个错误(如 “413 Request Entity Too Large” 或 “Request Header Or Cookie Too Large”)。在设置 client_header_buffer_size 时,需要根据客户端请求头的实际情况进行调整,以确保能够容纳最大的请求头。
12.3、client_body_buffer_size 512k;
用于设置请求体的缓冲区大小
12.4、client_max_body_size 1000m;
用于限制请求体的最大大小
12.5、large_client_header_buffers 4 32k;
- 设置处理大型客户端请求头的缓冲区数量和每个缓冲区的大小
- 当客户端发送的请求头过大,超过了 client_header_buffer_size 指令设置的缓冲区大小时,Nginx 会使用
large_client_header_buffers指令设置的缓冲区来处理这些大型请求头。这个指令允许你指定多个缓冲区,以及每个缓冲区的大小,从而确保 Nginx 能够处理更大的请求头。 - 4:缓冲区的数量。
- 32k:每个缓冲区的大小。
12.6、server_tokens off
- 用于控制Nginx服务器响应头中 Server 字段显示的Nginx版本信息的详细程度。
- off:
- 不会显示Nginx的具体版本号,只会显示 nginx 字符串
- 好处:避免攻击者通过识别Nginx的版本来利用已知的特定版本的漏洞
更多推荐

所有评论(0)