当前位置:   article > 正文

Nginx服务器及其配置与应用

nginx服务器

目录

一、Nginx的特点

1.高并发

2.低消耗

3.低消耗

4.高可用

5.高扩展

6.Nginx与Apache的差异

7.Nginx与Apache的区别

二、Linux中的I/O

1.I/O介绍

2.同步/异步

3.阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

三、编译安装Nginx服务

1.关闭防火墙,将安装 ngnix 所需的软件包上传到 /opt 目录下

  2.安装依赖包

 3、创建运行用户、组

4.编译安装Nginx

 5.检查、启动、重启、停止 nginx服务

 6.添加 Nginx 系统服务

方法一:

方法二:

 四、认识Nginx服务的主配置文件 nginx.conf

1.查看nginx配置文件

 2.全局配置

3.I/O 事件配置

4.HTTP 配置

 5.日志格式设定

(1)设置root根路径配置 

(2) 设置alias别名配置

 五、访问状态统计配置

 1.查看是否包含 HTTP_STUB_STATUS 模块

 2.修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置

 3.访问测试

4.事例:用脚本一键查询并发量

六:基于授权的访问控制

1.生成用户密码认证文件

 2.修改主配置文件相对应目录,添加认证配置项

 3.重启服务,访问测试

七: 基于客户端的访问控制

 八:基于域名的 Nginx 虚拟主机

1.为虚拟主机提供域名解析

2.为虚拟主机准备网页文档

 3.修改Nginx的配置文件

 4.重启服务,访问测试

 九:基于IP 的 Nginx 虚拟主机

十: 基于端口的 Nginx 虚拟主机

 总结:Nginx 和 Apache 的差异


一、Nginx的特点

1.高并发

一个Nginx服务器在不做任何配置的情况下并发量可达1000左右。在硬件条件允许的前提下,Nginx可以支持高达5-10万的并发量(除了Nginx的设置外,Linux主机需要做大量的设置来配合Nginx)。
对比一下Tomcat。Tomcat服务器默认的并发量为150(不做任何配置)。即,当有超过150个用户同时访问某Servlet时,Tomcat的响应就会变得非常慢

2.低消耗

官方给出的测试结果,10000个非活跃连接,在Nginx中仅消耗2.5M内存。对于一般性的DoS攻击来说就不是事儿,但对于DDoS也会是问题

3.低消耗

可以在7*24小时不间断服务的前提下,进行Nginx版本的平滑升级,Nginx配置文件的平滑修改。即在不停机的情况下升级Nginx,修改替换Nginx配置文件。

4.高可用

Nginx之所以可以实现高并发,是因为其具有很多工作进程worker。当这些工作进程中的某些出现问题停止工作时,并不会影响整个系统的整体运行。因为其它worker会接替那些出问题的线程

5.高扩展

Nginx只所以现在的用户很多,是因为很多功能都已经开发好并模块化。若需要哪些功能,只需要安装相应功能的扩展模块即可。根据编写扩展模块所使用的语言的不同,可以划分为两类:C语言扩展模块与LUA脚本扩展模块。

6.Nginx与Apache的差异

  1. Nginx是一个基于`事件的`Web服务器,Apache是一个基于`流程的`服务器;
  2. Nginx`所有请求都由一个线程处理`Apache`单个线程处理单个请求`;
  3. Nginx`避免`子进程的概念,Apache`基于`子进程的;
  4. Nginx在内存消耗和连接方面更好,Apache在内存消耗和连接方面一般;
  5. Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于CPU和内存等硬件;
  6. Nginx支持`热部署`Apache`不支持热部署`;
  7. Nginx对于静态文件处理`具有更高效率`Apache相对一般;
  8. Nginx`反向代理场景具有明显优势`Apache相对一般。
  9. nginx配置简洁, apache较复杂
  10. 总的来说,apache依然是大部分公司的首选。

7.Nginx与Apache的区别

apache相对于nginx的优点∶

  • Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)
  • 模块多,基本想到的都可以找到
  • 少bug, nginx的bug相对较多
  • 超稳定

nginx相对于apache的优点∶

  • 轻量级,同样起web服务,比apache占用更少的内存及资源
  • 抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的在高并发下,nginx能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简

:一般来说,需要性能的web服务,用nginx。若不需要性能只求稳定,就选用apache。
 

二、Linux中的I/O

1.I/O介绍

