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
相关推荐
睡不醒的猪儿9 小时前
Nginx 服务优化与防盗链配置方案
运维·nginx
大佐不会说日语~9 小时前
使用 Cloudflare平台 + Docker + Nginx 完成网站 HTTPS 部署实战记录
nginx·docker·https·部署·cloudflare
Knight_AL9 小时前
使用 Nginx 为内网 Java 服务实现 HTTPS
java·nginx·https
坚持学习前端日记10 小时前
Nginx 搭建文件服务器
运维·服务器·nginx
徐同保11 小时前
nginx接口超时,增加接口超时时间
运维·nginx
Benny的老巢21 小时前
Mac上用XAMPP搭建局域网可访问的开发环境,让局域网内其他设备通过域名访问
nginx·macos·apache·xampp·php开发环境
岚天start1 天前
Docker部署NGINX实现服务四层转发方案
服务器·nginx·docker
微凉的衣柜1 天前
Windows Server 使用 Nginx 反向代理实现域名访问内网 Gradio 应用
运维·windows·nginx
上去我就QWER1 天前
什么是反向代理?
后端·nginx
小白冲鸭1 天前
苍穹外卖-前端环境搭建-nginx双击后网页打不开
运维·前端·nginx