就是要让你搞懂Nginx,这篇就够了! 朴灿烈づ我的快乐病毒、 2023-01-20 10:56 155阅读 0赞 来自:开源世界,作者:博主° 链接:[http://ym.baisou.ltd/?id=498][http_ym.baisou.ltd_id_498] Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发,性能是其最重要的要求,十分注重效率,有报告 Nginx 能支持高达 50000 个并发连接数。 Nginx 知识网结构图 Nginx 的知识网结构图如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70] 反向代理 正向代理:局域网中的电脑用户想要直接访问网络是不可行的,只能通过代理服务器来访问,这种代理服务就被称为正向代理。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 1] 反向代理:客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端。 此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 2] 负载均衡 客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕之后,再将结果返回给客户端。 普通请求和响应过程如下图: ![在这里插入图片描述][20210512182306557.png] 但是随着信息数量增长,访问量和数据量飞速增长,普通架构无法满足现在的需求。 我们首先想到的是升级服务器配置,可以由于摩尔定律的日益失效,单纯从硬件提升性能已经逐渐不可取了,怎么解决这种需求呢? 我们可以增加服务器的数量,构建集群,将请求分发到各个服务器上,将原来请求集中到单个服务器的情况改为请求分发到多个服务器,也就是我们说的负载均衡。 图解负载均衡: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 3] 假设有 15 个请求发送到代理服务器,那么由代理服务器根据服务器数量,平均分配,每个服务器处理 5 个请求,这个过程就叫做负载均衡。 动静分离 为了加快网站的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,加快解析的速度,降低由单个服务器的压力。 动静分离之前的状态: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 4] 动静分离之后: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 5] Nginx 如何在 Linux 安装 参考链接: [https://blog.csdn.net/yujing1314/article/details/97267369][https_blog.csdn.net_yujing1314_article_details_97267369] Nginx 常用命令 查看版本: ./nginx -v 启动: ./nginx 关闭(有两种方式,推荐使用 ./nginx -s quit): ./nginx -s stop ./nginx -s quit 重新加载 Nginx 配置: ./nginx -s reload Nginx 的配置文件 配置文件分三部分组成: ①全局块 从配置文件开始到 events 块之间,主要是设置一些影响 Nginx 服务器整体运行的配置指令。 并发处理服务的配置,值越大,可以支持的并发处理量越多,但是会受到硬件、软件等设备的制约。 ![在这里插入图片描述][20210512182517808.png] ②events 块 影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 workprocess 下的网络连接进行序列化,是否允许同时接收多个网络连接等等。 支持的最大连接数: ![在这里插入图片描述][20210512182522698.png] ③HTTP 块 诸如反向代理和负载均衡都在此配置。 location\[ = | ~ | ~\* | ^~\] url\{ \} location 指令说明,该语法用来匹配 url,语法如上: =:用于不含正则表达式的 url 前,要求字符串与 url 严格匹配,匹配成功就停止向下搜索并处理请求。 ~:用于表示 url 包含正则表达式,并且区分大小写。 ~\*:用于表示 url 包含正则表达式,并且不区分大小写。 ^~:用于不含正则表达式的 url 前,要求 Nginx 服务器找到表示 url 和字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再匹配。 如果有 url 包含正则表达式,不需要有 ~ 开头标识。 反向代理实战 ①配置反向代理 目的:在浏览器地址栏输入地址 www.123.com 跳转 Linux 系统 Tomcat 主页面。 ②具体实现 先配置 Tomcat,因为比较简单,此处不再赘叙,并在 Windows 访问: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 6] 具体流程如下图: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 7] 修改之前: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 8] 配置如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 9] 再次访问: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 10] ③反向代理 2 目标: 访问 http://192.168.25.132:9001/edu/ 直接跳转到 192.168.25.132:8080 访问 http://192.168.25.132:9001/vod/ 直接跳转到 192.168.25.132:8081 准备:配置两个 Tomcat,端口分别为 8080 和 8081,都可以访问,端口修改配置文件即可。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 11] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 12] 新建文件内容分别添加 8080!!!和 8081!!! ![在这里插入图片描述][20210512182631524.png] ![在这里插入图片描述][20210512182634678.png] 响应如下图: ![在这里插入图片描述][20210512182639125.png] ![在这里插入图片描述][20210512182642638.png] 具体配置如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 13] 重新加载 Nginx: ./nginx -s reload 访问: ![在这里插入图片描述][20210512182654274.png] ![在这里插入图片描述][20210512182657522.png] 实现了同一个端口代理,通过 edu 和 vod 路径的切换显示不同的页面。 反向代理小结 第一个例子:浏览器访问 www.123.com,由 host 文件解析出服务器 ip 地址 192.168.25.132 www.123.com。 然后默认访问 80 端口,而通过 Nginx 监听 80 端口代理到本地的 8080 端口上,从而实现了访问 www.123.com,最终转发到 tomcat 8080 上去。 第二个例子: 访问 http://192.168.25.132:9001/edu/ 直接跳转到 192.168.25.132:8080 访问 http://192.168.25.132:9001/vod/ 直接跳转到 192.168.25.132:8081 实际上就是通过 Nginx 监听 9001 端口,然后通过正则表达式选择转发到 8080 还是 8081 的 Tomcat 上去。 负载均衡实战 ①修改 nginx.conf,如下图: ![在这里插入图片描述][20210512182708253.png] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 14] ②重启 Nginx: ./nginx -s reload ③在 8081 的 Tomcat 的 webapps 文件夹下新建 edu 文件夹和 a.html 文件,填写内容为 8081!!!! ④在地址栏回车,就会分发到不同的 Tomcat 服务器上: ![在这里插入图片描述][20210512182733211.png] ![在这里插入图片描述][20210512182737232.png] 负载均衡方式如下: 轮询(默认)。 weight,代表权,权越高优先级越高。 fair,按后端服务器的响应时间来分配请求,相应时间短的优先分配。 ip\_hash,每个请求按照访问 ip 的 hash 结果分配,这样每一个访客固定的访问一个后端服务器,可以解决 Session 的问题。 ![在这里插入图片描述][20210512182742849.png] ![在这里插入图片描述][20210512182746322.png] ![在这里插入图片描述][20210512182749940.png] 动静分离实战 什么是动静分离?把动态请求和静态请求分开,不是讲动态页面和静态页面物理分离,可以理解为 Nginx 处理静态页面,Tomcat 处理动态页面。 动静分离大致分为两种: 纯粹将静态文件独立成单独域名放在独立的服务器上,也是目前主流方案。 将动态跟静态文件混合在一起发布,通过 Nginx 分开。 动静分离图析: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 15] 实战准备,准备静态文件: ![在这里插入图片描述][20210512182811946.png] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 16] 配置 Nginx,如下图: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 17] Nginx 高可用 如果 Nginx 出现问题: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 18] 解决办法: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 19] 前期准备: 两台 Nginx 服务器 安装 Keepalived 虚拟 ip 安装 Keepalived: \[root@192 usr\]\# yum install keepalived -y \[root@192 usr\]\# rpm -q -a keepalived keepalived-1.3.5-16.el7.x86\_64 修改配置文件: \[root@192 keepalived\]\# cd /etc/keepalived \[root@192 keepalived\]\# vi keepalived.conf 分别将如下配置文件复制粘贴,覆盖掉 keepalived.conf,虚拟 ip 为 192.168.25.50。 对应主机 ip 需要修改的是: smtp\_server 192.168.25.147(主)smtp\_server 192.168.25.147(备) state MASTER(主) state BACKUP(备) global\_defs \{ notification\_email \{ acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc \} notification\_email\_from Alexandre.Cassen@firewall.loc smtp\_server 192.168.25.147 smtp\_connect\_timeout 30 router\_id LVS\_DEVEL \# 访问的主机地址 \} vrrp\_script chk\_nginx \{ script “/usr/local/src/nginx\_check.sh” \# 检测文件的地址 interval 2 \# 检测脚本执行的间隔 weight 2 \# 权重 \} vrrp\_instance VI\_1 \{ state BACKUP \# 主机MASTER、备机BACKUP interface ens33 \# 网卡 virtual\_router\_id 51 \# 同一组需一致 priority 90 \# 访问优先级,主机值较大,备机较小 advert\_int 1 authentication \{ auth\_type PASS auth\_pass 1111 \} virtual\_ipaddress \{ 192.168.25.50 \# 虚拟ip \} \} 启动代码如下: \[root@192 sbin\]\# systemctl start keepalived.service ![在这里插入图片描述][20210512182900930.png] 访问虚拟 ip 成功: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 20] 关闭主机 147 的 Nginx 和 Keepalived,发现仍然可以访问。 原理解析 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 21] 如下图,就是启动了一个 master,一个 worker,master 是管理员,worker是具体工作的进程。 ![在这里插入图片描述][20210512182923532.png] worker 如何工作?如下图: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 22] 小结 worker 数应该和 CPU 数相等;一个 master 多个 worker 可以使用热部署,同时 worker 是独立的,一个挂了不会影响其他的。 [http_ym.baisou.ltd_id_498]: http://ym.baisou.ltd/?id=498 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70]: /images/20221021/aad0ebc4f4ff444e85f3bfafacac95a7.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 1]: /images/20221021/ca1fd5df179345e5b98dde2980840b03.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 2]: /images/20221021/3a167fb5e4d14847ac08ae0d1da409c5.png [20210512182306557.png]: /images/20221021/f9c686becaeb4de5a1784d8827f4c0a6.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 3]: /images/20221021/7e5631cfd9f44c30b107ecd69af0b930.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 4]: /images/20221021/13620600d9714eaeb8f718aaf7840f9b.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 5]: /images/20221021/7a8d905e312e49a1afd9268558f4f059.png [https_blog.csdn.net_yujing1314_article_details_97267369]: http://github.crmeb.net/u/defu [20210512182517808.png]: /images/20221021/299d43eac9fc43a19d2b410e7aa81acb.png [20210512182522698.png]: /images/20221021/47de14aa5fbb4abb9d828722eb1f8c01.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 6]: /images/20221021/7e89dbf0d7764f6c9c050e0ab21f999a.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 7]: /images/20221021/d3f85aebfe4f4f4f95a078d1d2cbd780.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 8]: /images/20221021/ab17ab0713c04e1383a8067c78cae657.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 9]: /images/20221021/99007eebae764bbca77e81ff83652f72.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 10]: /images/20221021/1603f355549340e580d113039d00c74b.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 11]: /images/20221021/1f686f97b0bf4a5d828928cbcbdeecc6.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 12]: /images/20221021/c0b7f0575b8a408eb8d947f6907eaf71.png [20210512182631524.png]: /images/20221021/f6d5b76405b548ab859af0b6aa0bda04.png [20210512182634678.png]: /images/20221021/432a9388f2f84036a596256cbeed19bf.png [20210512182639125.png]: /images/20221021/5bb889150f314846a04b738045787d0c.png [20210512182642638.png]: /images/20221021/9bde3dfce01b4892857cd314ff8b99a9.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 13]: /images/20221021/4fe9ef572e9e4021afcdd39ff03ce3b8.png [20210512182654274.png]: /images/20221021/f0b8f89705ac4e5896bcc4d35f7e9581.png [20210512182657522.png]: /images/20221021/358601dc01fa4d87882552e9547fc1dd.png [20210512182708253.png]: /images/20221021/82140404fa034c44b4dbbd6aec7806e1.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 14]: /images/20221021/6c8c1a70250c4311a4396844fe4bd151.png [20210512182733211.png]: /images/20221021/b5aa453e21914d398831ca785481c5df.png [20210512182737232.png]: /images/20221021/c6c04c0496514312962c27b16c0313ec.png [20210512182742849.png]: /images/20221021/a880c52ebedb49e5b94a41dd4a2490ae.png [20210512182746322.png]: /images/20221021/ce9d4467f68447ddb087d3f5762ce8ee.png [20210512182749940.png]: /images/20221021/c217b2e0914147fba06e18f4f608d645.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 15]: /images/20221021/389065978b764ca2ad16634fd3149ddd.png [20210512182811946.png]: /images/20221021/fae045661ce345bcac1689c860d4071f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 16]: /images/20221021/c0bb8686533e45188b31ad407dce69c9.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 17]: /images/20221021/bb92cdcea3d44d9c81f617ba75759c8d.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 18]: /images/20221021/a540f97d6ff943d99bdf0b2417678a2c.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 19]: /images/20221021/5ad9ad5c8b0842ec9e70c165fddca243.png [20210512182900930.png]: /images/20221021/e8d2442c651c4e93a7885aa13ae57f91.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 20]: /images/20221021/bf06bafa91f44d7687031f90faa28753.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 21]: /images/20221021/01204a299ccb43f1947e00561c85f023.png [20210512182923532.png]: /images/20221021/e593dbaa70654183aeca5a9e4be27994.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjIxNDM2_size_16_color_FFFFFF_t_70 22]: /images/20221021/644b4d48edbf42b9baeac4d05744082c.png
还没有评论,来说两句吧...