当前位置: 首页 > article >正文

Nginx整理

1.1Nginx 概述和安装

1.1.1Nginx 介绍

Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus ) 2019年3月11日 F5 Networks 6.7亿美元的价格收购 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务 器 解决C10K问题(10K Connections)

Nginx官网: http://nginx.org

nginx的其它的二次发行版:

  • Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加 了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了 很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始, Tengine成为一个开源项目官网: http://tengine.taobao.org/
  • OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,

         官网: https://openresty.org/cn/ 

1.1.2 Nginx 功能介绍

  1. 静态的web资源服务器html,图片,js,css,txt等静态资源
  2. http/https协议的反向代理
  3. 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  4. tcp/udp协议的请求转发(反向代理)
  5. imap4/pop3协议的反向代理

1.2 Nginx安装

1.2.1 Nginx获取

  1. 网站获取下载链接,用wget命令下载
  2. 提前准备好安装包,传入并下载

我这里使用方法2,自备安装包后传入进行安装

对包进行解压缩:

[root@nginx ~]# tar zxf nginx-1.24.0.tar.gz 

可以看到nginx的目录解压出来了

1.2.2 编译安装 Nginx

进入目录文件后进行编译安装:
 

[root@nginx nginx-1.24.0]# ./configure \

> --prefix=/usr/local/nginx \                         # 设置 Nginx 的安装路径为 /usr/local/nginx
> --user=nginx \                                       # 指定 Nginx 进程将以 nginx 用户身份运行
> --group=nginx \                                        # 指定 Nginx 进程的组为 nginx

> --with-http_ssl_module \                       # 启用 HTTP SSL 模块
> --with-http_v2_module \                      # 启用 HTTP/2 模块,支持 HTTP/2 协议
> --with-http_realip_module \                #支持ip透传     
> --with-http_gzip_static_module \       #支持压缩      
> --with-http_stub_status_module \         #支持状态页面 
> --with-pcre \                                           #支持正则
> --with-stream \                                    #支持tcp反向代理
> --with-stream_ssl_module                       #支持tcp的ssl加密

显示需要编译器:

安装 *gcc:

[root@nginx nginx-1.24.0]# dnf install gcc -y

再次执行检测命令:

显示需要安装pcre:

查询pcre:

[root@nginx nginx-1.24.0]# dnf search pcre

找到我们要安装的包:

安装pcre:

[root@nginx nginx-1.24.0]# dnf install pcre-devel.x86_64 -y

再次进行检测;显示还是需要安装openssl

查询要安装的包:

进行安装:

[root@nginx nginx-1.24.0]# dnf install openssl-devel.x86_64 -y

再次进行检测,显示缺少zlib:

查询并进行安装:

 [root@nginx nginx-1.24.0]# dnf install zlib-devel.x86_64 -y

再次进行检测:

显示检测完成:

可以看到生成了两个文件

进行编译:

[root@nginx nginx-1.24.0]# make 

没有显示错误,编译完成;

make install安装

[root@nginx nginx-1.24.0]# make install

nginx完成安装以后,有四个主要的目录

  • conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他 的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params 两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀 去掉即可。
  • html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web 文件是默认的错误页面提示页面。
  • logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比 如/var/logs/nginx里面。
  • sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。

此时建立个之前指定的用户:

