nginx常用命令

从源码编译安装

下载nginx-1.26.3.tar.gz并解压

shell 复制代码
tar zxvf nginx-1.26.3.tar.gz

进入解压后的目录nginx-1.26.3,configure为安装脚本,输入*./configure*命令会提示缺少依赖,安装对应依赖

shell 复制代码
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel

通过configure安装

shell 复制代码
./configure --prefix=/home/nginx

prefix指定nginx安装目录,默认为/usr/local/nginx,更多参数查看nginx.org/en/docs/con...

执行makemake install安装完成

启动nginx

进入到nginx安装目录的sbin目录下

  • ./nginx 启动
  • ./nginx -s stop 快速关闭
  • ./nginx -s quit 平稳关闭,在退出前完成已接受的请求
  • ./nginx -s reload 重新加载nginx配置文件,不重启服务

将nginx创建为服务文件并设置为系统服务,/etc/systemd/system/usr/lib/systemd/system目录下

shell 复制代码
vi /usr/lib/systemd/system/nginx.service
shell 复制代码
[Unit]
Description=Nginx HTTP Server
After=network.target  # 网络启动后再启动 Nginx

[Service]
Type=forking  # Nginx 以 fork 方式运行(后台进程)
PIDFile=/home/nginx/logs/nginx.pid  # PID 文件路径(必须与 Nginx 配置一致)
ExecStartPre=/home/nginx/sbin/nginx -t #检查配置文件
ExecStart=/home/nginx/sbin/nginx  # 启动命令
ExecReload=/home/nginx/sbin/nginx -s reload  # 重载配置命令
ExecStop=/home/nginx/sbin/nginx -s stop  # 停止命令(优雅停止设置为quit)
PrivateTmp=true  # 为服务分配独立的临时目录,增强安全性

[Install]
WantedBy=multi-user.target  # 声明多用户模式下开机自启

重载systemd配置文件

shell 复制代码
systemctl daemon-reload

启动开机自启

shell 复制代码
systemctl enable nginx.service
shell 复制代码
systemctl start nginx   #启动
systemctl stop nginx  	#停止
systemctl status nginx  #运行状态
systemctl reload nginx  #重新加载配置
systemctl retart nginx  #重启

常用配置说明

nginx有一个master进程以及多个worker进程,master加载配置文件和维护worker进程,worker处理请求。

ngx_core_module

worker进程使用的用户,group省略时与user相同

nginx 复制代码
#语法
user user [group];
#默认值
user nobody nobody;
#位置:main

主进程id存储位置

nginx 复制代码
#语法
pid file;
#默认值
pid logs/nginx.pid;
#位置:main

错误日志配置,file表示路径,level可选debuginfonoticewarnerrorcritalertemerg

nginx 复制代码
#语法
error_log file [level];
#默认值
error_log logs/error.log error;
#位置:main, http, mail, stream, server, location

工作进程可同时打开的最大连接数,包含与代理服务器和客户端的连接

nginx 复制代码
#语法
worker_connections number;
#默认值
worker_connections 512;
#位置:events

工作进程的数量,auto会自动检测CPU核数

nginx 复制代码
#语法
worker_processes number | auto;
#默认值
worker_processes 1;
#位置:main

ngx_http_core_module

server

一个nginx 可以有多个server 块,每个server_name可以有多个域名,空格分隔,接收请求时,先通过ip和端口 匹配listen,再通过请求头中的HOST 确定到哪个server ,未匹配到时第一个server 为默认服务器,可以通过在listen 中添加 default_server 指定默认服务器。请求头中没有HOST ,将匹配server_name ""server_name _表示不匹配

server_name、listen

listen监听服务器**[ip:]端口**的请求,忽略时监听所有ip

server_name 配置通过本机host文件解析或远端DNS解析的域名*为通配符

基于名称的虚拟服务器

nginx 复制代码
server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}
server {
    listen      80;
    server_name "";
    return      444;
}

基于名称和IP的虚拟服务器

nginx 复制代码
server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}
server {
    listen      192.168.1.1:80;
    server_name example.net www.example.net;
    ...
}

client_body_buffer_size

httpserverlocation

读取客户端请求体的内存缓冲区大小,超出部分写入临时文件

