# 创建nginx进程 的用户和用户组
user nginx;
# worker 进程数
worker_processes auto;
# worker cpu亲和性
worker_cpu_affinity auto;
# nginx 事件的线程池 需要 --with-threads参数 默认35t 65536queue
thread_pool pool_1 threads=32 max_queue=65536;
# 定时器方案参数,不频繁调用时间函数时可不设定,调优参数
timer_resolution 100ms;
# 设定worker在系统中的优先级 越小优先级越高 -20 - 19
worker_priority -5;
# 工作进程打开文件数指令 需要设置linux系统参数
worker_rlimit_nofile 65535;
# 工作进程关闭等待事件是10s
worker_shutdown_timeout 10s;
# 是否允许主进程进行nginx服务,一般调试使用,默认on,off则只有一个master进程
master_process on;
# 是否以后台进程进行,docker需要设置成off docker容器中只有一个进程运行
daemon on;
# 正则表达式匹配加速,需搭配模块pcre-jit
pcre_jit off;
# 互斥锁文件,在accept_mutex开启时使用
lock_file logs/nginx.lock;
# nginx奔溃时文件存储位置
working_directory logs;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
# 默认使用Linux epoll https://nginx.org/en/docs/events.html
use epoll;
# 每个worker允许连接的客户端最大连接数 65535
worker_connections 1024;
# 事件的互斥锁,默认关闭,采用性能更优的listen指令后的reuseport 套接字分片
accept_mutex off;
# 互斥锁等待事件
accept_mutex_delay 300ms;
# 多请求支持
multi_accept off;
# epoll事件模型下使用aio,单个工作进程未完成异步I/O操作的最大数
worker_aio_requests 128;
}
http {
# 忽略请求头无效属性
ignore_invalid_headers off;
# 请求头中下划线属性是否生效
underscores_in_headers on;
# 请求头缓冲区大小
client_header_buffer_size 2k;
# 超大请求头转移和缓存大小
large_client_header_buffers 10 8k;
# 读取请求头超时时间
client_header_timeout 180s;
# 请求头内存池大小 官网建议无必要调整
request_pool_size 4k;
# 请求体大小 为0时则没有限制
client_max_body_size 100m;
# 请求体缓冲区大小,超出部分会写入磁盘或者部分写入client_body_temp_path设定的文件中
client_body_buffer_size 16k;
# 将请求体写入单个缓存,推荐$request_body时启用该指令
client_body_in_single_buffer off;
# 开启时默认使用缓存,关闭则会使用client_body_temp_path文件,不使用缓存 clean http 请求结束后删除 on 则会保留请求的临时缓存
client_body_in_file_only off;
# 缓存位置,nginx docker镜像默认有配置
client_body_temp_path client_body_temp;
# 请求体超时 返回408
client_body_timeout 120s;
# exact 判断被请求文件的修改时间做精确匹配,则认为缓存有效,当指令为before时 被请求文件的修改时间小于if_modified_since则认为有效
if_modified_since before;
# 判断缓存实体标签,集群下需要关闭
etag off;
# 断点续传时使用
max_ranges 1024;
# 修改错误响应
# error_page 404=200 /enpty.gif;
# error_page /404.html;
# error_page 500 502 503 504 /504.html;
# 设定location内部访问
# error_page 404 @fallback;
# location /@fallback {
# proxy_pass http://backend;;
# }
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
#设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
#监听 127.0.0.1:8000端口
listen 127.0.0.1:8000;
# 监听默认80端口(root权限)
listen 127.0.0.1;
# 监听本子所有IP的8000端口
listen 8000;
# 监听本机所有IP的8000端口
listen *:8000;
listen localhost:8000;
# 监听IPv6的8000端口
listen [::]:8000
# 监听IPv6的回环IP的默认80端口
listen [::1];
#
listen *:8000 default_server fastopen=30 reuseport backlog=1024 so_keepalive=on;
# default_server 当前服务是http指令域端主服务
# fastopen=30 允许不通过三次握手的连接数
# deferred 拒绝空数据连接
# reuseport 套接字分片
# so_keepalive=on 当socket为保持连接时,开启状态检测功能
# 对所有连接开启保持连接机制
keepalive_disable none;
# 保持连接复用请求数
keepalive_requests 1000;
# 保持连接超时指令
keepalive_timeout 75s;
# 保持连接时最快发送数据
tcp_nodelay on;
# 主机名+
server_name "ipisces42.com";
server_name example.com .example.com;
# 泛域名的使用
server_name www.example.;
# 多个后缀域名的使用server_name
www.example.com ~^www.example.com$;
# 正则表达式匹配
# 正则匹配变量的场景
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
# 正则匹配为变量的场景
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
}
# 多级错误跳转指令
http {
proxy_intercept_errors on;
# 当上游服务器返回非200状态码时,返回代理服务器处理
recursive_error_pages on;
# 启用多级错误跳转功能
location / {
error_page 404 = @fallback;
# 当前URL请求为404时执行内部请求@fallback
}
location @fallback {
proxy_pass http://backend;
# 当前所有请求代理到上游服务器backend
error_page 502 = @upfallback;
# 当上游服务器返回502状态码时,执行内部请求@upfallback
}
location @upfallback {
proxy_pass http://newbackend; # 当前的所有请求代理到上游服务器newbackend
}
}
http {
# 是否在响应体中标识nginx版本号
server_tokens off;
# location 匹配语法
# 无视大小写匹配
location /images {
root /data/web;
}
# 大小写敏感匹配
location = /images {
root /data/web;
}
}
http {
# 合并空斜线指令
merge_slashes off;
#跳转主机名 需要查询资料再使用
server_name_in_redirect on;
# 跳转端口指令
port_in_redirect on;
# 绝对跳转指令
absolute_redirect off;
}
http {
# rewrite指令日志
rewrite_log off;
# 未初始化变量告警日志记录
uninitialized_variable_warn off;
# last:执行完当前重写规则跳转到新URI后继续执行后续操作
# break:执行完当前重写规则,跳转到新的URI后不再执行后续操作
# redirect: 重定向
# permanent:永久重定向
rewrite ^/users/(.*)$ /show?user=$1 last;
}
http {
# 提前预读
read_ahead 32k;
# 打开文件缓存指令
open_file_cache max=1000 inactive=20s;
# 是否缓存错误
open_file_cache_errors on;
# 打开文件最小访问次数
open_file_cache_min_uses 2;
# 打开文件缓存有效性检查时间
open_file_cache_valid 30s;
# 零复制
sendfile on;
# 数据大于最大报文长度才会使用网络传输
#tcp_nopush on;
# 零复制最小传输限制指令
sendfile_max_chunk 1m;
# 直接I/O读取指令,跳过内核读取,适合大文件读取
directio 5m;
# 4k对齐
directio_alignment 4096;
# 适用于大文件的输出场景
output_buffers 2 32k;
}
# 开启异步文件I/O 必须搭配directio
http {
aio on; # 启用异步I/O
directio 2m; # 当文件大小大于2M时,启用直接读取模式
directio_alignment 4096; # 与当前文件系统对齐
output_buffers 3 128k; # 输出缓冲区为384K
sendfile on; # 小于2M的文件用零复制方式处理
sendfile_max_chunk 1m; # 零复制时最大传输大小为1M
tcp_nopush on; # 零复制时启用最小传输限制功能
thread_pool pool_1 threads 16; # 开启线程池
aio threads =pool_1
aio_write on;
send_timeout 20s;
postpone_output 2048; # 延迟发送
chunked_transfer_encoding off;# 分段传输编码指令
}
http {
# 延迟关闭控制指令
lingering_close always;
# 延迟关闭处理时间
lingering_time 60s;
# 延迟关闭超时时间
lingering_timeout 10s;
# 重置超时连接
reset_timedout_connection on;
}
http {
resolver 192.168.2.11 valid=30s;
#全局域名解析服务器为 192. 168. 2. 11, 30s更新一次 DNS缓存
resolver_timeout 10s;
#域名解析超时时间为 10s
variables_hash_max_size 1024;
# Nginx变量的 hash表的大小为 1024字节
variables_hash_bucket_size 64;
# Nginx变量的 hash表的哈希桶的大小是 64字节
types_hash_max_size 1024;
# MIME类型映射表哈希表的大小为 1024字节
types_hash_bucket_size 64;
# MIME类型映射表哈希桶的大小是 64字节 #请求解析, HTTP全局有效
ignore_invalid_headers on;
#忽略请求头中无效的属性名
underscores_in_headers on;
#允许请求头的属性名中有下划线“_”
client_header_buffer_size 2k;
#客户请求头缓冲区大小为 2KB
large_client_header_buffers 4 16k;
#超大客户请求头缓冲区大小为 64KB
client_header_timeout 30s;
#读取客户请求头的超时时间是 30s
request_pool_size 4k;
#请求池的大小是 4K
merge_slashes on;
#当 URI中有连续的斜线时做合并处理
server_tokens off;
#当返回错误信息时,不显示 Nginx服务的版本号信息
msie_padding on;
#当客户端请求出错时,在响应数据中添加注释
subrequest_output_buffer_size 8k;
#子请求响应报文缓冲区大小为 8KB
lingering_close on;
# Nginx主动关闭连接时启用延迟关闭
lingering_time 60s;
#延迟关闭的处理数据的最长时间是 60s
lingering_timeout 5s;
#延迟关闭的超时时间是 5s
reset_timedout_connection on;
#当 Nginx主动关闭连接而客户端无响应时,
#在连接超时后进行关闭
log_not_found on;
#将未找到文件的错误信息记录到日志中
log_subrequest on;
#将子请求的访问日志记录到访问日志中
error_page 404 /404.html;
#所有请求的 404状态码返回 404. html文件的数据
error_page 500 502 503 504 /50x.html;
#所有请求的 500、 502、 503、 504状态码返回 50 ×. html文件 #的数据
server_names_hash_max_size 1024;
#服务主机名哈希表大小为 1024字节
server_names_hash_bucket_size 128;
#服务主机名哈希桶大小为 128字节
server {
#监听本机的 8000端口,当前服务是 http指令域的主服务,开启 fastopen功能并限定最大队列数是
# 30,拒绝空数据连接, Nginx工作进程共享 socket监听端口,当请求阻塞时挂起队列数是 1024
#个,当 socket为保持连接时,开启状态检测功能
listen *:8000 default_server fastopen=30 deferred reuseport backlog=1024 so_keepalive=on;
server_name a.nginxbar.com b.nginxtest.net c.nginxbar.com a.nginxbar.com;
#保持链接配置
keepalive_disable msie6;
#对 MSIE6版本的客户端关闭保持连接机制
keepalive_requests 1000;
#保持连接可复用的 HTTP连接为 1000个
keepalive_timeout 60s;
#保持连接空置超时时间为 60s
tcp_nodelay on;
#当处于保持连接状态时,以最快的方式发送数据包 #本地文件相关配置
root /data/website;
#当前服务对应本地文件访问的根目录是/data/website
disable_symlinks off;
#对本地文件路径中的符号链接不做检测 #静态文件场景
location / {
server_name_in_redirect on;
#在重定向时,拼接服务主机名
port_in_redirect on;
#在重定向时,拼接服务主机端口
if_modified_since exact;
#当请求头中有 if_ modified_ since属性时, #与被请求的本地文件修改时间做精确匹配处理
etag on;
#启用 etag功能
msie_refresh on;
#当客户端是 msie时,以添加 HTML头信息的方式执行跳转
open_file_cache max=1000 inactive=20s;
#对被打开文件启用缓存支持,缓存元素数最大为 # 1000个,不活跃的缓存元素保存 20s
open_file_cache_errors on;
#对无法找到文件的错误元素也进行缓存
open_file_cache_min_uses 2;
#缓存中的元素至少要被访问两次才为活跃
open_file_cache_valid 60s;
#每 60s对缓存元素与本地文件进行一次检查
}
#上传接口的场景应用
location /upload {
alias /data/upload;
#将 upload的请求重定位到目录/data/upload
limit_except GET {
#对除 GET以外的所有方法进行限制
allow 192.168.100.1;
#允许 192. 168. 100. 1执行所有请求方法
deny all;
#其他 IP只允许执行 GET方法
}
client_max_body_size 200m;
#允许上传的最大文件大小是 200MB
client_body_buffer_size 16k;
#上传缓冲区的大小是 16KB
client_body_in_single_buffer on;
#上传文件完整地保存在临时文件中
client_body_in_file_only off;
#不禁用上传缓冲区
client_body_temp_path /tmp/upload 1 2;
#设置请求体临时文件存储目录
client_body_timeout 120s;
#请求体接收超时时间为 120s
}
#下载场景应用
location /download {
alias /data/upload;
#将 download的请求重定位到目录/data/upload
types{}
default_type application/octet-stream;
#设置当前目录所有文件默认 MIME类型为 # application/octet-stream
try_files $uri @nofile;
#当文件不存在时,跳转到 location @nofile
sendfile on;
#开启零复制文件传输功能
sendfile_max_chunk 1M;
#每个 sendfile调用的最大传输量为 1MB
tcp_nopush on;
#启用最小传输限制功能
aio on; #启用异步传输
directio 5M;
#当文件大于 5MB时以直接读取磁盘方式读取文件
directio_alignment 4096;
#与磁盘的文件系统对齐
output_buffers 4 32k;
#文件输出的缓冲区为 128KB
limit_rate 1m;
#限制下载速度为 1MB
limit_rate_after 2m;
#当客户端下载速度达到 2MB时,进入限速模式
max_ranges 4096;
#客户端执行范围读取的最大值是 4096B
send_timeout 20s;
#客户端引发传输超时时间为 20s
postpone_output 2048;
#当缓冲区的数据达到 2048B时再向客户端发送
chunked_transfer_encoding on;
#启用分块传输标识
}
location @nofile {
index nofile.html;
}
location = /404.html {
internal;
}
location = /50x.html {
internal;
}}}
```
Q.E.D.