I/O在计算机中指Input/Output,lOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的IO请求数量为单位,I/O请求通常为读或写数据操作请求。

一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy到用户空间的进程内存当中,所以简单说I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。

  • 磁盘I/O:buff/cache 的区别

  • 网络I/O:一切皆文件,本质为对socket文件的读写

获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3)
构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4)
返回数据,服务器将已构建好的响应再通过内核空间的网络I/0发还给客户端(5-7) 

2.同步/异步

关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。

  • 同步: synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
  • 异步: asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态

3.阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

阻塞: blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
非阻塞: nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
 

三、编译安装Nginx服务

1.关闭防火墙,将安装 ngnix 所需的软件包上传到 /opt 目录下

  1. systemctl stop firewalld
  2. systemctl disable firewalld
  3. setenforce 0
  4. cd /opt
  5. nginx-1.24.0.tar.gz

  2.安装依赖包

nginx 的配置及运行需要 pcre、zlib 等软件包的支持,因此需要安装这些安装的开发包,以便提供相应的库和头文件

yum -y install pcre-devel zlib-devel gcc gcc-c++ make

 3、创建运行用户、组

Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限

useradd -M -s /sbin/nologin nginx

4.编译安装Nginx

  1. cd /opt
  2. tar zxvf nginx-1.24.0.tar.gz -C /opt/
  3. cd /opt/nginx-1.24.0/
  4. ./configure \
  5. --prefix=/usr/local/nginx \
  6. --user=nginx \
  7. --group=nginx \
  8. --with-http_stub_status_module
  9. #上面命令每行相关解释
  10. cd nginx-1.24.0/
  11. ./configure \
  12. --prefix=/usr/local/nginx \ #指定nginx的安装路径
  13. --user=nginx \ #指定用户名
  14. --group=nginx \ #指定组名
  15. --with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计
  16. make && make install
  17. ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #让系统识别nginx的操作命令

 

 5.检查、启动、重启、停止 nginx服务

  1. nginx -t #检查配置文件是否配置正确
  2. nginx #启动nginx
  3. cat /usr/local/nginx/logs/nginx.pid #先查看nginx的PID号
  4. kill -3 <PID号>
  5. kill -s QUIT <PID号> #停止相关进程
  6. killall -3 nginx
  7. killall -s QUIT nginx
  8. kill -1 <PID号> #重载
  9. kill -s HUP <PID号>
  10. killall -1 nginx
  11. killall -s HUP nginx
  12. #日志分隔,重新打开日志文件
  13. kill -USR1 <PID号>
  14. #平滑升级
  15. kill -USR2 <PID号>

  • Master进程主要负责启动和管理worker进程,包括接收信号、启动、停止和重启worker进程等。Master进程只有一个,它的主要作用是协调和管理worker进程的运行。
  • Worker进程则负责处理客户端请求,包括接收请求、处理请求和响应请求等。Worker进程可以有多个,每个Worker进程都是独立的,它们之间没有共享内存,因此可以并行处理多个请求,提高Nginx的性能。
  • 总之,Master进程负责管理和控制Worker进程,而Worker进程负责处理客户端请求。通过这种多进程的方式,Nginx可以高效地处理大量并发请求。

 6.添加 Nginx 系统服务

方法一:

  1. vim /etc/init.d/nginx
  2. #!/bin/bash
  3. # chkconfig: - 99 20
  4. # description: Nginx Service Control Script
  5. COM="/usr/local/nginx/sbin/nginx"
  6. PID="/usr/local/nginx/logs/nginx.pid"
  7. case "$1" in
  8. start)
  9. $COM
  10. ;;
  11. stop)
  12. kill -s QUIT $(cat $PID)
  13. ;;
  14. restart)
  15. $0 stop
  16. $0 start
  17. ;;
  18. reload)
  19. kill -s HUP $(cat $PID)
  20. ;;
  21. *)
  22. echo "Usage: $0 {start|stop|restart|reload}"
  23. exit 1
  24. esac
  25. exit 0
  1. chmod +x /etc/init.d/nginx
  2. chkconfig --add nginx #添加为系统服务
  3. systemctl stop nginx
  4. systemctl start nginx