[root@nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx

1.2.3 清除编译内容(可选)

如果想要回退到编译之前的环境

[root@nginx nginx-1.26.1]# make clean

1.2.4 配置nginx环境变量

[root@nginx nginx-1.24.0]# vim ~/.bash_profile 

更新当前 shell 的环境变量:

[root@nginx nginx-1.24.0]# source ~/.bash_profile

查看nginx版本:

[root@nginx nginx-1.24.0]# nginx -v

1.2.5 启动nginx


Options:
-?,-h                               : this help
-v                                   : show version and exit
-V                                  : show version and configure options then exit #显示版本和编译参数
-t                                    : test configuration and exit #测试配置文件是否异
-T                                   : test configuration, dump it and exit #测试并打印
-q                                    : suppress non-error messages during configuration testing #静默
                                               模式
-s signal                           : send signal to a master process: stop, quit, reopen, reload #
                                            发送信号,reload信号 会生成新的worker,但master不会重新生成
-p prefix                              : set prefix path (default: /etc/nginx/) #指定Nginx 目录
-c filename                          : set configuration file (default: /etc/nginx/nginx.conf) #
                                                    配置文件路径
-g directives                       : set global directives out of configuration file #设置全局指令,注                                                  意和配置文件不要同时配置,否则冲突
                         

启动nginx:

[root@nginx nginx-1.24.0]# nginx

注意:在这里有个排错示范,本机上有httpd占用了80端口,导致启动nginx时报错:

查看当前所有进程:

将占用80端口的进程杀死:

[root@nginx objs]# kill 981

再次启动并查看,nginx正常启动:

1.3  nginx服务的启动脚本编写

编辑 /lib/systemd/system/ 下的文件,底下的名字自己取

[root@nginx sbin]# vim /lib/systemd/system/nginx.service

重新读取配置:

[root@nginx sbin]# systemctl start nginx

关闭nginx:

[root@nginx sbin]# killall nginx

启动nginx:

[root@nginx sbin]# systemctl start nginx

可以看见配置完成:

1.4 平滑升级和回滚

1.4.1 平滑升级和回滚介绍

  • 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
  • 向master进程发送USR2信号
  • master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
  • master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主 进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进 程的PID存放至新生成的pid文件nginx.pid
  • 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
  • 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
  • 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

1.4.2 实现平滑升级和回滚

1.4.2.1 获取新nginx安装包

我在这已经准备好了新的安装包

进行解压:

[root@nginx ~]# tar zxf nginx-1.26.1.tar.gz 

1.4.2.2 增加新模块(可选)

这里不添加新模块的可以跳过

先准备好新增模块的安装包

进行解压 

[root@nginx ~]# tar zxf echo-nginx-module-0.63.tar.gz 

1.4.2.3 进行编译安装

这是新加的模块,没加的可以忽略

进行编译:

[root@nginx nginx-1.26.1]# make

编译完成:

1.4.2.4 对旧版nginx命令进行备份

来到 /usr/local/nginx/sbin/ 

为了以防万一,对旧版的nginx命令进行备份,以便出现问题能够进行回滚操作

1.4.2.5 将新版的nginx命令替换掉现在的 nginx 

 使用新版nginx命令对现版本的nginx命令进行覆盖操作

[root@nginx sbin]# \cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/

查看替换情况,替换成功

1.4.2.6 进行平滑升级

查看当前nginx的版本:

[root@nginx sbin]# curl -I 172.25.254.100

 当前nginx版本为1.24.0

筛选nginx进程:

[root@nginx sbin]# ps aux |grep nginx

可以看到新版的nginx已经可以看到,但是因为未进行替换升级,只有旧版的master在监听端口

平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的 nginx

#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80

#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进 程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。

[root@nginx sbin]# kill -USR2 7959

再次查看nginx运行状况:

[root@nginx sbin]# ps aux |grep nginx

发现新版的nginx已经上来了

回收旧版本:

[root@nginx sbin]# kill -WINCH 7959

旧进程已经被回收:

查看当前nginx状况:

[root@nginx sbin]# curl -I localhost

版本号已经变更为1.26.1:

1.4.2.7 回滚

 操作与升级类似

  • 先对nginx命令文件进行备份
  • 查看进程,找到老版本端口号

        使用命令:

       [root@Nginx sbin]# kill -HUP 端口号

         将老版本的进程提上来

  • 将新进程杀掉,kill -WINCH 端口号
  •  完成回滚操作

1.4.3 进行平滑升级和回滚时的排错(可选)

发生如下图情况:

进行平滑升级后,新版本进程仍未上来,那么可以进行下面步骤:

将当前的nginx进程杀掉:

然后将我们之前备份的ngin.old 手动回滚:

[root@nginx sbin]# \cp -f /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx

再次启动nginx,版本号显示1.24.0,回滚完毕:

此时再进行平滑升级操作即可。

2.1 Nginx 核心配置详解

2.1.1 配置文件说明

nginx 官方帮助文档:https://nginx.org/en/docs/

Nginx的配置文件的组成部分:

  • 主配置文件:nginx.conf
  • 子配置文件: include conf.d/*.conf
  • fastcgi, uwsgi,scgi 等协议相关的配置文件
  • mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

nginx 配置文件格式说明

配置文件由指令与指令块构成

每条指令以;分号结尾,指令与值之间以空格符号分隔

可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐

指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块

include语句允许组合多个配置文件以提升可维护性

使用#符号添加注释,提高可读性

使用$符号使用变量

部分指令的参数支持正则表达式

Nginx 主配置文件的配置指令方式:

directive value [value2 ...];

注意

(1) 指令必须以分号结尾

(2) 支持使用配置变量

        内建变量:由Nginx模块引入,可直接引用

        自定义变量:由用户使用set命令定义,格式: set variable_name value;

        引用变量:$variable_name

主配置文件结构:四部分

main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}

默认的nginx.conf 配置文件格式说明

[root@nginx sbin]# cat /usr/local/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;                #worker 进程数量

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {                                      #  事件区块
    worker_connections  1024;        #每个worker进程可以处理的连接数
}


http {                                               # HTTP 区块
    include       mime.types;                #支持的媒体文件
    default_type  application/octet-stream;       # 默认的媒体类型

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;                        #高效传输模式
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;                #超时时间

    #gzip  on;

    server {                                        #server 区块
        listen       80;                                #端口
        server_name  localhost;                #域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {                               # location区块
            root   html;                                #站点目录
            index  index.html index.htm;        #首页文件夹
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;        #错误页面的文件名称
        location = /50x.html {        #location处理对应的不同错误码的页面定 义到/50x.html
            root   html;                #定义默认页面所在的目录
        }

2.1.2 nginx全局配置参数优化调整

2.1.2.1 修改用户及nginx工作进程优化

worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;
 
# 将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,
# 绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不运行在其他核心上,
# 这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,
# 减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
 
 
CPU MASK: 00000001:0号CPU
00000010:1号CPU
10000000:7号CPU
 
#示例
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU
worker_cpu_affinity 0101 1010;

示例4:

用户我这里之前创建了nginx用户,所以user 后面跟的nginx

重新加载并进行检测:

[root@nginx sbin]# systemctl restart nginx

[root@nginx sbin]# nginx -t

显示没问题:

查看进程状况,成功开启双核指定进程

2.1.2.2 实现nginx的高并发配置

最大并发数量一般不能超过当前系统的最大文件打开数:

查看当前系统支持打开的文件数量:

[root@nginx sbin]# ulimit -a

查看到当前系统支持最多打开1024个文件:

所以我们两个都要进行修改:

先对最大文件打开数进行修改:

[root@nginx sbin]# vim /etc/security/limits.conf 

用超级用户进行查看:

[root@nginx sbin]# sudo -u nginx ulimit -a

显示修改成功:

接着再回去把最大并发数量进行修改:

重启服务即可

[root@nginx sbin]# systemctl restart nginx

2.1.3 http配置块

 #在响应报文中将指定的文件扩展名映射至MIME对应的类型
include                 /etc/nginx/mime.types;
default_type         application/octet-stream;                 #除mime.types中的类型外
                                                                                    #指定其它文件的默认MIME类型,浏览
                                                                                       器一般会提示下载
types {
        text/html html;
        image/gif gif;
        image/jpeg jpg;
}

2.1.4 核心配置示例

2.1.4.1 新建一个 PC web 站点

创建需要的文件夹:

[root@nginx sbin]# mkdir -p /usr/local/nginx/conf.d

定义子配置文件路径:

[root@nginx sbin]# vim /usr/local/nginx/conf/nginx.conf

创建虚拟主机网站配置:

[root@nginx sbin]# vim /usr/local/nginx/conf.d/vhost.conf

配置网站内容:

[root@nginx sbin]# mkdir -p /data/web/html
[root@nginx sbin]# echo www.rin.org > /data/web/html/index.html

对nginx进行检测:

[root@nginx sbin]# nginx -t

显示没问题:

进行重启:

[root@nginx sbin]# systemctl restart nginx

提前配置好解析:

C:\Windows\System32\drivers\etc\hosts

进行测试:

测试完成,没问题。

2.1.4.2 root 与 alias

root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location

创建网站文件,并进行编辑内容

[root@nginx sbin]# mkdir /data/web/test -p
[root@nginx sbin]# echo This is test > /data/web/test/index.html

检验并重启服务:

[root@nginx sbin]# nginx -t
[root@nginx sbin]# systemctl restart nginx

编辑配置:

[root@nginx sbin]# vim /usr/local/nginx/conf.d/vhost.conf

测试:

alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于 location上下文,此指令使用较少

重新编写个test2网页文件夹,并进行内容编写:

[root@nginx sbin]# mkdir /data/web/test2 -p
[root@nginx sbin]# echo This is test2 > /data/web/test2/index.html

修改路径配置:(location与alias最后面要有斜杠就一起都有,反之没有就一起都没有)

重启服务,并进行测试:

[root@nginx sbin]# systemctl restart nginx

测试完毕。

2.1.4.3 location 的详细使用
  • 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
  • ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,

        而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹             配度最 高的一个uri

  • uri是用户请求的字符串,即域名后面的web文件路径   

       然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location            处理 此请求。

2.1.4.3.1 语法规则及顺序:

 规则:

location [ = | ~ | ~* | ^~ ] uri { ... }

顺序:=  ~  ~*  不带符号 ^~

=

用于标准uri前,需要请求字串与uri精确匹配,大小敏感,

如果匹配成功就停止向下匹配并立即处理请求

^~

用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头

对uri的最左边部分做匹配检查,不区分字符大小写

~

用于标准uri前,表示包含正则表达式,并且区分大小写
~*用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号匹配起始于此uri的所有的uri
\用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
2.1.4.3.2 优先级实验案例:

实验环境:

[root@nginx ~]# mkdir -p /data/web{1..5}/test
[root@nginx ~]# echo web1 > /data/web1/test/index.html
[root@nginx ~]# echo web2 > /data/web2/test/index.html
[root@nginx ~]# echo web3 > /data/web3/test/index.html
[root@nginx ~]# echo web4 > /data/web4/test/index.html
[root@nginx ~]# echo web5 > /data/web5/test/index.html

编辑配置文件:

[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf 

访问rin.org/test/index.html,看看谁优先级高

测试1:将搜索全部启用

测试2:将 = 注释掉:

测试3:再将 ~ 注释掉

测试4:将 ~* 的注释掉

测试5:将不带符号的注释掉

2.1.4.3.3 生产使用案例

#直接匹配网站根会加速Nginx访问处理

location = /index.html {

        ......;

}

location / {

        ......;

}

#静态资源配置方法1

location ^~ /static/ {

        ......;

}

#静态资源配置方法2,应用较多

location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {

        ......;

}

#多应用配置

location ~* /app1 {

        ......;

}

location ~* /app2 {

        ......;

}

2.1.4.4 Nginx 账户认证功能

由 ngx_http_auth_basic_module 模块提供此功能

创建认证文件:

创建认证文件分为两种情况,即在同一文件下是否为首次创建:

1.首次创建:
使用命令

[root@nginx data]# htpasswd -cm /usr/local/nginx/.htpassswd rin

创建完成后能够在文件处查询到:

2.非首次创建:

使用创建命令时参数为 -m  不是-cm!

[root@nginx data]# htpasswd -m /usr/local/nginx/.htpassswd rinrin

可以看见创建第二个用户认证文件成功:

创建数据目录,用于测试

[root@nginx data]# mkdir /data/web/rin
[root@nginx rin]# echo rinrinrinrinrin >/data/web/rin/index.html

配置文件:

[root@nginx rin]# vim /usr/local/nginx/conf.d/vhost.conf 

测试:

2.1.4.5 自定义错误页面

创建错误目录并编辑内容:

[root@nginx rin]# mkdir -p /data/web/errorpage
[root@nginx rin]# echo error page > /data/web/errorpage/40x.html

测试:

2.1.4.6 自定义错误日志

编辑配置文件:

[root@nginx rin]# vim /usr/local/nginx/conf.d/vhost.conf 

建立日志目录:

[root@nginx rin]# mkdir /var/log/rin.org

测试:

2.1.4.7 检测文件是否存在

try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如 果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一 个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内 部500错误。

语法格式:

Syntax: try_files file ... uri;

try_files file ... =code;

Default: —

Context: server, location

编辑文件:

[root@nginx html]# vim /usr/local/nginx/conf.d/vhost.conf 

2.1.4.8 长连接配置

编辑文件:

[root@nginx html]# vim /usr/local/nginx/conf/nginx.conf

2.1.4.9 作为下载服务器配置

测试:

3.1 Nginx 高级配置

3.1.1 Nginx 状态页

  • 基于nginx 模块 ngx_http_stub_status_module 实现
  • 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module

       否则配置完成之后监测会是提示法错误

  • 状态页显示的是整个服务器的状态,而非虚拟主机的状态

 还要提前做好解析,

测试:

3.1.2 Nginx 压缩功能

Nginx支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文 件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相 应的CPU资源。

Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module,默认是内置模块

配置命令:

#启用或禁用gzip压缩,默认关闭

gzip on | off;

#压缩比由低到高从1到9,默认为1,值越高压缩后文件越小,但是消耗cpu比较高。基本设定未4或者5

gzip_comp_level 4;

#禁用IE6 gzip功能,早期的IE6之前的版本不支持压缩

gzip_disable "MSIE [1-6]\.";

#gzip压缩的最小文件,小于设置值的文件将不会压缩

gzip_min_length 1k;

#启用压缩功能时,协议的最小版本,默认HTTP/1.1

gzip_http_version 1.0 | 1.1;

#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;

gzip_buffers number size;

#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错

gzip_types mime-type ...;

#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开

gzip_vary on | off;

#预压缩,即直接从磁盘找到对应文件的gz后缀的式的压缩文件返回给用户,无需消耗服务器CPU

#注意: 来自于ngx_http_gzip_static_module模块

gzip_static on | off;

配置文件:

[root@nginx local]# vim /usr/local/nginx/conf/nginx.conf

测试:


http://www.kler.cn/a/467999.html

相关文章:

  • MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分
  • Spring AMQP ----注解篇
  • Angular由一个bug说起之十三:Cross Origin
  • FQ-GAN代码解析
  • Redis两种主要的持久化方式是什么?
  • [答疑]用例规约:系统请求3dsMax创建体块
  • TP8 前后端跨域访问请求API接口解决办法
  • 数据结构考前总结
  • 【光纤通信】光纤结构
  • protobuf: 通讯录2.2
  • Git关联多个仓库
  • HALCON中用于分类的高斯混合模型create_class_gmm
  • uniapp--HBuilder开发
  • 一些计算机零碎知识随写(25年1月)
  • YOLO系列的学习
  • Python中的OS库
  • 写一个类模板三个模板参数K,V,M,参数是函数(函数参数、lambda传参、函数指针)
  • 【CSS】 ---- CSS 实现图片背景清除的滑动效果三种方法
  • 2025年全面的AI学习计划
  • HTML——69.表单验证属性
  • 游戏引擎学习第71天
  • 周末总结(2024/01/04)
  • C语言:cJSON将struct结构体与JSON互相转换
  • 【音频伴奏分离】UVR5软件介绍
  • 安卓Activity执行finish后onNewIntent也执行了
  • CSS3——3. 书写格式二