Ngnix负载均衡和高可用集群及搭建与相关理论
Ngnix负载均衡和高可用集群及搭建与相关理论
全文目录
- Ngnix负载均衡和高可用集群及搭建与相关理论
- 高可能保持原理
- 配置 keepalived:
- 配置keepalived的IP
- 将外部域名解析到Keepalived的虚拟IP上
- 如何验证配置的正确性
- Nginx专用调试工具ngx_conf_t
- 如何对前后端多台服务器进行负载均衡
- 常用的几种Ngnix负载均衡配置
- 负载均衡器的IP裸露和域名解析问题
- 反向代理中添加自定义的请求头
要搭建 Nginx 高可用集群,您可以遵循以下步骤:
-
安装 Nginx:在每个服务器上安装 Nginx。
-
安装 keepalived:安装 keepalived 负责 IP 地址管理和服务器的故障检测。
-
配置 keepalived:配置 keepalived 来设置虚拟 IP(VIP)。VIP 是在集群中所有节点之间共享的 IP 地址,当一个节点失效时它可以在其他节点上接管它。
-
配置 Nginx:配置 Nginx 以使用 VIP。这意味着在每个节点上都需要相同的 Nginx 配置。
-
启动服务:启动 Nginx 和 keepalived 服务并确保它们自动启动。
-
测试:测试集群是否正常工作。
高可能保持原理
keepalived 的主要原理是基于 VRRP(虚拟路由冗余协议)来提供 IP 地址高可用性和故障转移。它允许多台服务器共享同一个虚拟 IP 地址,并且能够在某一台服务器出现故障时,自动将虚拟 IP 转移到其他正常的服务器上。
安装 keepalived:
-
在 Linux 系统上安装 keepalived,可以使用如下命令进行安装:
sudo apt-get update sudo apt-get install keepalived
-
安装完成后,可以使用如下命令检查版本:
keepalived -v
配置 keepalived:
-
配置主备节点:需要选择两个节点作为主备节点,一个作为 master 服务器,另一个作为 backup/server 服务器。
-
修改 keepalived 配置文件:keepalived 配置文件默认路径为 /etc/keepalived/keepalived.conf,可以使用编辑器打开该文件进行修改。配置文件中包含以下内容:
global_defs {router_id LVS_DEVEL }vrrp_script chk_nginx {script "killall -0 nginx"interval 2weight 2 }vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 101virtual_ipaddress {192.168.1.199}track_script {chk_nginx} }
在配置文件中,可以设置全局定义(global_defs)、VRRP 脚本(vrrp_script)和 VRRP 实例(vrrp_instance)。
-
启动 keepalived 服务:在两个服务器上都启动 keepalived 服务。命令如下:
sudo systemctl start keepalived
-
检查状态:使用如下命令进行检查,在 master 服务器上应该显示 Master,而在 backup/server 服务器上应该显示 Backup。
ip addr show eth0 systemctl status keepalived
keepalived 是一种高可用性解决方案,它通过跟踪指定的服务或进程来检测服务器的状态,并在主节点发生故障时自动将虚拟 IP 转移到备份服务器上。正确安装和配置 keepalived 是保证系统高可用性的一项重要步骤。
配置keepalived的IP
步骤如下:
- 在keepalived的配置文件中,设置自己的虚拟IP地址。这可以在“vrrp_instance”块中完成。例如,假设要配置虚拟IP为192.168.1.100,则应该添加以下行:
virtual_ipaddress {192.168.1.100
}
- 在每个运行keepalived的服务器上,需要确保网络接口配置正确。如果您的服务器正在运行Ubuntu操作系统,则可以使用以下命令查看网络接口配置:
$ sudo nano /etc/network/interfaces
在这个文件中,您应该会看到类似以下内容的行:
auto eth0
iface eth0 inet staticaddress 192.168.1.10netmask 255.255.255.0gateway 192.168.1.1
这些行定义了一些网络接口的属性,包括IP地址和子网掩码。要将虚拟IP添加到该接口上,请添加以下行:
auto eth0:0
iface eth0:0 inet staticaddress 192.168.1.100netmask 255.255.255.0
添加完毕后,保存文件并退出。
- 现在,您需要让keepalived知道哪个接口应该使用虚拟IP。可以通过在keepalived配置文件中的“interface”块中指定接口名称来完成。例如,要将虚拟IP分配给名称为“eth0”的网络接口,请添加以下行:
interface eth0
完成上述步骤后,keepalived将配置并使用虚拟IP。
将外部域名解析到Keepalived的虚拟IP上
要将外部域名解析的IP绑定到Keepalived的虚拟IP上,您需要进行以下步骤:
-
在DNS服务器中将您的域名指向Keepalived的虚拟IP地址。例如:您可以在DNS配置中添加一个A记录,将域名mydomain.com指向虚拟IP地址。
-
在Nginx服务器中,将Nginx配置文件中的server_name设置为您的域名。例如:
server {listen 80;server_name mydomain.com;location / {proxy_pass http://your_upstream_server;}
}
这样,当外部用户访问mydomain.com时,请求将被路由到Keepalived的虚拟IP上,并转发到您的Nginx服务器。
服务器的IP地址和Keepalived虚拟IP都是非常重要的组成部分。服务器IP地址是用于识别和访问各个服务器的标志,而Keepalived虚拟IP则是用于提供服务的统一访问地址,保证了服务的高可用性和稳定性
在公网上设置Keepalived虚拟IP需要注意一些安全性问题。以下是大致的操作步骤:
-
首先,在需要部署服务的所有服务器上安装Keepalived软件。
-
确保服务器能够正常通信,配置主机名和IP地址。
-
在各个服务器上配置服务,并测试其可用性。
-
修改Keepalived配置文件(一般为/etc/keepalived/keepalived.conf),完成虚拟IP地址、真实服务器的IP及权重等配置。
-
启动Keepalived服务。
-
根据需要,可以使用防火墙来限制对虚拟IP的访问。
-
相关服务的负载均衡和监控可以通过其他工具来实现,比如Nginx、HAProxy等。
需要注意的是,在公网上部署Keepalived虚拟IP需要仔细考虑服务器的安全性,比如防止DDoS攻击、IP欺骗等问题,使用防火墙和其他安全工具来提升服务器的安全性。
如何验证配置的正确性
可以按照以下步骤进行:
- 首先确保Nginx进程正在运行,并且keepalived服务已经启动。
- 执行以下命令检查Nginx配置文件是否存在语法错误:
sudo nginx -t
- 如果上述命令返回成功,则表示Nginx配置文件没有语法错误,可以继续测试。
- 尝试使用curl或者telnet等工具尝试连接到虚拟IP地址并访问Nginx服务。例如,使用curl命令:
curl http://虚拟IP地址/
。 - 如果curl命令返回HTTP 200 OK状态码以及预期的内容,则表示Nginx配置正确。
- 另外也可以在Nginx配置文件中添加一个简单的测试页面来验证Nginx是否正常运行。
以上是测试Nginx配置正确性的基本步骤,可以根据具体情况进行适当的调整。
Nginx专用调试工具ngx_conf_t
它可以在运行时检查Nginx配置的语法和正确性。使用该工具需要将Nginx编译时加上–with-debug参数来开启debug模式。ngx_conf_t支持以下常见选项:
- -t:测试Nginx配置文件的语法
- -T:显示Nginx配置文件的语法树
- -q:静默模式,如果配置正常则不输出任何内容,否则输出错误信息
例如,要检查Nginx配置文件的语法,可以使用以下命令:
nginx -t -c /path/to/nginx.conf
如果配置文件语法正确,则输出"configuration file /path/to/nginx.conf syntax is ok",否则输出错误信息。
Ng从入门到精通
如何对前后端多台服务器进行负载均衡
首先,我们需要安装Nginx。如果您使用的是Ubuntu系统,可以通过以下命令进行安装:
sudo apt-get update
sudo apt-get install nginx
安装完成后,我们需要编辑Nginx配置文件以实现分组负载均衡。
假设我们有两个前端服务器,分别为 192.168.1.100 和 192.168.1.101,两个后端服务器,分别为 192.168.1.200 和 192.168.1.201。我们可以按照以下步骤进行配置:
-
打开Nginx配置文件,一般在 /etc/nginx/nginx.conf
-
在http模块中添加以下内容:
upstream frontend {server 192.168.1.100;server 192.168.1.101;
}upstream backend {server 192.168.1.200;server 192.168.1.201;
}
这里定义了两个 upstream 块,分别命名为 frontend 和 backend。每个 upstream 块包含多个服务器地址,用于实现负载均衡。
- 在server模块中,配置需要反向代理的前端和后端服务。例如:
server {listen 80;server_name frontend.example.com;location / {proxy_pass http://frontend;}
}server {listen 80;server_name backend.example.com;location / {proxy_pass http://backend;}
}
这里定义了两个反向代理配置块,对应着前端和后端服务。对于每个配置块,我们指定了服务器监听的端口和域名。在 location 块中,我们使用 proxy_pass 指令将请求转发到对应 upstream 块中定义的服务器地址。
- 最后,保存文件并重启Nginx服务:
sudo service nginx restart
这样,前端服务和后端服务就分别通过负载均衡器进行了分组负载均衡。
如果您想测试一下是否生效,可以使用 curl 命令模拟请求:
curl http://frontend.example.com
curl http://backend.example.com
以上命令应该会随机访问负载均衡器中定义的服务器列表。
常用的几种Ngnix负载均衡配置
Nginx负载均衡有多种方式,这里介绍其中常用的几种方式和配置示例。
- 轮询(Round Robin)负载均衡方式
示例配置:
http {upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;location / {proxy_pass http://backend;}}
}
以上配置中,使用upstream模块定义了三个后端服务器,通过proxy_pass指令将请求转发给upstream模块定义的后端服务器。Nginx默认采用轮询算法进行负载均衡。
- IP Hash负载均衡方式
示例配置:
http {upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;location / {proxy_pass http://backend;}}
}
以上配置中,使用ip_hash指令启用IP Hash负载均衡算法,即将同一个客户端的请求发送到同一个后端服务器。如果某个后端服务器不可用,则该客户端的请求会被发送到另一个可用的后端服务器。
- Least Connections负载均衡方式
示例配置:
http {upstream backend {least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;location / {proxy_pass http://backend;}}
}
以上配置中,使用least_conn指令启用Least Connections负载均衡算法,即将请求发送到当前连接数最少的后端服务器。如果某个后端服务器的连接数增加了,则该服务器的权重会相应地减小,请求会被分发到连接数更少的其他服务器上。
- URL Hash负载均衡方式
示例配置:
http {upstream backend {hash $request_uri;server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;location / {proxy_pass http://backend;}}
}
以上配置中,使用hash指令启用URL Hash负载均衡算法,即将同一URL的请求发送到同一个后端服务器。如果某个后端服务器不可用,则该URL的请求会被发送到另一个可用的后端服务器。
5、Nginx加权负载均衡的配置示例:
http {upstream my_servers {server 192.168.0.2 weight=3;server 192.168.0.3 weight=2;server 192.168.0.4 weight=1;}server {listen 80;server_name example.com;location / {proxy_pass http://my_servers;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}
在这个配置中,我们定义了一个名为my_servers
的上游服务器组,其中有三个服务器分别具有不同的权重。默认情况下,每个服务器的权重值为1。在这里,我们设置服务器2拥有3个单位的权重,服务器3拥有2个单位的权重,服务器4拥有1个单位的权重。
接下来,我们在server
块中使用proxy_pass
将请求代理到上游服务器组my_servers
。这样,根据权重值,Nginx会将更多的请求发送到拥有更高权重值的服务器。我们还设置了一些HTTP头信息,以确保客户端和服务器之间的信息传递正确。
当客户端向Nginx发送请求时,Nginx会将该请求代理到my_servers
中的某个服务器上。如果某个服务器出现故障或暂停服务,Nginx会自动将该服务器从上游服务器组中移除,确保客户端始终连接到可用的服务器上。
上述示例都是在单个Nginx服务器上进行负载均衡,实际生产环境中可以通过多个Nginx服务器组成一个负载均衡集群,以提高负载均衡的性能和可靠性。
负载均衡器的IP裸露和域名解析问题
要将域名解析到负载均衡的服务器集群,需要进行以下步骤:
-
在域名注册商处设置域名解析。根据域名注册商的不同,设置方式可能会有所不同,一般需要将域名指向负载均衡器的IP地址。
-
在负载均衡器上配置实例。需要将负载均衡器绑定到一个公网IP地址上,并在负载均衡器上添加实例,即实际提供服务的服务器或容器。每个实例都有自己的IP地址和端口号。
-
配置负载均衡策略。可以根据需求设置不同的负载均衡策略,比如轮询、最小连接数等。
-
配置健康检查。在负载均衡器上要配置健康检查,以确保所有实例都能够正常工作。如果某个实例出现故障,则会自动将请求转发到其他可用实例。
-
配置防火墙规则。为了保证网络安全,需要在负载均衡器和实例之间设置防火墙规则,限制访问来源。
通过以上步骤,可以将域名解析到负载均衡的服务器集群,并设置对外的IP地址。
反向代理中添加自定义的请求头
要在Nginx反向代理中添加自定义 header 头,您需要在 Nginx 配置文件中使用 add_header 指令。将以下行添加到您的 Nginx 配置文件中,将自定义 header 头添加到请求中:
location / {proxy_pass http://backend;add_header X-My-Custom-Header "Custom Header Value";
}
此代码块将添加名为 X-My-Custom-Header 的 header 头到每个请求中,并将其值设置为 Custom Header Value。您可以根据需要更改这些值。
请注意,如果您已经在 backend 中包含特定 header 头,则可以使用 proxy_set_header 指令覆盖该头。例如,如果您需要覆盖用户代理 header 头:
location / {proxy_pass http://backend;proxy_set_header User-Agent "My Custom User Agent";
}
相关文章:
Ngnix负载均衡和高可用集群及搭建与相关理论
Ngnix负载均衡和高可用集群及搭建与相关理论 全文目录 Ngnix负载均衡和高可用集群及搭建与相关理论高可能保持原理配置 keepalived:配置keepalived的IP将外部域名解析到Keepalived的虚拟IP上如何验证配置的正确性Nginx专用调试工具ngx_conf_t如何对前后端多台服务器…...

2022年宜昌市网络搭建与应用竞赛样题(三)
网络搭建与应用竞赛样题(三) 技能要求 (总分1000分) 竞赛说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分三个部分,其中: 第一部分:网络搭建及安全部署项目(500分࿰…...

为什么PCB设计完成后需要放置mark点
PCB设计中的Mark点是指一些标记点,通常用于促进PCB制造和组装过程中的准确性和一致性。这些标记点在制造过程中可以帮助操作员进行自动化定位,从而确保所有部件都被正确组装到其正确位置,这对于确保产品的质量和可靠性至关重要。 下面&#…...
代理IP:IP代理技术与Socks5协议
代理IP是一种用于隐藏真实IP地址的技术,它可以将请求发送至代理服务器,再由代理服务器转发请求至目标网站。代理服务器会在请求过程中替换真实IP地址,从而保护用户的隐私和安全。在网络爬虫、反爬虫、匿名访问等场景中,代理IP技术…...
如何让java程序员生涯更顺利?我聊聊提升技术水平的五个方面
今天我想和大家聊聊程序员职业发展的问题。相信大家都知道,IT公司因为各种原因裁员,对程序员的前途发展都是不利的。特别是等到你30多岁,上有老下有小,仍然要加班,与年轻人竞争体力和智力,这是很艰难的。如…...

快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解
1.排序的概念及其运用 1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录&a…...

ChatGPT一键私有部署,全网可用,让访问、问答不再受限,且安全稳定!
前言 ChatGPT由于在访问上有一些限制,使用并不便利。目前国内可以直接访问的大部分是调用API返回结果,我们去使用时总会有次数限制,而且它们可能随便崩掉。 其实,目前我们访问过的大部分国内的网页包括UI,其实是套用了…...

自学黑客(网络安全),一般人我劝你还是算了吧
一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…...

盘“底座”,盘出新生意经
本文转自首席信息官 作者 徐蕊 导读 卖“底座”,这是一门新的生意,也是用友与友商差异化的商业竞争优势所在。 大型企业都在建“数智化底座” 有这样两类企业,他们截然不同,但在数智化的建设上殊途同归。 随着中国经济的发展&a…...

《花雕学AI》Poe:一个让你和 AI 成为朋友的平台,带你探索 ChatGPT4 和其他 八种AI 模型的奥秘
你是否曾经梦想过,能够在一个平台上,和多种不同的 AI 模型进行有趣、有用、有深度的对话,甚至还能轻松地把你的对话分享给其他人?如果你有这样的梦想,那么 Poe 一站式 AI 工具箱就是你的不二之选! Poe 是国…...

单片机GD32F303RCT6 (Macos环境)开发 (十五)—— i2c1采用DMA方式的读写函数
i2c1采用DMA方式的读写函数 1、关于i2c1的DMA的映射如图 2、关于代码的宏定义配置 Application目录的Makefile中 ENABLE_I2C_TEST yes才会编译I2C1的相关代码。 同时修改i2c.h文件,定义I2C1_MODE为I2C1_MODE_DMA,这样i2c1的配置为dma模式。 #define …...

通知短信 API 技术细节以及发送流程机制原理解析
引言 短信是一种简单、直接、高效的通信方式,被广泛应用于各个领域。在移动互联网时代,短信成为了客户服务、政府通知、公共服务等方面的重要工具。为了更好地利用短信这种通信方式,通知短信 API应运而生。短信API可以帮助企业、政府和应用程…...

Protobuf: 高效数据传输的秘密武器
当涉及到网络通信和数据存储时,数据序列化一直都是一个重要的话题;特别是现在很多公司都在推行微服务,数据序列化更是重中之重,通常会选择使用 JSON 作为数据交换格式,且 JSON 已经成为业界的主流。但是 Google 这么大…...

第五十四章 Unity 移动平台输入(下)
本章节我们介绍一个模拟器插件。这种插件比较多,比如EasyTouch,Lean Touch,Joystick Pack等等。EasyTouch是一个使用非常广泛的插件,支持点击,拖拽,遥感等很多常用功能。不过遗憾的是,该插件已经…...

KD305Y带吸收比极化指数兆欧表
一、概述 KD305Y绝缘电阻测试仪对众多的电力设备如:电缆、电机、发电机、变压器、互感器、高压开关、避雷器等要求做一系列的绝缘性能试验,首先是要做绝缘电阻测试。近年来随着电力事业的飞速发展,大容量设备的使用不断增加,用普通的兆欧表无…...

磁盘空间不足怎么办?释放磁盘空间的4种方法
虽然现在硬盘的空间越来越大,但是在这个数据爆炸的时代中,总是会觉得存储空间不够用,一不注意磁盘就满了,那么除了清空回收站、卸载某些程序外,还能怎么释放磁盘空间呢? 方案一:禁用休眠 休眠是…...

ChatGPT调教指北,技巧就是效率!
技巧就是效率 很多人都知道ChatGPT很火很强,几乎无所不能,但跨越了重重门槛之才有机会使用的时候却有些迷茫,一时间不知道如何使用它。如果你就是把他当作一个普通的智能助手来看待,那与小爱同学有什么区别?甚至还差劲…...
Android启动流程(五)——init进程对子进程的监控
init进程会读取rc文件,然后孵化很多其他系统服务进程,为防止子进程死亡后称为僵尸进程,init需要监测子进程是否死亡,如果死亡,则清除子进程资源,并重新拉起进程。 system/core/init/init.cpp InstallSigna…...

Python每日一练:蚂蚁家族(详解集合法)
文章目录 前言一、题目二、代码分析总结 前言 这题挺有意思,感觉评简单难度有点低了,如果正经用无向图来做,代码还是有点长的。首先得建立节点,估计除第一个和最后一个每个节点都是一条线连进,一条线连出的。就可以这…...

图神经网络:在KarateClub数据集上动手实现图神经网络
文章说明: 1)参考资料:PYG官方文档。超链。 2)博主水平不高,如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 文献阅读:代码实操: 文献阅读: 参考文…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...