# 负载均衡
建立在现有网络结构上,提高服务可用性和灵活性,增加吞吐量的方式。
# 四层负载
- 通过 ip+port的方式接收请求,再转发到对应的机器
- 实现原理
- 负载均衡器对客户端请求报文中的目标IP地址进行修改,客户端的TCP握手直接与服务端建立,类似路由器的转发作用。
- 优缺点
- 性能更高,但是灵活度不够
- 应用
- 基于C/S开发的ERP系统等
# 七层负载
- 根据虚拟URL或IP,主机名接收请求,再转发到相应的服务器
- 实现原理
- 负载均衡设备先代理最终的服务器和客户端建立连接(三次握手)后,获取到客户端发送的真正应用层内容的报文,再根据报文内容选择最终的服务器。负载均衡器会与客户端及服务器分别建立TCP连接。
- 优缺点
- 极大的提升了灵活性(可再负载均衡层面实现Header重写,响应关键字过滤,或者内容插入等),处理能力低于四层方式。
- 更加安全,能够更有效的防止DOS攻击,在负载均衡层面即可拦截。
- 应用
- 基于B/S开发的,使用HTTP协议的系统
# nginx
engine x,是一个高性能 http和反向代理web服务器。为俄罗斯访问量第二的网站开发。占有内存少,并发能力强。
# 发展历程
- 第一个版本,0.1.0,发布于2004年10月4日。
- 1.0.0,2011年4月12日发布
- 1.3.0,2012年
- 1.4.0,2013年
- 1.6.0,2014年
- 1.7.0,2014年
- 1.8.0,2015年
- 1.9.9,2015年
# 常用模块
- ngx_http_core_module
- 核心的http参数配置,对应nginx的http配置区块部分
- ngx_http_access_mdule
- 访问控制模块
- ngx_http_gzip_module
- 压缩模块,对nginx返回的数据压缩,属于性能优化模块
- ngx_http_fastcgi_module
- 动态应用相关模块,如php
- ngx_http_proxy_module
- proxy代理模块
- ngx_http_upstream_module
- 负载均衡模块,实现网站负载均衡功能,及节点健康检查
- ngx_http_rewrite_module
- url地址重写模块
- ngx_http_limit_conn_module
- 限制用户并发连接及请求数模块
- ngx_http_limit_req_module
- nginx请求过程速率限制
- ngx_http_log_module
- 访问日志模块
- ngx_http_auth_basic_module
- basic认证模块
- ngx_http_ssl_module
- ssl模块,用于加密的http连接
# 代理
正向代理
- 远程访问局域网时,在公网上先连上VPN之后,再访问局域网内的服务。VPN就是正向代理。
- 正向代理服务器位于客户端和服务器之间,提供数据中转服务。
- 正向代理,代理的是客户端
反向代理
- 反向代理,代理的是服务器
- nginx就是反向代理
代理规则
代理目录
# ~ 表示区分大小写匹配 location ~ /api1/*** { //此处省略 }
模糊代理
# 匹配以v1开始,且跳过任意字符串,且后面包含xxx的url路径 location ~ ^/v1/.*/xxx.* { //此处省略 }
# 代理匹配规则
# 规则简介
- = 精确匹配
- ~ 区分大小写匹配
- ~* 不区分大小写匹配
- !~ 区分大小写不匹配
- / 通用匹配,全部被匹配到
# 规则分类
- 基于普通字符串的匹配
- 以**=引导符开头的精确匹配**
- 无引导字符的字符串
- 基于正则的匹配
- 以**~引导符开头的正则匹配**
- 以**~引导符开头的正则匹配*
# 规则优先级
- =引导符的精确匹配(后方不能带参数)
- ^~引导符开头的前缀路径匹配
- ~或者~*引导符定义的正则匹配,根据顺序来,在前的优先级更高,前方匹配后,将会停止匹配
- 部分起始路径匹配(字符串模式)
- 通用匹配,通过
/
进行配置,如果没有其它匹配,则任何请求都会匹配到;
# 匹配流程
- 先查找精确匹配,如果命中,则直接返回
- 再查找普通匹配,以最大前缀为原则,如果命中,暂存当前的匹配结果,继续搜索正则模式
- 按照顺序搜索正则匹配,如果命中,则以此为结果返回;如果没命中,则以缓存的结果为最终结果。
- 如果前方的搜索没匹配到,则匹配通用匹配
- 如果没有通用匹配,则返回404
# 匹配注意事项
- 正则匹配项的匹配规则,受定义的前后顺序影响。但普通匹配模式不受前后顺序影响;
# 转发规则
# 转发规则(来自网络)
proxy_pass不带URI的(只包含IP和端口,端口后的/也没有)
原样保留路径。即保留location中路径部分
location /api1/{ proxy_pass http://localhost:8080 } 访问 http://localhost/api1/xxx 代理到 http://localhost:8080/api1/xxx
proxy_pass带有URI的(包含只有/的方式)
进行字面替换,对请求的URL进行替换
location /api2/{ proxy_pass http://localhost:8080/ } 访问 http://localhost/api2/xxx 代理到 http://localhost:8080/xxx location /api2{ proxy_pass http://localhost:8080/ } 访问 http://localhost/api2/xxx 代理到 http://localhost//xxx
# 代理转发实测
代理配置
server { location /test/aaa { proxy_pass http://localhost/bcd/; } location /test/bbb { proxy_pass http://localhost/gef; } location /test/ccc/ { proxy_pass http://localhost/lmn/; } location /test/ddd/ { proxy_pass http://localhost/ijk; } }
请求路径
http://localhost/test/ddd///thisismypath/1/2/3
转发结果
转发前 转发后 转发配置 /test/aaa///thisismypath/1/2/3 /bcd//thisismypath/1/2/3 location /test/aaa {
proxy_pass http://localhost/bcd/;
}/test/bbb///thisismypath/1/2/3 /gef/thisismypath/1/2/3 location /test/bbb {
proxy_pass http://localhost/gef;
}/test/ccc///thisismypath/1/2/3 /lmn/thisismypath/1/2/3 location /test/ccc/ {
proxy_pass http://localhost/lmn/;
}/test/ddd///thisismypath/1/2/3 /ijkthisismypath/1/2/3 location /test/ddd/ {
proxy_pass http://localhost/ijk;
}/test/aaa/thisismypath/1/2/3 /bcd//thisismypath/1/2/3 location /test/aaa {
proxy_pass http://localhost/bcd/;
}/test/bbb/thisismypath/1/2/3 /gef/thisismypath/1/2/3 location /test/bbb {
proxy_pass http://localhost/gef;
}/test/ccc/thisismypath/1/2/3 /lmn/thisismypath/1/2/3 location /test/ccc/ {
proxy_pass http://localhost/lmn/;
}/test/ddd/thisismypath/1/2/3 /ijkthisismypath/1/2/3 location /test/ddd/ {
proxy_pass http://localhost/ijk;
}
# 代理转发结论
- 代理转发为了方便记忆,可大致理解为字面替换,但绝不能简单的理解为字面替换
- 大多数情况下,匹配路径带/,转发路径不带/,容易导致异常现象;
# 最佳实践
匹配规则与转发规则保持一致。即要么结尾都带/,要么结尾都不带/
# 七层负载配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#允许客户端请求的最大单文件字节数
client_max_body_size 10m;
#缓冲区代理缓冲用户端请求的最大字节数,
client_body_buffer_size 128k;
upstream myAuth {
server localhost:18010 weight=1;
server localhost:18011 weight=1;
}
server {
listen 80;
server_name localhost;
set $core_origin "";
if ($http_origin ~* "^http://localhost/ips/admin/$") {
set $core_orgin $http_origin;
}
if ($http_origin ~* "^http://localhost/ips/auth/$") {
set $core_orgin $http_origin;
}
if ($http_origin ~* "^http://www.xxx.cn$") {
set $core_orgin $http_origin;
}
location / {
root html;
try_files $uri $uri/ /index.html
index index.html index.htm;
}
location /portal/ {
proxy_pass http://127.0.0.1:8081/portal/;
}
location /ips/admin/ {
proxy_pass http://localhost:18020/ips/admin/;
}
location /cep/auc/ {
proxy_pass http://localhost:17020/cep/auc/;
}
location /ips/auth/ {
proxy_pass http://myAuth;
}
}
}
- 配置cookie隔离
location /casserver/ {
proxy_pass http://casserver/casserver/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
proxy_cookie_path /casserver/ /casserver/;
}
# 四层负载配置
stream {
upstream sshAuth {
server localhost:18010 weight=1;
server localhost:18011 weight=1;
}
server {
listen 83;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass sshAuth;
}
}
# nginx疑难杂症
# 应用服务器获取host异常
# host请求头描述
http的
Request header
中的 Host 指定了所请求资源的主机和端口RFC 2616 HTTP/1.1
中规定,在所有HTTP/1.1 请求中,client 必须包含 Host header;如果headers中没有Host,所有 HTTP/1.1 proxy 必须返回 400(Bad Request)。在 nginx proxy_pass 指令中,若不做任何配置,会使用后面的 URL 重写的Host
# 如何维持请求头
- 通过配置proxy_set_header Host $host;
# nginx变量大全
变量名称 | 变量含义 |
---|---|
$remote_addr | 客户端地址,注意是客户端的公网IP |
$args | 存放了URL中的指令;www.a.com?id=1&name=a, id=1&name=a即为 $args |
$document_root | 当前资源的请求的系统根目录,如 /apps/nginx/html |
$cookie_name | key为name的cookie值;同理,$cookie_a,表示 key为a的cookie值; |
$document_uri | 当前请求中不包含指令的uri;www.a.com/a/b/c?id=1,/a/b/c 即为 $document_uri |
$host | 当前请求的host名称 |
$http_user_agent | 客户端浏览器的详细信息 |
$http_cookie | 客户端的cookie信息 |
$limit_rate | 如果nginx配置了显示网络速率,则为网络速率值,没有设置则为0 |
$remote_port | 客户端请求ng服务器时,客户端随机打开的端口 |
$remote_user | 已经经过 Auth Basic Module验证的用户名 |
$request_body_file | 做反向代理时,发给后端服务器的本地资源的名称 |
$request_method | 请求资源的方式,get/post/put/delete等 |
$request_filename | 当前请求的资源文件的路径名称,由root或alias指令 与 URI请求生成的文件绝对路径,如/apps/nginx/html/main/index.html |
$request_uri | 包含请求参数的原始URI,不包含主机名;www.a.com/a?id=1中, a?id=1 即为 $request_uri |
$scheme | 请求的协议,如 ftp,https,http等 |
$server_protocol | 请求资源的协议版本,如 HTTP/1.0等 |
$server_addr | 服务器的ip地址 |
$server_name | 服务器的主机名 |
$server_port | 服务器的端口 |
set $var_name value; | 自定义变量 |
# proxy_pass追加头信息
- 有时候只写
proxy_pass
,可能无法正常转发,比如jenkins
;
# proxy_set_header指令,添加头信息给后端服务器
proxy_set_header X-Real-IP $remoet_addr; 自定义请求头,这个ip可能是其它代理,也可能是真正的请求端,目前它并不属于任何标准,仅约定
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 扩展头,用来表示HTTP请求端真实ip
proxy_set_header Host $host; 传递当前请求的host名称
注意,传递请求头可能有三个配置: $http_host,$host,以及$proxy_host, 这个对于下游服务器的host拦截影响很大,具体如下:
- $http_host就是浏览器访问的地址加端口(如果请求没带Host就没有);
- $http是浏览器访问的地址(如果请求没带Host,就用第一个serverName),不带端口;
- $proxy_host就是使用的proxy_pass的ip和端口(如果是80端口就不携带);
# add_header指令,添加响应给浏览器的头信息
- add_header Access-Contro-Allow-Headers $http_access_control_request_headers;
# 头信息限制
- ng的头信息,不能含有下划线
- 可以用驼峰式命名,或者用-
- 如果含有下划线的头信息,默认会被直接丢弃
- 可以通过
underscores_in_headers on;
修改这个特性
# cookie丢失问题排查
# cookie反向代理的两种情况(本质在于上下文是否发生变化)
- host、端口转换,cookie不会丢失
location /project {
proxy_pass http://192.168.100.3:8080/project
}
- host、端口、路径均变化,cookei会丢失,可通过proxy_cookie_path /project /proxy_project,注意实际的上下文在前
- 客户端请求带有cookie时,上下文为
proxy_project
,后端服务器需要取的cookie上下文为project
,属于 服务器未识别cookie - 服务端返回响应时,写入cookie,上下文为
project
,此时浏览器的访问路径为proxy_project
,属于 没有跨站,客户应该时可以写入cookie,但无法在下次请求时携带
- 客户端请求带有cookie时,上下文为
location /proxy_project {
proxy_pass http://192.168.100.3:8080/project,
proxy_cookie_path /project /proxy_project #进行cookie上下文转换
}
- 特别注意,有些场景,应用服务器设置了上下文为
/
,此时便不配置亦可
# proxy_pass头信息传递规则
- 在没有定义proxy_set_header时,会继承之前的值。默认情况下,只有两个字段被重定义
- proxy_set_header Host $proxy_host
- proxy_set_header Connection close;
# ng配置项
- proxy_pass_request_headers,默认为on,作为确定是否转发http头部
- proxy_pass_request_body,默认为on,作为确定是否向上游服务器发送http包体
# proxy_pass内外网端口重定向错误:port_in_redirect参数
- nginx默认做了端口重定向,重定向的端口是当前server配置的端口; 即 $HOST:${当前server配置的port}; 参考地址 :
https://blog.csdn.net/weixin_42272246/article/details/128134903
- 解决方法1:
port_in_redirect off;
proxy_set_header Host $host:外网端口;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 解决方法2:
proxy_set_header Host $http_host;
# nginx的静态资源重定向错误:外网端口被重定向为内网端口
- 如果的 URL 不包含尾部斜杠并且对应于一个目录(而不是文件),Nginx 会自动执行一次内部重定向,在 URL 后面加上斜杠,然后再次查找。这是为了确保正确的文件查找和避免潜在的安全问题(如目录遍历攻击)。
- 如果请求的文件名($request_filename)对应的是一个目录(-d),那么就执行自定义的重写规则
if (-d $request_filename) {
rewrite [^/]$ $scheme://$http_host$uri/ permanent;
}
- 配置示例
server {
listen 80;
server_name localhost; # 修改为docker服务宿主机的ip
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
if (-d $request_filename) {
rewrite [^/]$ $scheme://$http_host$uri/ permanent;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# rewrite与proxy_pass的区别
目的不同:rewrite 旨在修改URL路径,而 proxy_pass 用于将请求转发给其他服务器。
对客户端的影响:rewrite 可以导致客户端浏览器的URL变化(如果是外部重定向的话),而 proxy_pass 对客户端是透明的,不会改变客户端看到的URL。
工作范围:rewrite主要在Nginx内部工作,可能会影响后续的请求处理逻辑,包括如何选择location块。proxy_pass 则涉及与外部服务器的通信,通常用于构建分布式系统或服务架构。
在实际配置中,这两个指令经常一起使用。例如,你可能会先使用 rewrite 修改请求的URI,然后再使用 proxy_pass 将修改后的请求转发给适当的后端服务器。
# 举例说明
在Nginx中,rewrite 和 proxy_pass 在同一个 location 块内时,它们的执行顺序和优先级取决于配置的具体情况。但一般来说,rewrite 指令会在 proxy_pass 之前处理。这是因为Nginx按照其内部的阶段(phases)来处理请求,每个阶段有特定的任务。
Nginx的处理阶段大致如下:
- Rewrite phase (重写阶段):在这个阶段,所有 rewrite 指令会被评估和执行。如果 rewrite 规则导致了URI的变化,并且没有使用 break 或 last 标志,那么可能会触发新的location匹配过程。
- Post-rewrite phase (后重写阶段):这个阶段会再次检查location匹配,以确保在URI改变后选择正确的location块。
- Access phase (访问控制阶段):执行访问控制指令,如 allow、deny 等。
- Content phase (内容处理阶段):这是处理实际请求的地方,proxy_pass 指令通常在这个阶段执行,因为它涉及到将请求转发给后端服务器或生成响应内容。
在一个 location 中同时存在 rewrite 和 proxy_pass 时,rewrite 会先于 proxy_pass 执行。
location /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://backend_server;
}
在这个例子中,首先会应用 rewrite 规则,将 /api/something 重写为 /something,然后 proxy_pass 会将修改后的路径发送到 backend_server。
# rewrite的标志
# last标志
- 停止当前location块中其他 rewrite 指令的处理,并开始新一轮的location匹配过程。这意味着如果URI被重写,Nginx会根据新的URI再次尝试匹配location块
# break标志
- 停止当前location块中其他 rewrite 指令的处理,但不会触发新一轮的location匹配。后续的指令(如 proxy_pass)仍然会在当前location中执行
# redirect标志
- 返回一个临时重定向(HTTP 302)给客户端,告知浏览器访问新的URL。浏览器会发起一个新的请求到新的URL。
# permanent标志
- 返回一个永久重定向(HTTP 301)给客户端。与 redirect 类似,但它表示资源已永久移动到新位置,搜索引擎会更新索引.
# noescape标志
- 防止对重写后的URI进行URL编码。默认情况下,Nginx会对替换部分进行URL编码。使用 noescape 标志可以避免这种编码
# rewrite规则
- 如果有多个 rewrite 指令,它们会按照出现的顺序依次执行,直到遇到带有 last 或 break 标志的指令为止。
- redirect 和 permanent 会导致客户端浏览器地址栏中的URL发生变化,而 last 和 break 则是内部重写,对客户端不可见。
- 没有显示指定的情况下,默认使用的是break;
# nginx健康检查机制
# 原生健康检查
- 原生健康检测主要设计两个模块,
ngx_http_proxy_module
和ngx_http_upstream_module
# ngx_http_upstream_module模块
upstream myServers{
server 172.18.23.21:8003 max_fails=3 fail_timeout=30s;
}
- max_fails(默认为1):
nginx
与上游服务器通信尝试允许失败次数- 在
fail_timout
参数定义的时间段内,失败次数达到该值,ng认为该服务不可达; - 在下一个
fail_timeout
时间段,该服务器不会再被尝试 - 设为0后,将认为该服务器一直可用
- 可以通过
proxy_next_upstream
,fastcgi_next_upstream
,memcached_next_upstream
手动配置什么是失败的尝试,默认情况下,http_404状态不被认为是失败的尝试
- 在
- fail_timeout(默认为10s):
nginx
负载的保活的时间段- 上游服务器被认为不可用的时间段
- 统计失败尝试次数的时间段
# ngx_http_proxy_module模块
proxy_connect_timeout:与上游服务器建立连接的超时时间,应该指的是TCP连接
proxy_read_timeout:从上游服务器读取响应的超时时间
proxy_next_upstream: 指定何种情况下,请求被发送到下一台后端服务器,即定义何为失败的请求
默认值为
error,timeout
,即发生网络错误,以及超时,才会重试其他服务器,返回500,404均不会重试可以添加相应的状态码进行重试,如:
proxy_next_upstream error timeout http_500 http_404
当请求类型是POST时,ng默认不会失败重试,官网描述为:
通常情况下,请求使用非幂等方法(POST,PATCH,LOCK)时,请求失败后不会再到其他服务器进行重试。如果不需要此特性,加上non_idempotent即可。
如果需要post也失败重试,需要配置:proxy_next_upstream error timeout non_idempotent
关于幂等的一个说明:
多次执行一个方法的结果预期与单个执行的效果相同,则认为该方法幂等。常见的http方法中,get是幂等的,而post是非幂等的。因为get一般用于获取数据,对应数据库的SELECT语句,多次执行不会影响结果。而POST一般对应INSERT,如果多次执行,可能导致数据重复插入问题。
- 不建议使用GET方法做一些INSERT操作,业务开发时要遵循http协议规范.
- 生产环境,不建议加上non_idempotent选项,因为不论是timeout,还是500,服务器都可能已经执行过方法了。
需要注意,当客户端与服务端没有建立通信时,请求转发给下一台后端服务器才是可行的。如果客户端与服务器已经建立连接后,出现错误或者超时,这类错误是不可恢复的.
# 原生健康检查的弊端
- 节点异常时,nginx依然会把该请求转发给该异常节点,会浪费一次转发,再转发给别的节点.尝试max_fails次失败后,才会设置为异常节点
- 判断为异常节点后,当
fail_timeout
时间来临,ng
直接使用线上流量请求异常节点,而不是先探测是否恢复,在导入线上流量;无法精确判断异常节点是否恢复.
# 第三方健康检查nginx_upstream_check_module
编译安装该模块后,可在upstream中定义
upstream myServers{
server 172.18.23.21:8003;
server 172.18.23.22:8003;
check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp];
}
- interval: 想后端发送的健康检查包的间隔;
- fall: 如果连续失败次数达到fall_count,服务器就被认为是down;
- rise: 如果连续成功次数达到rise_count,服务器就被认为是up;
- timeout: 后端健康请求的超时时间
- default_down: 设定初始服务器的状态,如果是true,说明默认是down。默认值是true.
- type: 健康检查包的类型
- tcp: 简单的tcp连接,如果连接成功,说明后端正常;
- ssl_hello: 发送一个初始的SSL hello包并接受服务器的SSL hello包;
- http: 发送http请求,通过后端的回复包的状态,来判断后端是否存活;
- mysql: 向mysql服务器连接,通过接受服务器的greeting包,来判断后端是否存活;
- ajp: 向后端发送ajp协议的Cping包,通过接受Cpong包来判断后端是否存活;
- port: 后端服务器的检查端口。可以与实际的端口不一致,比如后端提供的443端口应用,可以检查80端口状态来判断后端健康状况。默认是0,表示跟后端server提供真实服务的端口一致。
# nginx反向代理https网页502, ssl_handshake失败
- nginx的ssl在握手时,默认不发送主机名,以ip连接服务器,当服务器上有多个虚拟主机使用同一个ip时,默认返回第一个可用证书,这样就导致证书无法匹配
- nginx对于此问题的方案称为 https的SNI, 配置中加入:
proxy_ssl_server_name on;
即可; - 参考文档:
https://crmeb.com/ask/thread/24234
# ng无网环境下安装
# 不要考虑用yum迁移的方案,已失败。 yum迁移适用于较小的工具,比如 telnet
# 大部分情况都能直接成功(不成功的情况下再考虑依次安装依赖, gcc都没有的环境还是比较少,一上来所有依赖都需要安装,就吓住了)
wget https://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
./configure --prefix=/u01/nginx --conf-path=/u01/nginx/nginx.conf
make
make install
# yum迁移小技巧备注
- 适用于较小的工具,比如 telnet
#这个命令不够彻底
yumdownloader --resolve --destdir=/usr/local/LOCAL-RPMS/nginx nginx
#这个命令会深度下载,即下载包及其所有层级依赖
repotrack -p /usr/local/LOCAL-RPMS/nginx nginx
# 在网络环境下使用
yum localinstall *.rpm
# ng互联网环境下yum安装
# 安装指令
yum install -y epel-release
yum install -y nginx
systemctl enable nginx
systemctl start nginx
# 关键路径
- 主配置文件:
/etc/nginx/nginx.conf
- 站点配置文件:
/etc/nginx/conf.d/
- 日志文件:
/var/log/nginx/
- 静态文件:
/usr/share/nginx/html/
- PID文件:
/var/run/nginx.pid
- 模块文件:
/usr/lib64/nginx/modules/
- ng执行文件:
/usr/sbin/nginx
# 临时下载服务配置
#临时关闭selinux, SELinux 默认会限制非标准端口。
sudo setenforce 0
#永久关闭selinux
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
- 配置server
server {
listen 10555;
server_name _;
location / {
root /hd01/ollama2; #下载地址,需要使用命令 chmod 777 -R 放开权限
autoindex on;
autoindex_exact_size off;
add_header Accept-Ranges bytes; # 启用断点续传
}
}
# 常见关键响应头说明
# proxy_buffering
- 默认值为
on
,即开启缓冲 - 缓冲区大小可以通过
proxy_buffer_size
进行设置 - 如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。
# no-transform
- 不得对资源进行转换或转变。Content-Encoding、Content-Range、Content-Type等 HTTP 头不能由代理修改。
- 例如,非透明代理或者如Google's Light Mode可能对图像格式进行转换,以便节省缓存空间或者减少缓慢链路上的流量。no-transform指令不允许这样做。
- vue的代理默认会对后端接口进行压缩,所以需要设置
cacge-control: no-cache,no-transform