方法二:

  1. vim /lib/systemd/system/nginx.service
  2. [Unit]
  3. Description=nginx
  4. After=network.target
  5. [Service]
  6. Type=forking
  7. PIDFile =/usr/local/nginx/logs/nginx.pid
  8. ExecStart=/usr/local/nginx/sbin/nginx
  9. ExecReload=/bin/kill -s HUP $MAINPID
  10. ExecStop=/bin/kill -s QUIT $MAINPID
  11. PrivateTmp=true
  12. [Install]
  13. WantedBy=multi-user.target
  14. ---------------------------------------------------------
  15. #每行意义
  16. [Unit]
  17. Description=nginx #描述
  18. After=network.target #描述服务类别
  19. [Service]
  20. Type=forking #后台运行形势
  21. PIDFile =/usr/local/nginx/logs/nginx.pid #PID文件位置
  22. ExecStart=/usr/local/nginx/sbin/nginx #启动服务
  23. ExecrReload=/bin/kill -s HUP $MAINPID #根据PID重载配置
  24. ExecrStop=/bin/kill -s QUIT $MAINPID #根据PID终止进程
  25. PrivateTmp=true
  26. [Install]
  27. WantedBy=multi-user.target
  1. chmod 754 /lib/systemd/system/nginx.service #设置754权限是一种安全优化
  2. systemctl start nginx.service
  3. systemctl enable nginx.service

 

 四、认识Nginx服务的主配置文件 nginx.conf

1.查看nginx配置文件

vim /usr/local/nginx/conf/nginx.conf 

 2.全局配置

  1. #user nobody;                     #运行用户,若编译时未指定则默认为 nobody
  2. worker_processes 1;             #工作进程数量,可配置成服务器内核数 * 2
  3. #error_log logs/error.log;         #错误日志文件的位置
  4. #pid logs/nginx.pid;             #PID 文件的位置

3.I/O 事件配置

  1. events {
  2. use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
  3. worker_connections 4096; #每个进程处理 4096 个连接
  4. }
  5. #如提高每个进程的连接数还需执行“ulimit -n 65535”命令临时修改本地每个进程可以同时打开的最大文件数。
  6. #在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
  7. #可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制.

 

 

 4.HTTP 配置

  1. http {
  2. ##文件扩展名与文件类型映射表
  3. include mime.types;
  4. ##默认文件类型
  5. default_type application/octet-stream;
  6. ##日志格式设定
  7. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  8. # '$status $body_bytes_sent "$http_referer" '
  9. # '"$http_user_agent" "$http_x_forwarded_for"';
  10. ##访问日志位置
  11. #access_log logs/access.log main;
  12. ##支持文件发送(下载)
  13. sendfile on;
  14. ##此选项允许或禁止使用socke的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
  15. #tcp_nopush on;
  16. ##连接保持超时时间,单位是秒
  17. #keepalive_timeout 0;
  18. keepalive_timeout 65;
  19. ##gzip模块设置,设置是否开启gzip压缩输出
  20. #gzip on;
  21. ##Web 服务的监听配置
  22. server {
  23. ##监听地址及端口
  24. listen 80;
  25. ##站点域名,可以有多个,用空格隔开
  26. server_name www.mhh.com;
  27. ##网页的默认字符集
  28. charset utf-8;
  29. ##根目录配置
  30. location / {
  31. ##网站根目录的位置/usr/local/nginx/html
  32. root html;
  33. ##默认首页文件名
  34. index index.html index.htm;
  35. }
  36. ##内部错误的反馈页面
  37. error_page 500 502 503 504 /50x.html;
  38. ##错误页面配置
  39. location = /50x.html {
  40. root html;
  41. }
  42. }
  43. }

  1. #重启服务,使修改的配置生效
  2. [root@bogon nginx-1.24.0]# systemctl restart nginx.servic
  3. [root@bogon nginx-1.24.0]# cat /etc/hosts #查看IP与域名映射关系
  4. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  5. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  6. #添加主机IP与域名映射关系
  7. [root@bogon nginx-1.24.0]# echo "192.168.231.102 www.mhh.com" >> /etc/hosts
  8. [root@bogon nginx-1.24.0]# cat /etc/hosts
  9. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  10. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  11. 192.168.231.102 www.mhh.com #添加成功

 

 5.日志格式设定

  1. $remote_addr$http_x_forwarded_for用以记录客户端的ip地址;
  2. $remote_user:用来记录客户端用户名称;
  3. $time_local: 用来记录访问时间与时区;
  4. $request: 用来记录请求的url与http协议;
  5. $status: 用来记录请求状态;成功是200
  6. $body_bytes_sent :记录发送给客户端文件主体内容大小;
  7. $http_referer:用来记录从那个页面链接访问过来的;
  8. $http_user_agent:记录客户浏览器的相关信息;
  9. 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

  1. location常见配置指令,root、alias、proxy_pass
  2. root(根路径配置):请求www.mhh.com/test,会返回文件/usr/local/nginx/html/test/index.html
  3. alias(别名配置):请求www.mhh.com/test,会返回文件/usr/local/nginx/html/index.html