nginx 复制代码
#语法
client_body_buffer_size size;
#默认值
client_body_buffer_size 8k|16k;
#位置:http、server、location

client_body_in_file_only

将客户端请求体整个保存到文件中

nginx 复制代码
#语法
client_body_in_file_only on | clean | off;
#默认值
client_body_in_single_buffer off;
#位置:http、server、location
  • on 将请求体保存在临时文件中,请求处理完成后不删除
  • clean 将请求体保存在临时文件中,请求处理完成后删除
  • off 小请求体存缓存区,大请求体存临时文件,处理后自动删除临时文件

client_body_in_single_buffer

是否将客户端发送的请求体完整存储在单个内存缓冲区中,当 client_body_in_single_buffer on 且请求体未超过缓冲区大小时,$request_body 可直接获取完整内容;否则可能为空或不完整。

nginx 复制代码
#语法
client_body_in_single_buffer on | off;
#默认值
client_body_in_single_buffer off;
#位置:http, server, location

client_body_temp_path

请求体储存时的临时文件目录

nginx 复制代码
#语法
client_body_temp_path path [level1 [level2 [level3]]];
#默认值
client_body_temp_path client_body_temp;
#位置:http, server, location

level对应子目录,最多可有三级,每个level均取值为1-3,表示该层级目录数,如client_body_temp_path client_body_temp 1 2 ,表示一级目录有16个,二级目录有16²个目录

client_body_timeout

读取客户端请求体的超时时间。仅设置在两次连续读取操作之间的时间段内,而不是整个请求体的传输时间,超时显示408

nginx 复制代码
#语法
client_body_timeout time;
#默认值
client_body_timeout 60s;
#位置:http, server, location

client_header_buffer_size

读取客户端请求头的内存缓冲区大小,超过缓冲区大小则根据large_client_header_buffers设置处理

nginx 复制代码
#语法
client_header_buffer_size size;
#默认值
client_header_buffer_size 1k;
#位置:http, server

client_header_timeout

读取客户端请求头的超时时间。如果客户端在此时间内未传输完整请求头,请求将终止并返回 408(请求超时)错误

nginx 复制代码
#语法
client_header_timeout time;
#默认值
client_header_timeout 60s;
#位置:http, server

client_max_body_size

客户端氢气体的最大大小,超过返回413错误,0表示禁用对请求体大小的检查

nginx 复制代码
#语法
client_max_body_size size;
#默认值
client_max_body_size 1m;
#位置:http, server, location

location

nginx 复制代码
#语法
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
#位置:server, location

优先级从高到低:

  1. = 精确匹配
  2. ^~ 特殊前缀匹配,一旦匹配成功,会终止后续正则匹配检查
  3. ~ 正则匹配区分大小写
  4. ~* 正则匹配不区分大小写,正则表达式第一个匹配时会直接使用其配置并终止后续搜索
  5. 普通前缀匹配,遵循最长匹配原则
  6. @name不能嵌套,自定义名称一般用于重定向

location请求若由proxy_pass处理且指定了URI,匹配部分将会被替换并拼接到proxy_pass后面,location请求对应的静态资源相对于当前locationroot目录下

keepalive

复用已建立的 TCP 连接处理多个 HTTP 请求 / 响应,避免每次请求都重新建立和关闭 TCP 连接,从而减少网络开销、提升通信效率。

