设置worker进程的数量:
worker_processes auto; # 自动设置为与CPU核心数量相等
最大打开文件数配置
worker_rlimit_nofile 2000;
一个worker进程最多打开文件句柄数,如果不设置的话,这个值为操作系统的限制(ulimit -a)
事件处理模型配置
events {
use epoll; # 采用epoll模型处理事件,需要根据不同操作系统来分别配置
worker_connections 65535; # 单个worker进程允许的客户端最大连接数
}
如果你的服务器是 Linux 系统:强烈推荐使用 epoll 模型,因为它提供了最佳的性能和并发处理能力。
如果你的服务器是 FreeBSD 系统:可以选择 kqueue 模型。
对于其他系统:你可能需要查看 Nginx 的文档或系统文档,以确定哪个模型最适合你的系统。然而,在大多数情况下,select 或 poll 将是可用的,尽管它们可能不是最高效的选择
开启高效文件传输模式:
sendfile on;
允许操作系统直接将数据从磁盘读取到网络缓冲区中,而不需要先读取到用户空间的缓冲区,再复制到网络缓冲区。这种方式减少了数据在用户空间和内核空间之间的复制次数,从而提高了数据传输的效率。
sendfile on; 是推荐的配置,因为它可以提升性能。然而,在某些特定的网络配置或环境中,如使用某些特定的负载均衡器或防火墙时,可能需要禁用 sendfile 以避免潜在的问题。
高效文件传输模式
tcp_nopush on;
开启此选项表示数据包要累积到一定大小再发送,用于提升数据传输效率,依赖于sendfile打开;
设置TCP_NODELAY:
tcp_nodelay on;
tcp_nodelay on; 指令则与 TCP/IP 协议的 TCP_NODELAY 选项有关。TCP_NODELAY 是一种用于禁用 Nagle 算法的选项。
Nagle 算法是一种用于提高网络效率的算法,它会将小的数据包合并成较大的数据包再发送,以减少网络上的小包数量。
在某些场景下(如实时交互性强的应用),这种合并可能会增加数据传输的延迟。
保持连接时间:
keepalive_timeout 65;
定义了客户端和服务器之间在没有数据传输时,连接可以保持开启状态的最长时间(以秒为单位)。在这段时间内,如果客户端或服务器没有任何数据传输,连接将被视为空闲,并且可能在达到这个超时时间后被关闭。
keepalive_requests 指令,用于设置在一个 keepalive 连接上可以服务的最大请求数。当达到这个限制时,Nginx 也会关闭连接。但默认情况下,这个值被设置为 100
设置客户端请求头的大小限制:
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
当 Nginx 遇到一个比 client_header_buffer_size 指定的缓冲区还要大的请求头时,它会使用 large_client_header_buffers 指令中定义的更大缓冲区来继续读取请求头。这个指令接受两个参数:第一个参数是缓冲区的数量,第二个参数是每个缓冲区的大小。
开启gzip压缩
gzip_types多种MIME类型,包括:
text/plain
:纯文本文件。text/css
:CSS样式表文件。application/json
:JSON格式的数据。application/javascript
和text/javascript
:JavaScript脚本文件(尽管text/javascript
已不再是推荐使用的MIME类型,但很多旧系统仍在使用)。text/xml
和application/xml
:XML格式的数据。application/xml+rss
:RSS订阅的XML格式数据。
#启用了Nginx的gzip压缩功能
gzip on;
#当启用此选项时,Nginx会在响应头中添加`Vary: Accept-Encoding`字段。这个字段通知客户端(如浏览器)响应内容是基于请求的`Accept-Encoding`头部来压缩的。这有助于缓存系统(如CDN)正确地缓存压缩和未压缩的版本。
gzip_vary on;
#这个指令设置了Nginx在何种情况下对通过代理接收到的响应进行gzip压缩。Nginx都会对响应进行压缩。这对于负载均衡和反向代理场景特别有用,
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# 设置用于处理请求压缩的缓冲区数量和大小,32 4K表示按照内存页大小4K为单位,申请32倍的内存空间。
gzip_buffers 32 4k;
# 定义压缩的级别(压缩比),两点注意:
# 1. 值太高会影响CPU处理性能,所以压缩比并不是越高越好。2. 压缩一定要和静态资源缓存相结合,缓存压缩后的版本,如果每次都压缩,高负载下服务器的CPU吃不消。
gzip_comp_level 3;
#当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩。
gzip_min_length 100;
#早期的浏览器不支持gzip压缩,用户会看到乱码,http/1.0的协议下不开启gzip压缩。
gzip_http_version 1.1;
# ie6及以下不启用gzip(因为ie低版本不支持)
gzip_disable "MSIE [1-6]\.";
配置静态文件缓存:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
}
expires 30d;:这个指令设置了匹配到的资源的缓存过期时间。30d表示30天。这意味着,当浏览器请求这些文件时,如果文件在客户端(如浏览器)的缓存中且未过期(即距离上次请求该文件的时间未超过30天),浏览器将直接从缓存中加载文件,而不会向服务器发送请求。这有助于减少服务器的负载,加快网页的加载速度。
限制连接速度:
limit_rate 50k;
设置了每个连接的传输速度上限为 50KB/s(千字节每秒)。
设置日志格式和路径:
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;
error_log /var/log/nginx/error.log;
保存与server的长连接
默认nginx访问后端都是用的短连接(HTTP1.0),一个请求来了,Nginx 新开一个端口和后端建立连接,后端执行完毕后主动关闭该链接。为了保持长连接,需要在Location和upstream中分别做一定的配置。
Location配置示例:
proxy_http_version 1.1 :用于升级协议版本,只有1.1才支持长连接;
proxy_set_header Connection “” : 用于清理客户端过来的Connection请求头,目的是忽略Client到nginx的长连接配置,始终保持nginx与upstream之间是长连接
http {
server {
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}
upstream配置示例:
keepalive: 设置到upstream服务器的空闲keepalive连接的最大数量,最好根据QPS来设置,设置过小会造成流量高峰时连接数反复震荡;
http {
upstream BACKEND {
server 192.168.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.2:8080 weight=1 max_fails=2 fail_timeout=30s;
keepalive 300; // 保持keepalive的连接数量
}
}
支持CORS跨域访问
跨域限制?
A网站只允许向A站点发送请求,如果试图向B站点发送请求,则会因为A、B两个站点域名不同而被拒绝。防止信息泄露等安全问题。
# 设置允许的跨域请求方法
add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
# 设置预检请求的缓存时间 预检命令的缓存,如果不缓存每次会发送两次请求。发送跨域请求之前,浏览器一般会先发起Options预检请求,以检查该服务器是否允许访问;
add_header "Access-Control-Max-Age" 3600;
# 设置允许跨域请求的源。这里留空可能不是您想要的,通常应指定为具体的域名或'*'(但'*'不允许设置credentials为true)
# 如果允许所有源,但不需要发送凭证,可以设置为'*'
# add_header "Access-Control-Allow-Origin" "*";
# 如果需要发送凭证,必须指定具体的源
add_header "Access-Control-Allow-Origin" "https://example.com"; # 替换为您的源
# 允许携带凭证(如cookies)进行跨域请求
# 注意:如果Access-Control-Allow-Origin不是'*',则可以设置此头部
add_header Access-Control-Allow-Credentials true;
# 允许跨域请求携带的自定义头部
# 注意:这里使用$http_access_control_request_headers可能不是最佳实践,因为它可能包含非法的头部
# 更安全的做法是指定具体的头部,例如:"Content-Type, Authorization"
# add_header "Access-Control-Allow-Headers" "Content-Type, Authorization";
# 如果确实需要动态获取,确保进行了适当的过滤和验证
add_header "Access-Control-Allow-Headers" $http_access_control_request_headers;
# 对于OPTIONS请求,直接返回200状态码,不执行后续处理
if ($request_method = OPTIONS) {
return 200;
}
The ‘Access-Control-Allow-Origin’ header contains multiple values’x, *’, but only one is allowed。
原因:一条请求链上有多处配了跨域头,但跨域头只允许有一个。
解决方法:只保留一处跨域头配置,其它的跨域头删掉。
防盗链之Referer
Refer是http协议定义的一个Header,它指向当前请求页面的来源页面的地址,即当前请求源自哪个源链接;通过它可以跟踪到目标网页的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址;
valid_referers none | blocked | server_names | string ...;
下面是各个参数的含义:
none
:表示没有引用信息。这通常发生在直接访问资源(而不是通过点击链接)时。blocked
:表示引用信息被防火墙或代理服务器阻止。这可能是因为HTTP请求头中的Referer
字段被删除或修改。server_names
:表示引用信息中的主机名与Nginx服务器配置中的server_name
指令指定的服务器名匹配。string ...
:允许你指定一个或多个具体的字符串作为有效的引用URL的一部分。这些字符串可以是完整的URL,也可以是URL的一部分(例如域名)。你可以使用*
作为通配符来匹配任意字符。
例如,如果你只想允许来自自己网站的引用访问图片资源,你可以这样配置:
location ~* \.(jpg|jpeg|png|gif|ico)$ {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
# 其他配置...
}
在这个例子中,valid_referers
指令设置了三个有效的引用来源:没有引用信息(none
)、引用信息被阻止(blocked
)、以及引用信息中的主机名与server_names
指令或*.example.com
匹配。如果请求不满足这些条件之一(即$invalid_referer
变量为真),则返回403 Forbidden错误。
接口缓存配置
nginx支持对接口响应的缓存,具体配置过程分为两步。
在http块增加如下配置,来指明缓存路径和一些缓存参数:
proxy_cache_path /var/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
参数释义:
- /var/cache:Nginx缓存资源的本地存放路径;
-
levels=1:2 :指定2级目录来存储缓存文件,其中第一级目录用1位16进制命名,如a;第二级目录用2位16进制命名,如3a。所以此例中一级目录有16个,二级目录有1616=256个,总目录数为16256=4096个。
-
key_zone:一块命名的内存区域,用来存放缓存的 key 和 metadata;
-
max_size :最大缓存空间, 当达到上限后会删除最少使用的 cache;
-
inactive:某个缓存在inactive指定的时间内如果不访问,将会从缓存中删除;
在相应URL的Location块中添加如下配置,来启用缓存:
server {
location ~* ^/urlserver(/.*) {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
……
}
}
配置项释义如下:
- proxy_cache:用于启用cache,并指明要使用的key_zone;
- proxy_cache_valid:缓存HTTP响应状态码为200和302的请求,并将它们缓存10分钟;
- add_header Nging-Cache “$upstream_cache_status”:用于在响应头中判断是否命中缓存,HIT表示命中缓存,MISS表示未命中缓存;
- proxy_cache_key: 表示将主机名、URI、问号及查询参数连接起来作为缓存key;