(1)设置root根路径配置 

 虚拟机浏览器访问http://192.168.231.102/test

(2) 设置alias别名配置

 

 

 五、访问状态统计配置

nginx 内置了 HTTP_STUB_STATUS 状态统计模块,用来反馈当前的 Web 访问情况, 配置编译参数时可添加–with-http_stub_status_module 来启用此模块支持

 1.查看是否包含 HTTP_STUB_STATUS 模块

/usr/local/nginx/sbin/nginx -V #查看版本号

 2.修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置

  1. cd /usr/local/nginx/conf
  2. cp nginx.conf nginx.conf.bak
  3. vim /usr/local/nginx/conf/nginx.conf
  4. ......
  5. http {
  6. ......
  7. server {
  8. listen 80;
  9. server_name www.mhh.com;
  10. charset utf-8;
  11. location / {
  12. root html;
  13. index index.html index.php;
  14. }
  15. ##添加 stub_status 配置##
  16. location /status { #访问位置为/status
  17. stub_status on; #打开状态统计功能
  18. access_log off; #关闭此位置的日志记录
  19. }
  20. }
  21. }

 

 3.访问测试

浏览器访问 http://192.168.231.102/status
Active connections :表示当前的活动连接数;
server accepts handled requests :表示已经处理的连接信息,

三个数字依次表示服务器已接收的连接数;服务器成功处理的连接数;服务器累计处理的总请求数(在保持连接模式下,请求数量可能会大于连接数量)
Reading:表示当前正在从客户端读取数据的连接数。
Writing:表示当前正在向客户端写入数据的连接数。
Waiting:表示当前空闲并等待请求的连接数。

刷新一次已处理的请求数加1。

 4.事例:用脚本一键查询并发量

要求:每10秒获取并发量大于2时,发送预警

  1. [root@bogon ~]# vim a.sh
  2. #!/bin/bash
  3. while true
  4. do
  5. #筛选静态状态的第三部分
  6. a=$(curl -Ls 192.168.231.102/status | awk '/Active connections/{print $3}')
  7. if [ $a -gt 2 ];then
  8. echo "警报!当前并发连续过高!当前并发数为:$a"
  9. fi
  10. sleep 10 #睡眠10秒
  11. done
  12. ~

 用另一台虚拟机登录访问,后运行脚本

六:基于授权的访问控制

1.生成用户密码认证文件

  1. yum install -y httpd-tools
  2. htpasswd -c /usr/local/nginx/passwd.db zhangsan
  3. chown nginx /usr/local/nginx/passwd.db
  4. chmod 400 /usr/local/nginx/passwd.db

 2.修改主配置文件相对应目录,添加认证配置项

  1. vim /usr/local/nginx/conf/nginx.conf
  2. ......
  3. server {
  4. location / {
  5. ......
  6. ##添加认证配置##
  7. auth_basic "secret"; #设置密码提示框文字信息
  8. auth_basic_user_file /usr/local/nginx/passwd.db;
  9. }
  10. }

 3.重启服务,访问测试

  1. nginx -t
  2. systemctl restart nginx
  3. 浏览器访问 http://192.168.231.102

七: 基于客户端的访问控制

  1. 访问控制规则如下:
  2. deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
  3. allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
  4. 规则从上往下执行,如匹配则停止,不再往下匹配。
  5. vim /usr/local/nginx/conf/nginx.conf
  6. ......
  7. server {
  8. location / {
  9. ......
  10. ##添加控制规则##
  11. allow 192.168.80.200; #允许访问的客户端 IP
  12. deny all; #拒绝其它IP客户端访问
  13. }
  14. }
  15. systemctl restart nginx

 八:基于域名的 Nginx 虚拟主机

1.为虚拟主机提供域名解析

echo "192.168.2.8 www.mhh.com www.accp.com" >> /etc/hosts