客户端
nginx 复制代码
#语法
keepalive_disable none | browser ...;
#默认值
keepalive_disable msie6;
#位置:http, server, location
  • none 启用所有浏览器长连接
  • msie6 禁用IE6的长连接(默认
  • safari 禁用safari长连接

一个长连接的总时长,达到时间时关闭连接

nginx 复制代码
#语法
keepalive_time time;
#默认值
keepalive_time 1h;
#位置:http, server, location

一个长连接在该时间内没接收到请求,则会关闭该请求,0表示禁用keepalive

nginx 复制代码
#默认值
keepalive_timeout timeout [header_timeout];
#默认值
keepalive_timeout 75s;
#位置:http, server, location

一个长连接可处理的最大请求数量

nginx 复制代码
#语法
keepalive_requests number;
#默认值
keepalive_requests 1000;
#位置:http, server, location
upstream

设置与后端上游服务器的空闲长连接池

nginx 复制代码
#语法
keepalive connections;
#位置:upstream

空闲长连接池的最大数量,修改负载均衡方法时该指令需在其之后,对于http需在location中设置

nginx 复制代码
location /http/{
    proxy_http_version 1.1;#HTTP/1.0 默认不支持长连接,需客户端显式发送Connection:keep-alive 头
    proxy_set_header Connection "";#清除客户端请求中的 Connection 头,避免后端服务器关闭长连接
}

keepalive_requests 一个长连接可处理的最大请求数量

keepalive_time 一个长连接的总时长,达到时间时关闭连接

send_timeout

nginx向客户端传输响应的超时时间,仅在两次连续的写操作之间,不是整个响应

nginx 复制代码
#语法
send_timeout time;
#默认值
send_timeout 60s;
#位置:http, server, location

ETag

启用或禁用响应头中的ETag,基于资源的大小时间等生成,用于客户端缓存判断请求的资源是否发生更改,请求时响应头会返回ETage,再次请求时服务器对比请求头中的If-None-Modified与服务端的ETag,若未修改返回状态码304,常与Last-Modified配合使用

nginx 复制代码
#语法
etag on | off;
#默认值
etag on;
#位置:http, server, location

if_modified_since

服务器如何比较请求头中的If-Modified-Since和服务器资源的Last-Modified

nginx 复制代码
#语法
if_modified_since off | exact | before;
#默认值
if_modified_since exact
#位置:http, server, location

off 不比较,始终视为已修改

exact 精确匹配

before 响应的时间小于等于请求头中的If-Modified-Since的时间

sendfile

用于优化静态文件传输性能的核心配置,其底层依赖操作系统的sendfile系统调用,主要作用是减少数据在用户空间与内核空间之间的拷贝次数

nginx 复制代码
#语法
sendfile on | off;
#默认值
sendfile off;
#位置:http, server, location, if in location

传统传输文件流程:

  1. 操作系统从磁盘读取文件数据,存入内核缓冲区(内核空间);
  2. 数据从内核缓冲区拷贝到应用程序缓冲区(用户空间,如 Nginx 进程的内存);
  3. 数据再从应用程序缓冲区拷贝到Socket 缓冲区(内核空间,用于网络发送);
  4. 最终从 Socket 缓冲区通过网络发送给客户端

使用sendfile的流程:

  1. 磁盘数据读入内核缓冲区;
  2. 内核直接将缓冲区数据 "移交" 给 Socket 缓冲区(通过指针映射,而非实际拷贝);
  3. 数据从 Socket 缓冲区发送到客户端。

open_file_cache

缓存文件的元数据

nginx 复制代码
#语法
open_file_cache off;
open_file_cache max=N [inactive=time];
#默认值
open_file_cache off;
#位置:http, server, location

off关闭

max设置缓存的最大元素数量

inactive移除指定时间内未被访问的缓存

open_file_cache_errors

控制是否缓存 文件错误信息

nginx 复制代码
#语法
open_file_cache_errors on | off;
#默认值
open_file_cache_errors off;
#位置:http, server, location

open_file_cache_min_uses

open_file_cacheinactive 时间窗口内,一个文件至少被访问多少次,其元数据才会被保留在缓存中

nginx 复制代码
#语法
open_file_cache_min_uses number;
#默认值
open_file_cache_min_uses 1;
#位置:http, server, location

open_file_cache_valid

设置缓存中元数据的定期验证间隔,定期(每间隔该时间)验证缓存中的元数据是否与磁盘实际文件一致并修改

nginx 复制代码
#语法
open_file_cache_valid time;
#默认值	
open_file_cache_valid 60s;
#默认值

error_page

根据响应码跳转到相应错误页

nginx 复制代码
#语法
error_page code ... [=[response]] uri;
#位置:http, server, location, if in location

code响应码,多个用空格分隔

=response更改响应码为response响应码

uri指本地静态文件路径、外部地址、内部命名 location如自定义@name

nginx 复制代码
error_page 500 502 503 504 /50x.html;

# 精确匹配50x.html 限制 /50x.html 仅内部访问
location = /50x.html {
    internal;  # 客户端直接请求 example.com/50x.html 会返回 404
    root /usr/share/nginx/html;  # 明确指定文件所在目录(可选,若继承server的root则可省略)
}

limit_rate

限制对客户端的响应速率,每秒的字节数,如1k表示1k/s,针对的是客户端的一个请求,客户端同时打开两个连接,总速率将是限制的两倍,0表示不限制

nginx 复制代码
#语法
limit_rate rate;
#默认值
limit_rate 0;
#位置:http, server, location, if in location

可结合limit_rate_after(传输一定字节后限速)

ngx_http_proxy_module

proxy_bind

指与反向代理服务器连接时本地的ip和端口,off取消从上一级继承的proxy_bind的配置,transparent指定为非本机ip,如$remote_addr指定为客户端的真实ip地址(需要系统层面配置支持)

nginx 复制代码
#语法
proxy_bind address [transparent] | off;
#位置:http, server, location

proxy_pass

proxy_pass设置反向代理地址,后可配置多个地址,空格隔开,也可配置为server_group

nginx 复制代码
#语法
proxy_pass URL;
#位置:location, if in location, limit_except

proxy_pass 中指定了URI,则location 中匹配的URI部分将被替换为proxy_pass的部分再拼接到后面进行反向代理。

proxy_pass 中未指定URI,则location 中的URI将被拼接到proxy_pass中进行反向代理。

proxy_buffering

启用或禁用代理服务器响应的缓存区

nginx 复制代码
#语法
proxy_buffering on | off;
#默认值
proxy_buffering on;
#位置:http, server, location

启用时将响应保存到proxy_buffer_sizeproxy_buffers设置的缓冲区中,超过内存缓冲区大小的部分将存在proxy_max_temp_file_sizeproxy_temp_file_write_size的临时文件中

禁用时Nginx 就立即发给客户端,不读取响应

proxy_buffer_size

读取反向代理服务器响应的第一部分的内存缓冲区大小,通常为响应头

nginx 复制代码
#语法
proxy_buffer_size size;
#默认值,取决于系统
proxy_buffer_size 4k|8k;
#位置:http, server, location

proxy_buffers

读取代理服务器响应体 的内存缓冲区大小,接收响应时先将响应体存入内存缓冲区,超出的部分存入临时文件proxy_max_temp_file_size

nginx 复制代码
#语法
proxy_buffers number size;
#默认值
proxy_buffers 8 4k|8k;
#位置:http, server, location

number 缓冲区数量

size 缓冲区大小

proxy_busy_buffers_size

读取响应的缓冲区能用于向客户端发送响应的缓冲区总大小(这些缓冲区无法被用于读取代理服务器响应)

nginx 复制代码
#语法
proxy_busy_buffers_size size;
#默认值
proxy_busy_buffers_size 8k|16k;
#位置:http, server, location

proxy_set_header

向反向代理服务器中重新定义或追加请求头

nginx 复制代码
#语法
proxy_set_header field value;
#默认值
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
#位置:http, server, location

value可以是文本、变量、及其组合

proxy_cache

是否开启对代理服务器的缓存

nginx 复制代码
#语法
proxy_cache zone | off;
#默认值
proxy_cache off;
#位置:http, server, location

zone指定的缓存区域的名称,相同的区域可重复使用,区域名称见proxy_cache_pathkeys_zone

off关闭

proxy_cache_background_update

是否开启:缓存内容过期时,先向客户端返回旧缓存,同时在后台异步更新缓存

nginx 复制代码
#语法
proxy_cache_background_update on | off;
#默认值
proxy_cache_background_update off;
#位置:http, server, location

proxy_cache_bypass

如果指定的变量中至少一个不为非空且不等于0则绕过缓存

nginx 复制代码
#语法
proxy_cache_bypass string ...;
#位置:http, server, location

proxy_cache_methods

缓存对应请求方法的响应

nginx 复制代码
#语法
proxy_cache_methods GET | HEAD | POST ...;
#默认值
proxy_cache_methods GET HEAD;
#位置:http, server, location

proxy_cache_purge

如果指定的变量中至少一个不为非空且不等于0则清除缓存

nginx 复制代码
#语法
proxy_cache_purge string ...;
#位置:http, server, location

proxy_cache_key

缓存的键名,识别不同请求的唯一标识

nginx 复制代码
#语法
proxy_cache_key string;
#默认值
proxy_cache_key $scheme$proxy_host$request_uri;
#位置:http, server, location

proxy_cache_lock

开启时,若资源未缓存,只有一个会请求后端并缓存,其余有相同缓存键的请求进入等待队列阻塞直至从缓存中获取

nginx 复制代码
#语法
proxy_cache_lock on | off;
#默认值
proxy_cache_lock off;
#位置:http, server, location

proxy_cache_lock_age

指定时间内向代理服务器发送请求并缓存未完成时,进入等待队列有相同缓存键的请求会再发一个请求

nginx 复制代码
#语法
proxy_cache_lock_age time;
#默认值
proxy_cache_lock_age 5s;
#位置:http, server, location

proxy_cache_lock_timeout

请求上锁的超时时间,单个请求超过该时间时,会发送给代理服务器,但不缓存响应

nginx 复制代码
#语法
proxy_cache_lock_timeout time;
#默认值
proxy_cache_lock_timeout 5s;
#位置:http, server, location

proxy_cache_min_uses

达到指定的请求次数后缓存响应

nginx 复制代码
#语法
proxy_cache_min_uses number;
#默认值
proxy_cache_min_uses 1;
#位置:http, server, location

proxy_cache_path

设置缓存位置及其他参数,proxy_cache_path可多次定义

nginx 复制代码
#语法
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
#位置:http

缓存文件名是缓存键名经过MD5后的结果

path缓存文件的目录

level缓存的没目录层级,层级范围是1:3最多三层,每层用只能是1或2,代表几个16进制,如1:2:2表示三层,分别为1616*1616*16个目录

use_temp_path是否先将缓存写入临时文件,再重命名为缓存文件,若临时文件和缓存文件不在同一个文件系统,就不是重命名操作,设置为on时,临时文件位置由proxy_temp_path指定,off临时文件直接放在缓存目录中

keys_zone定义代理服务器的缓存区域,即proxy_cache指定的zone,存在内存中

inactive指定时间内未被访问 的缓存数据,无论是否过期,都会移除,默认10分钟

proxy_cache_revalidate

缓存过期时允许发送If-Modified-SinceIf-None-Match请求头重新验证缓存是否更改,仅更改才会拉取,否则复用

nginx 复制代码
#语法
proxy_cache_revalidate on | off;
#默认值
proxy_cache_revalidate off;
#位置:http, server, location

proxy_cache_use_stale

后端服务异常时是否使用过期缓存

nginx 复制代码
#语法
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
#默认值
proxy_cache_use_stale off;
#位置:http, server, location

error后端返回任何错误(如连接拒绝、重置等)时使用过期缓存

proxy_cache_valid

设置不同响应代码的缓存有效期时间

nginx 复制代码
#语法
proxy_cache_valid [code ...] time;
#位置:http, server, location

若仅指定了时间,缓存的响应码为200、301、302,any表示任何相应

ngx_http_upstream_module

upstream

定义一组服务器。服务器可以监听不同的端口

nginx 复制代码
#语法
upstream name { ... }
#位置:http
nginx 复制代码
upstream dynamic {
    server backend1.example.com      weight=5;
    server backend2.example.com:8080;
}
server {
    location / {
        proxy_pass http://dynamic;
        health_check;
    }
}

格式为:域名/ip[+端口]

nginx 复制代码
#语法
server address [parameters];
#位置:upstream

weight=number 设置服务器权重,默认为1

max_fails=numberfail_timeout时间内最大的失败次数,默认为1,超过后服务视为不可用。

fail_timeout=time 1.失败次数的次序时间;2.服务器被视为不可用的时间段。

负载均衡方式

  • 轮询(默认)

  • hash key 基于key的hash映射,可设置为$request_uri等变量

  • ip_hash 对客户端请求的ip进行hash取余,确保同一客户端的请求始终转发到同一服务器

ngx_http_rewrite_module

rewrite

nginx 复制代码
#语法
rewrite regex replacement [flag];
#位置:server, location, if

使用 PCRE 正则表达式更改请求 URI,不能超过10次,通过引用$1$2...引用URI中的捕获组

flag 参数如下:

last 终止当前locationserver块中的所有配置,根据新 URI 重新匹配location(内部跳转)

break 终止当前块的后续rewrite规则,不重新匹配location,在当前块中继续处理请求

redirect 返回 302 临时重定向(浏览器不会缓存跳转关系),适用于临时调整 URL

permanent 返回 301 永久重定向(浏览器会缓存跳转关系),适用于 URL 永久变更

ngx_http_referer_module

referer

nginx 复制代码
#语法
valid_referers none | blocked | server_names | string ...;
#位置:server, location

指定请求头中的Referer来源,嵌入到 $invalid_referer 变量,允许的来源变量被设为空字符串,否则为1,结合if($invalid_referer)判断是否允许以实现防盗链和请求来源验证

none 允许请求头缺少Referer

blocked 允许请求头的Referer的值被防火墙或代理服务器删除

server_names 允许匹配server块中的server_name域名

自定义字符串 可以在开头或结尾有 *

正则表达式~开始

ngx_http_gzip_module

使用gzip动态压缩响应,减少传输数据

gzip

开启或禁用gzip动态压缩

nginx 复制代码
#语法
gzip on | off
#默认值
gzip off
#位置:http, server, location, if in location

gzip_static

是否启用预压缩直接发送预先压缩好的静态资源的.gz文件

nginx 复制代码
#语法
gzip_static on | off | always;
#默认值
gzip_static off;
#位置:http, server, location

on有预压缩文件且客户端支持gzip,否则返回原文件

off关闭预压缩

always.gz文件时,不论客户端是否支持直接发送预压缩文件

gzip_buffers

设置压缩响应的缓冲区数量和大小,默认情况下,缓冲区大小等于一个内存页,取决于系统

nginx 复制代码
#语法
gzip_buffers number size;
#默认值
gzip_buffers 32 4k|16 8k;
#位置:http, server, location

gzip_comp_level

设置响应的压缩等级,范围为1~9,值越大压缩率越高但越耗费服务器CPU

nginx 复制代码
#语法
gzip_comp_level level;
#默认值
gzip_comp_level 1;
#位置:http, server, location

gzip_disable

当请求头User-Agent中的值与表达式匹配时禁用gzip响应压缩

nginx 复制代码
#语法
gzip_disable regex ...;
#位置:http, server, location

gzip_http_version

设置gzip压缩响应所需的最低http版本,对符合条件的压缩

nginx 复制代码
#语法
gzip_http_version 1.0 | 1.1;
#默认值
gzip_http_version 1.1;
#位置:http, server, location

gzip_min_length

设置启用压缩的响应的最小长度,由Content-Length响应头确定,避免对过小响应压缩

nginx 复制代码
#语法
gzip_min_length length;
#默认值
gzip_min_length 20;
#位置:http, server, location

gzip_proxied

是否对代理服务器的响应进行压缩

nginx 复制代码
#语法
c off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
#默认值
gzip_proxied off;
#位置:http, server, location
  • off对所有代理请求禁用压缩
  • expired响应头包含Expires字段且值为过期时间则启用压缩
  • no-cache响应头包含有Cache-Control:no-cache则启用压缩
  • no-store响应头包含有Cache-Control:no-store则启用压缩
  • private响应头包含有Cache-Control:private则启用压缩
  • no_last_modified响应头不包含Last-Modified字段则启用压缩
  • no_etag响应头不包含ETag则启用压缩
  • auth请求头包含Authorization则启用压缩
  • any对所有代理请求启用压缩

gzip_types

指定对MIME类型的响应进行压缩

nginx 复制代码
#语法
gzip_types mime-type ...;
#默认值
gzip_types text/html;
#位置:http, server, location

gzip_vary

为开启了gzip的响应添加Vary: Accept-Encoding响应头,该响应头用于告诉缓存服务器,当前资源根据客户端请求头中的Accept-Encoding变化,仅gzip on/gzip_static on开启时可用

nginx 复制代码
#语法
gzip_vary on | off;
#默认值
gzip_vary off;
#位置:http, server, location

brotli

比gzip压缩效率更高的压缩算法,仅在https中能用

ngx_http_ssl_module

ssl

httpserverlocation

nginx 复制代码
server {
    listen              443 ssl;
    keepalive_timeout   70;

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
    ssl_certificate     /usr/local/nginx/conf/cert.pem;
    ssl_certificate_key /usr/local/nginx/conf/cert.key;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
}

listen 443 ssl 开启https,默认的端口为443

ssl_certificate ssl证书

ssl_certificate_key ssl私钥

ngx_http_ssi_module

服务端包含,通过特定指令在服务器端合并静态文件、动态内容,再返回给客户端

ssi

开启或禁用

nginx 复制代码
#语法
ssi on | off;
#默认值
ssi off;
#位置:http, server, location, if in location

开启或禁用,根据请求头中的If-Modified-Since与主文件的Last-Modified对比是否更新,并设置响应头Last-Modified

nginx 复制代码
#语法
ssi_last_modified on | off;
#默认值
ssi_last_modified off;
#位置:http, server, location

ssi命令

nginx 复制代码
<!--# include file="footer.html" -->

指定一个文件包含另一个文件,如在html中使用

ngx_http_limit_req_module

请求限流模块,基于漏桶算法(漏桶容量和流出请求速率固定,请求过快会溢出拒绝请求),限制单位时间内来自key标识的请求次数

limit_req_zone

定义一个共享内存区,可配置多个

nginx 复制代码
#语法
limit_req_zone key zone=name:size rate=rate [sync];
#位置:http

key针对限流的key(按什么标识限流),可以包含文本、变量及其组合,如使用变量$binary_remote_addr表示的是客户端的ip地址的二进制形式,占用内存小,$remote_addr客户端ip地址字符串形式,$server_name针对server中的server_name限流

zone定义的共享内存区域,其中name表示区域名称,size表示区域大小如10m,存储统计数据,若存储已满,则会移除最久未使用的,若还是不行则以错误形式终止请求

rate限流速率(漏桶请求流出速率),如10r/s(每秒最多 10 次请求)、60r/m(每分钟最多 60 次,即每秒 1 次)

limit_req

引用limit_req_zone中的共享内存区域对该区块请求生效,可配置多个

nginx 复制代码
#语法
limit_req zone=name [burst=number] [nodelay | delay=number];
#位置:http, server, location

zone引用limit_req_zone对应的区域名称

burst突发请求(即超出请求限制的请求)的缓冲队列大小,超过该队列的请求将以错误形式终止请求,默认为0,针对每个key

nodelayburst队列中请求跳过等待,直接处理,与burst绑定,但不超过rate速率,无nodellay时,排队在一定延迟后进行处理,有nodelay时满足rate的情况下立即处理不延迟

delaynodelay相反,在缓冲队列中的请求,满足rate情况下,一定number延迟后处理

limit_req_dry_run

模拟限流规则的执行逻辑,但不真正拒绝任何请求,仅通过日志记录 "本应被限流" 的请求

nginx 复制代码
#语法
limit_req_dry_run on | off;
#默认值
limit_req_dry_run off;
#位置:http, server, location

limit_req_log_level

控制限流相关日志记录级别

nginx 复制代码
#语法
limit_req_log_level info | notice | warn | error;
#默认值
limit_req_log_level error;
#位置:http, server, location

limit_req_status

限流拒绝时的响应码设置

nginx 复制代码
#语法
limit_req_status code;
#默认值
limit_req_status 503;
c, server, location

ngx_http_limit_conn_module

限制基于key标识的连接数量,处于活跃的TCP连接数(服务器正在处理请求并且请求头已读取完毕的才会计算)

limit_conn_zone

定义一个共享内存区,保存各key的状态,可以包含文本、变量及其组合,可配置多个

nginx 复制代码
#语法
limit_conn_zone key zone=name:size;
#位置:http

key针对限制连接的key

zone定义的共享内存区域

limit_conn

设置key的最大连接数

nginx 复制代码
#语法
limit_conn zone number;
#位置:http, server, location

zonelimit_conn_zone中的zone

number最大连接数

ngx_http_log_module

请求日志,请求结束时记录

access_log

访问日志,每次写入日志都会检查文件是否存在,不存在则不写入

nginx 复制代码
#语法
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
#默认值
access_log logs/access.log combined;
#位置:http, server, location, if in location, limit_except

path日志路径

format日志格式化,格式化配置在log_format中,默认使用combined

buffer启用缓存区,日志暂放在内存缓冲区大小,超过缓冲区大小后写入磁盘,或配置flush使用

gzip开启日志gzip压缩的等级,在写入磁盘之前压缩,1-9

flush日志从缓冲区刷新到磁盘的时间

if如果condition为0或空字符串则不记录日志

log_format

格式化日志

nginx 复制代码
#语法
log_format name [escape=default|json|none] string ...;
#默认值
log_format combined "..."
#位置:http

open_log_file_cache

日志文件描述符缓存

nginx 复制代码
#语法
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
#默认值
open_log_file_cache off;
#位置:http, server, location

其他说明

获取客户端ip

nginx作为代理服务器反向代理后端时,后端无法获取用户ip地址时,增加如下配置:

nginx 复制代码
proxy_set_header X-Forwarded-For $remote_addr;

$remote_addr客户端与nginx连接时的ip地址,若经过多级反向代理,可使用变量$proxy_add_x_forwarded_for,客户端请求头中的 X-Forwarded-For 字段,再加上 $remote_addr 变量的值,两者用逗号分隔。如果客户端请求头中没有 "X-Forwarded-For" 字段,那么 $proxy_add_x_forwarded_for 变量就等于 $remote_addr 变量。

worker_processes

工作进程数,一般配置为物理机CUP核数

worker_connections

一个进程的连接数,包含与反向代理服务器的连接

压缩

gzip动态压缩开启后无法使用sendfile

concat模块

压缩请求数,如将多个css、js、图片等请求合并为一个,git地址github.com/alibaba/ngi...

自动化同步rsync、inotify

inotify监控目录是否有变化,在通过事件执行自动化脚本rsync同步源文件以自动同步源文件

多级缓存

协商缓存

Last-Modified:客户端请求时带上If-Modified-Since请求头,服务器检查文件的last_modify是否能对上,返回响应头Last-Modified响应状态码为304,客户端直接从本地读取

ETag:精度比last-modified 高,请求时携带If-None-Match请求头,返回响应头中含有ETag,状态码也是304

强制缓存

响应头中设置Cache-Control

public响应的数据可以被缓存,客户端和代理端都可以缓存

private可私有缓存,客户端可以缓存,代理不能缓存

no-cache可以使用缓存,但必须发送请求到服务器回源验证

no-store禁用缓存

max-age在浏览器缓存的时间以秒为单位

进程追踪

linux中使用strace

针对客户端ip限流

在http块中,针对客户端ip限流,每分钟30个请求

nginx 复制代码
limit_req_zone $binary_remote_addr zone=limitClient:10m rate=30r/m;

在location中

nginx 复制代码
limit_req zone=limitClient burst=5

传输限速

传输到达10m后限速为1m/s

nginxlimit_rate 复制代码
limit_rate 1m
limit_rate_after 10m

针对客户端ip限制连接数

在http块中,针对客户端ip限制连接数,最大连接数为5

nginx 复制代码
limit_conn_zone $binary_remote_addr zone=limitClient:10m;

在location中

nginx 复制代码
limit_conn limitClient 5
相关推荐
木童6622 小时前
Nginx 深度解析:反向代理与负载均衡、后端Tomcat
linux·运维·nginx
0wioiw03 小时前
跨网络互联技术(Nginx反向代理)
服务器·网络·nginx
先生沉默先4 小时前
Nginx 反向代理学习:单端口统一访问多服务
学习·nginx·arcgis
jiayong2316 小时前
多子系统架构下的Nginx部署策略与最佳实践
运维·nginx·系统架构
叫致寒吧18 小时前
Nginx基于域名的虚拟主机实操案例
运维·服务器·nginx
韩师学子--小倪18 小时前
tcpdump + Wireshark:抓取nginx转发到服务的流量
测试工具·nginx·tcpdump
梁正雄19 小时前
linux服务-Nginx+Tomcat+Redis之Session 共享 - 容器compose
linux·nginx·tomcat
百***86461 天前
服务器部署,用 nginx 部署后页面刷新 404 问题,宝塔面板修改(修改 nginx.conf 配置文件)
运维·服务器·nginx
木童6621 天前
Nginx 深度解析:概念、架构、配置与虚拟主机实战
运维·nginx·架构