WEB服务与NGINX(22)- nginx的七层负载均衡功能
1. NGINX实现负载均衡功能
1.1 nginx负载均衡概述
-
负载均衡的作用
负载均衡,load balance,指的是将用户的应用请求进行平衡,分摊到多个应用节点进行处理。
负载均衡增加了应用的服务能力和可用性。
当单台web服务器为直接为用户提供服务时,在面对超大并发量的用户请求时服务器性能难以承受,因此我们会进行横向扩展,使用多台WEB服务器组成WEB服务集群为用户提供服务,这样前端就需要有一个负载均衡设备,按照一定的算法为后端服务器集群分发用户请求,从而实现提升整体性能和系统的容灾能力。
-
负载均衡与代理的区别
- 代理一般只代理一台服务器;
- 负载则是代理一个服务器集群,并且按照一定的算法将流量分发给后端服务器集群;
-
负载均衡分类
负载均衡根据代理的层次可以分为四层负载均衡和七层负载均衡。
-
四层负载均衡
在传输层进行负载均衡,仅需要对客户端的请求在TCP/UDP层进行包转发就可以实现。
四层负载均衡的性能极好,因为只需要在TCP层进行处理,无需解析应用层,理解应用层复杂的逻辑。
-
七层负载均衡
在应用层进行负载均衡,需要解析应用层报文,根据应用层信息进行负载。七层负载均衡可以完成应用方面的协议请求,比如nginx实现的http层负载,可以实现http头信息的改写,安全应用规则控制,URI匹配控制,rewrite等功能。
七层负载均衡相比四层性能会比较差,因为需要解析应用层信息。
-
1.2 nginx实现http的负载均衡
1.2.1 nginx基于http负载均衡场景配置
nginx实现http负载均衡功能由ngx_http_upstream_module模块提供。
实验场景中用到的服务器和地址如下图:
- 客户端:192.168.20.17
- nginx负载均衡:主机名:nginx01,地址:192.168.20.20
- WEB集群有三台WEB主机:
- WEB01:使用nginx服务器,主机名:nginx02,ip地址:192.168.20.22
- WEB02:使用nginx服务器,主机名:nginx03,ip地址:192.168.20.23
- WEB03:使用apache服务器作为备用WEB服务器,主机名:Apache01,ip地址:192.168.20.21
1.2.1.1 负载均衡相关参数
-
upstream
定义后端服务器组,会引入一个新的上下文,默认调度算法是wrr(加权轮询),服务器可以监听不同的端口,监听TCP和UNIX域套接字的服务器可以混合使用。
配置语法:upstream name { ... }
name用于对此服务器组的调用。
配置环境:http
-
server
在upstream上下文中定义后端服务器成员,以及相关的参数;
配置环境:upstream
配置语法:server address [parameters]
-
address有三种表示格式:
1、unix:/PATH/TO/SOME_SOCK_FILE
2、IP[:PORT]
3、HOSTNAME[:PORT]
-
parameters相关参数:
-
weight=number:定义服务器的权重,默认为1;
-
max_conns=number: 设置连接后端报务器最大并发活动连接数,默认为0表示没有限制,1.11.5后支持;
-
max_fails=number:设置对后端服务器失败连接尝试最大次数;超出此处指定的次数时,server将被标记为不可用,默认为1;在fail_timeout设定的时间内,与服务器的连接失败达到max_fails则认为服务器不可用。
-
fail_timeout=time:后端服务器通信失败后,探测节点是否可用的周期;
例如server 192.168.20.22:80 weight=1 fail_timeout=5s max_fails=3;表示如果后端节点5秒内出现3次不可用情况,判定该节点不可用。判定不可用后5秒内请求不会转发到此节点,直到5秒后重新检测节点健康情况。
在两个节点都可用的情况下,突然有一个节点挂掉,客户端请求过来后哪怕请求到了不可用的节点,此次请求也不会失败,因为Nginx会把此次请求转发到另外一个可用节点,再把结果返回给客户端。
当一个节点挂掉,Nginx不知道节点是否恢复的时候,会把客户端的请求同时转发到两个节点,判断节点健康情况。
-
backup: 将服务器标记为“备用”,即所有服务器均不可用时才启用此服务器;
-
down: 把后端服务器标记为“不可用”,调度服务器就不会将请求发送至标记的后端服务器,可以用来实现服务器维护或灰度发布;
-
resolve:当server定义的是主机名的时候,当A记录发生变化时会自动应用新的IP地址而不是重启nginx;
-
配置示例:
upstream webserver { server 192.168.20.22:80 weight=1 fail_timeout=5s max_fails=3; server 192,168.20.23:80 weight=2 fail_timeout=5s max_fails=3; server 192.168.20.21:80 weight=1 fail_timeout=5s max_fails=3 backup; }
-
-
keepalive
为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗,当超过此数字时,最近使用最少的连接将被关闭。
配置格式:keepalive connections;
配置环境:upstream
示例:keepalive 32;
1.2.1.2 WEB集群部署
注意:在实际生产中后端服务器的数据必须完全一致,此处为了实验效果故意把后端服务器的页面内容设置的不一样。
-
nginx02部署
#1.nginx的配置文件如下: [root@nginx02 ~]# cat /etc/nginx/conf.d/xuzhichao.conf server { listen 80 default_server; server_name node01.xuzhichao.com; access_log /var/log/nginx/access_xuzhichao.log access_json; charset utf-8,gbk; location / { root /data/nginx/xuzhichao; index index.html; } } [root@nginx02 ~]# vim /etc/nginx/nginx.conf ...... log_format access_json '{ "@timestamp": "$time_iso8601", ' '"remote_addr": "$X-Forwarded-For", ' '"referer": "$http_referer", ' '"request": "$request", ' '"status": $status, ' '"bytes":$body_bytes_sent, ' '"agent": "$http_user_agent", ' '"x_forwarded": "$http_x_forwarded_for", ' '"upstr_addr": "$upstream_addr",' '"upstr_host": "$upstream_http_host",' '"upstreamtime": "$upstream_response_time" }'; #2.建立nginx工作目录: [root@nginx02 ~]# mkdir -p /data/nginx/xuzhichao [root@nginx02 ~]# chown nginx:nginx /data/nginx/xuzhichao [root@nginx02 ~]# echo "node1.xuzhichao.com page" > /data/nginx/xuzhichao/index.html [root@nginx02 ~]# echo "node1.xuzhichao.com main page" > /data/nginx/xuzhichao/main.html #3.重启nginx服务: [root@nginx02 ~]# systemctl reload nginx.service #4.访问测试: [root@nginx01 ~]# curl http://192.168.20.22/ node1.xuzhichao.com page
-
nginx03部署
#1.nginx的配置文件如下: [root@nginx03 ~]# cat /etc/nginx/conf.d/xuzhichao.conf server { listen 80 default_server; server_name node02.xuzhichao.com; access_log /var/log/nginx/access_xuzhichao.log access_json; charset utf-8,gbk; location / { root /data/nginx/xuzhichao; index index.html; } } [root@nginx03 ~]# vim /etc/nginx/nginx.conf ...... log_format access_json '{ "@timestamp": "$time_iso8601", ' '"remote_addr": "$X-Forwarded-For", ' '"referer": "$http_referer", ' '"request": "$request", ' '"status": $status, ' '"bytes":$body_bytes_sent, ' '"agent": "$http_user_agent", ' '"x_forwarded": "$http_x_forwarded_for", ' '"upstr_addr": "$upstream_addr",' '"upstr_host": "$upstream_http_host",' '"upstreamtime": "$upstream_response_time" }'; #2.建立nginx工作目录: [root@nginx03 ~]# mkdir -p /data/nginx/xuzhichao [root@nginx03 ~]# chown nginx:nginx /data/nginx/xuzhichao [root@nginx03 ~]# echo "node2.xuzhichao.com page" > /data/nginx/xuzhichao/index.html [root@nginx03 ~]# echo "node2.xuzhichao.com main page" > /data/nginx/xuzhichao/main.html #3.重启nginx服务: [root@nginx03 ~]# systemctl reload nginx.service #4.访问测试: [root@nginx01 ~]# curl http://192.168.20.23/ node2.xuzhichao.com page
-
apache01部署
#1.apache的配置文件: [root@apache01 ~]# cat /etc/httpd/conf.d/vhost.conf <VirtualHost 192.168.20.21:80> ServerName apache.xuzhichao.com DocumentRoot "/data/apache/xuzhichao" #LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined1 LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined1 #CustomLog "logs/apache.xuzhichao.log" combined CustomLog "logs/apache.xuzhichao.log" combined1 <Directory "/data/apache/xuzhichao"> options none allowoverride none Require all granted </Directory> </VirtualHost> #2.apache相关的工作目录: [root@apache01 ~]# cat /data/apache/xuzhichao/index.html <h1>apache.xuzhichao.com</h1> #3.重启httpd服务: [root@apache01 ~]# systemctl reload httpd.service #4.访问测试: [root@nginx01 ~]# curl http://192.168.20.21/ <h1>apache.xuzhichao.com</h1>
1.2.1.3 nginx负载均衡服务器部署
#1.nginx配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
server 192.168.20.22 weight=1 fail_timeout=5s max_fails=3;
server 192.168.20.23 weight=2 fail_timeout=5s max_fails=3;
server 192.168.20.21 weight=1 fail_timeout=5s max_fails=3 backup;
}
server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json;
location / {
root /data/nginx/html/xuzhichao;
index index.html index.php;
valid_referers none blocked server_names *.b.com b.* ~\.baidu\. ~\.google\.;
if ( $invalid_referer ) {
return 403;
}
}
location /web {
index index.html;
proxy_pass http://webserver/; <==注意webserver后面以/结尾,不需要后端服务器上建立web目录。
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
#2.重启nginx服务:
[root@nginx01 ~]# systemctl reload nginx.service
#3.客户端轮询访问,按照配置的服务器权重对客户端请求进行分配:
[root@xuzhichao ~]# for i in {1..12}; do curl http://www.xuzhichao.com/web/; sleep 1 ;done
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
[root@xuzhichao ~]# for i in {1..12}; do curl http://www.xuzhichao.com/web/main.html; sleep 1 ;done
node2.xuzhichao.com main page
node1.xuzhichao.com main page
node2.xuzhichao.com main page
node2.xuzhichao.com main page
node1.xuzhichao.com main page
node2.xuzhichao.com main page
node2.xuzhichao.com main page
node1.xuzhichao.com main page
node2.xuzhichao.com main page
node2.xuzhichao.com main page
node1.xuzhichao.com main page
node2.xuzhichao.com main page
#4.后端服务器访问日志,可以显示客户端真实IP和经过的代理服务器地址:
[root@nginx02 ~]# tail -f /var/log/nginx/access_xuzhichao.log
{ "@timestamp": "2021-06-28T20:17:42+08:00", "remote_addr": "192.168.20.17, 192.168.20.20", "referer": "-", "request": "GET // HTTP/1.0", "status": 200, "bytes":25, "agent": "curl/7.29.0", "x_forwarded": "192.168.20.17", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" }
[root@nginx03 ~]# tail -f /var/log/nginx/access_xuzhichao.log
{ "@timestamp": "2021-06-28T20:17:48+08:00", "remote_addr": "192.168.20.17, 192.168.20.20", "referer": "-", "request": "GET // HTTP/1.0", "status": 200, "bytes":25, "agent": "curl/7.29.0", "x_forwarded": "192.168.20.17", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" }
1.2.1.4 测试启用备份web服务器
当两台主用的web服务器nginx02和nginx03出现故障时,会自动启用backup的web服务器,nginx02和nginx03恢复时请求又会重新调度到这两台服务器中。
#1.nginx03停止nginx服务
[root@nginx03 xuzhichao]# systemctl stop nginx.service
#2.把nginx02的状态设置为down
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
server 192.168.20.22 weight=1 fail_timeout=5s max_fails=3 down;
server 192.168.20.23 weight=2 fail_timeout=5s max_fails=3;
server 192.168.20.21 weight=1 fail_timeout=5s max_fails=3 backup;
}
[root@nginx01 ~]# systemctl reload nginx.service
#3.客户端的访问测试情况如下,服务未出现中断:
[root@xuzhichao ~]# for i in {1..120}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page <==nginx03停止服务
node1.xuzhichao.com page
node1.xuzhichao.com page
node1.xuzhichao.com page
node1.xuzhichao.com page
<h1>apache.xuzhichao.com</h1> <==nginx02也停止服务
<h1>apache.xuzhichao.com</h1>
<h1>apache.xuzhichao.com</h1>
#4.恢复nginx02和nginx03时,服务仍未出现中断
[root@xuzhichao ~]# for i in {1..120}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
<h1>apache.xuzhichao.com</h1>
<h1>apache.xuzhichao.com</h1>
<h1>apache.xuzhichao.com</h1>
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node1.xuzhichao.com page
1.2.2 nginx负载均衡调度算法
1.2.2.1 轮询调度算法
轮询调度算法的原理是将每一次用户的请求,轮流分配给后端的服务器。
轮流调度算法的优点是比较简单,无需记录当前所有的连接状态,是一种无状态调度。
配置示例:
upstream webserver {
server 192.168.20.22 fail_timeout=5s max_fails=3 down;
server 192.168.20.23 fail_timeout=5s max_fails=3;
server 192.168.20.21 fail_timeout=5s max_fails=3 backup;
}
1.2.2.2 加权轮询调度算法
轮流调度算法没有考虑后端每台服务器的处理能力,在实际情况中,由于每台服务器的配置,安装的业务应用不同,其处理能力也不一样,所以我们根据服务器的处理能力,为每个服务器分配不同的权重值,使其能够接受相应权重值的服务请求。
配置示例如下,调度效果见上一节示例:
upstream webserver {
server 192.168.20.22 weight=1 fail_timeout=5s max_fails=3 down;
server 192.168.20.23 weight=2 fail_timeout=5s max_fails=3;
server 192.168.20.21 weight=1 fail_timeout=5s max_fails=3 backup;
}
1.2.2.3 ip_hash调度算法
ip_hash是基于客户端的IP地址,对该IP进行hash运算,根据hash运算的值,将请求分配到后端特定的一台节点进行处理。该算法会始终将同一个客户端ip调度到同一个服务器中,实现会话绑定。缺陷在于局域网中使用同一个公网IP,导致调度不合理。
ip_hash算法实现公式:hash(client_ip) % node_counts = index
ip_hash算法原理如下图:把客户端的IP地址hash成一个数值,同一个客户端IP所hash的数值是相同的,后端如果有三台服务器,为这三台服务器分别编号为0、1、2,Ip的hash值对3取余数,余数则是调度到后端服务器的编号。
ip_hash算法存在两个问题:
- 如果有大量的来自于同一IP的请求会造成某个后端节点流量过大,其他节点流量较少,流量分配不均匀。
- 如果临时下线后端一台服务器,会出现所有建立连接的客户端重新计算hash值,从而造成大量的用户被转移到其他的节点进行处理,重新建立会话。官方建议把下线的主机标记为down状态,以保留客户端IP地址的当前hash值。
ip_hash的配置示例如下:
#1.nginx配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
ip_hash;
server 192.168.20.22 fail_timeout=5s max_fails=3;
server 192.168.20.23 fail_timeout=5s max_fails=3;
server 192.168.20.21 fail_timeout=5s max_fails=3 backup;
}
server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json;
location / {
root /data/nginx/html/xuzhichao;
index index.html index.php;
valid_referers none blocked server_names *.b.com b.* ~\.baidu\. ~\.google\.;
if ( $invalid_referer ) {
return 403;
}
}
location /web {
index index.html;
proxy_pass http://webserver/; <==注意webserver后面以/结尾,不需要后端服务器上建立web目录。
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
#2.重启nginx服务:
[root@nginx01 ~]# systemctl reload nginx.service
#3.客户端访问测试,同一个客户端固定分配到一个后端服务器:
[root@xuzhichao ~]# for i in {1..120}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
......
1.2.2.4 一致性hash调度算法原理
一致性hash调度算法是为了解决上述问题而诞生的。一致性Hash算法也是使用取模的方法,但不是对服务器节点数量进行取模,而是对2的32次方取模。即,一致性Hash算法将整个Hash空间组织成一个虚拟的圆环,Hash函数的值空间为0 ~ 2^32 - 1(一个32位无符号整型)
。
整个圆环以顺时针方向组织,圆环正上方的点代表0,0点右侧的第一个点代表1,以此类推。
选择服务器的IP或主机名作为关键字对每个服务器按照上述方式进行哈希,这样每台服务器就确定在了哈希环的一个位置上,比如我们有三台机器,使用它们的IP地址哈希后在环空间的位置如图所示:
用户数据访问时,将客户端指定的数据Key使用相同的Hash函数计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针查找,遇到的服务器就是其应该定位到的服务器。
例如,现在有ObjectA,ObjectB,ObjectC三个数据对象,经过哈希计算后,在环空间上的位置如下:
根据一致性算法,Object -> NodeA,ObjectB -> NodeB, ObjectC -> NodeC
-
一致性hash的容错性
假设Node C宕机了,图中可以看到,A、B不会受到影响,只有Object C对象被重新定位到Node A。所以在一致性Hash算法中,如果一台服务器不可用,受影响的数据仅仅是此服务器到其环空间前一台服务器之间的数据(这里为Node C到Node B之间的数据),其他不会受到影响。
-
一致性hash的扩展性
当集群中增加了一台服务器Node X,此时对象ObjectA、ObjectB没有受到影响,只有Object C重新定位到了新的节点X上。
一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,有很好的容错性和可扩展性。
-
一致性hash的数据倾斜问题
在一致性Hash算法服务节点太少的情况下,容易因为节点分布不均匀面造成数据倾斜,即被缓存的对象大部分缓存在某一台服务器上,如下图:
这时我们发现有大量数据集中在节点A上,而节点B只有少量数据。
为了解决数据倾斜问题,一致性Hash算法引入了虚拟节点机制,即根据服务器的权重对每一个服务器节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。
虚拟节点生成原理:假设ABC三台缓存服务器的权重分别为10/20/30,权重为10,就做9次(后端服务器IP哈希值+随机数)/2^32,得到9个虚拟节点,依次类推。
所以加入虚拟节点之后,即使在服务节点很少的情况下,也能做到数据的均匀分布。
1.2.2.5 hash调度算法
使用请求字段中指定的key的hash值来实现对请求的调度,key可以直接文本、变量或二者组合,使用consistent参数,将使用ketama一致性hash算法。
例如:hash $request_uri consistent
表示根据用户请求的URL进行hash取模,根据hash结果使用一致性hash算法将请求分配到后端服务器中。
适用于后端是Cache服务器(如varnish)的情况:
用户请求nginx负载均衡器,nginx将请求调度到后面一台缓存服务器cache1中,cache1去后端获取数据,返回数据,将数据缓存在本地,当其他客户端请求这个URL时,会被同样调度到这台cache1服务器中,cache1直接调用自身缓存数据响应客户端即可,大幅提升网站的响应。
使用示例如下:
#1.nginx的配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
hash $request_uri consistent; <==使用一致性hash算法对用户请求的url进行hash后调度。
#hash $uri consistent; <==两种写法都可以。
server 192.168.20.22 fail_timeout=5s max_fails=3;
server 192.168.20.23 fail_timeout=5s max_fails=3;
server 192.168.20.21 fail_timeout=5s max_fails=3 backup;
}
server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json;
location / {
root /data/nginx/html/xuzhichao;
index index.html index.php;
valid_referers none blocked server_names *.b.com b.* ~\.baidu\. ~\.google\.;
if ( $invalid_referer ) {
return 403;
}
}
location /web {
index index.html;
proxy_pass http://webserver/; <==注意webserver后面以/结尾,不需要后端服务器上建立web目录。
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
#2.重启nginx服务:
[root@nginx01 ~]# systemctl reload nginx.service
#3.客户端测试,访问同一个url会被调度到同一台后端服务器中:
[root@xuzhichao ~]# for i in {1..12}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
......
#使用不同的客户端访问相同的URL还是调度到同一台服务器中。
[root@apache01 ~]# for i in {1..12}; do curl http://www.xuzhichao.com/web/index.html; sleep 1 ;done
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
node2.xuzhichao.com page
......
1.2.2.6 least_conn调度算法
最少连接调度算法,哪台节点连接数少就把请求调度到这个节点。
当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接。
配置示例如下:
#1.nginx的配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
upstream webserver {
least_conn;
server 192.168.20.22 fail_timeout=5s max_fails=3;
server 192.168.20.23 fail_timeout=5s max_fails=3;
server 192.168.20.21 fail_timeout=5s max_fails=3 backup;
}
server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json;
location / {
root /data/nginx/html/xuzhichao;
index index.html index.php;
valid_referers none blocked server_names *.b.com b.* ~\.baidu\. ~\.google\.;
if ( $invalid_referer ) {
return 403;
}
}
location /web {
index index.html;
proxy_pass http://webserver/; <==注意webserver后面以/结尾,不需要后端服务器上建立web目录。
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
【推荐】中国电信天翼云云端翼购节,2核2G云服务器一口价38元/年
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步