2.为虚拟主机准备网页文档

  1. mkdir -p /var/www/html/mhh
  2. mkdir -p /var/www/html/accp
  3. echo "<h1>www.mhh.com</h1>" > /var/www/html/mhh/index.html
  4. echo "<h1>www.accp.com</h1>" > /var/www/html/accp/index.html

 3.修改Nginx的配置文件

  1. vim /usr/local/nginx/conf/nginx.conf
  2. :35, 79 co 80
  3. ......
  4. http {
  5. ......
  6. server {
  7. listen 80;
  8. server_name www.abc.com; #设置域名www.kgc.com
  9. charset utf-8;
  10. access_log logs/www.abc.access.log; #设置日志名
  11. location / {
  12. root /var/www/html/abc; #设置www.kgc.com 的工作目录
  13. index index.html index.php;
  14. }
  15. error_page 500 502 503 504 /50x.html;
  16. location = 50x.html{
  17. root html;
  18. }
  19. }
  20. server {
  21. listen 80;
  22. server_name www.benet.com; #设置域名www.benet.com
  23. charset utf-8;
  24. access_log logs/www.benet.access.log;
  25. location / {
  26. root /var/www/html/benet;
  27. index index.html index.php;
  28. }
  29. error_page 500 502 503 504 /50x.html;
  30. location = 50x.html{
  31. root html;
  32. }
  33. }
  34. }

 4.重启服务,访问测试

  1. systemctl restart nginx
  2. 浏览器访问
  3. http://www.abc.com
  4. http://www.benet.com

 

 

 九:基于IP 的 Nginx 虚拟主机

  1. ifconfig ens33:0 192.168.2.88 netmask 255.255.255.0
  2. vim /usr/local/nginx/conf/nginx.conf
  3. ......
  4. http {
  5. ......
  6. server {
  7. listen 192.168.2.8:80; #设置监听地址
  8. server_name www.mhh.com;
  9. charset utf-8;
  10. access_log logs/www.mhh.access.log;
  11. location / {
  12. root /var/www/html/mhh;
  13. index index.html index.php;
  14. }
  15. error_page 500 502 503 504 /50x.html;
  16. location = 50x.html{
  17. root html;
  18. }
  19. }
  20. server {
  21. listen 192.168.2.88:80; #设置监听地址
  22. server_name www.accp.com;
  23. charset utf-8;
  24. access_log logs/www.accp.access.log;
  25. location / {
  26. root /var/www/html/accp;
  27. index index.html index.php;
  28. }
  29. error_page 500 502 503 504 /50x.html;
  30. location = 50x.html{
  31. root html;
  32. }
  33. }
  34. }
  35. systemctl restart nginx

 

 

十: 基于端口的 Nginx 虚拟主机

  1. vim /usr/local/nginx/conf/nginx.conf
  2. ......
  3. http {
  4. ......
  5. server {
  6. listen 192.168.2.8:8080; #设置监听地址
  7. server_name www.mhh.com;
  8. charset utf-8;
  9. access_log logs/www.mhh.access.log;
  10. location / {
  11. root /var/www/html/mhh;
  12. index index.html index.php;
  13. }
  14. error_page 500 502 503 504 /50x.html;
  15. location = 50x.html{
  16. root html;
  17. }
  18. }
  19. server {
  20. listen 192.168.2.8:8888; #设置监听地址
  21. server_name www.accp.com;
  22. charset utf-8;
  23. access_log logs/www.accp.access.log;
  24. location / {
  25. root /var/www/html/accp;
  26. index index.html index.php;
  27. }
  28. error_page 500 502 503 504 /50x.html;
  29. location = 50x.html{
  30. root html;
  31. }
  32. }
  33. }
  34. systemctl restart nginx

 

 

 总结:Nginx 和 Apache 的差异

轻量级,nginx比apache 占用更少的内存及资源;
静态处理,Nginx 静态处理性能比 Apache 高 ;
Nginx可以实现无缓存的反向代理加速,提高网站运行速度;
Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于硬件;
Nginx支持热部署,启动速度迅速,可以在不间断服务的情况下,对软件版本或者配置进行升级;
nginx是异步进程,多个连接可以对应一个进程 ;apache是同步多进程,一个连接对应一个进程;
Nginx高度模块化,编写模块相对简单,且组件比Apache少
高并发下nginx 能保持低资源低消耗高性能;
Nginx 配置简洁, Apache配置复杂;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/207283
推荐阅读
相关标签
  

闽ICP备14008679号