• Nginx学习笔记



    一、Nginx初始

    Nginx是一个高性能的Http和反向代理服务器,也是一个IMAP/POP3/SMTP等邮件代理服务器

    二、正向代理和反向代理

    如果客户端(client)不能直接访问服务端(server),则需要代理服务器(proxy)进行访问

    (一)正向代理

    正向代理:客户端通过设置,使用代理服务器去访问远程服务器

    (二)正向代理的使用场景

    1、可以访问原来无法访问的资源
    2、可以做缓存使用,加快访问速度
    3、对客户端授权或记录访问信息等

    (三)反向代理

    反向代理:服务器通过代理服务接收连接请求,然后再转发给内部网络的服务器,将服务器的结果返回给客户端,此时这种代理叫反向代理

    (四)反向代理的使用场景

    1、保证内网的安全,阻止web攻击
    2、负载均衡,优化网站的负载(处理能力)

    注意:正向代理知道是通过代理服务器访问服务端的,但是反向代理不知道是通过代理服务器访问服务端的
    一句话总结:代理服务器站在客户端一边(客户端知道是通过代理服务器访问的)就是正向代理,代理服务器站在服务器端一边(客户端不知道是通过代理服务器访问的),就是反向代理

    三、Nginx的安装

    (一):Linux下安装Nginx

    以openssl为例:
    1、在各官网下载相关组件: Nginx 、openssl 、 zlib 、 pcre等
    2、通过rz 上传压缩包
    3、通过tar -xvf *.tar.gz进行解压缩
    4、通过cd 文件夹名 进入解压后的文件夹中
    5、通过 ./config 执行配置相关的检查
    6、通过make & make install进行编译和安装

    注意:如上过程适用于zlib和pcre ,对于pcre而言,执行检查命令为./configure
    7、安装nginx过程中、执行配置检查
    图片:
    8、仍然执行make以及make install
    9、nginx安装成功,./nginx进行验证
    注意事项:nginx服务器,需要虚拟机开放80端口的访问
    防火墙配置(同样适用于tomcat开放8080 8081端口)
    firewall-cmd --list-all 查看当前配置
    firewall-cmd --add-service=http --permanent 开放http访问
    firewall-cmd --add-port=80/tcp --permanent 开放80端口
    firewall-cmd --reload 重启防护墙保护
    JDK的安装:
    1、解压缩—拷贝目录到/usr/local/java
    2、更改环境变量 vim /etc/profile
    图片
    3、让环境变量生效 source /ect/profile
    4、验证版本 java --version
    Tomcat的安装
    1、解压缩—拷贝目录到 /usr/local/tomcat
    2、直接执行 ./startup.sh 启动

    (二):Windows下安装Nginx

    四、Nginx常用命令

    nginx安装包所在目录 /usr/local/src/
    nginx安装目录:/usr/local/nginx/
    启动命令:./nginx
    验证方式:浏览器访问 虚拟机ip地址(出现nginx欢迎页面)
    关闭方式:
    1、./nginx -s stop 原生命令
    2、也可以通过linux关闭进程的命令关闭,
    查看文件 cat nginx.pid
    杀死进程:kill +参数+pid 形式 (pid表示进程的id)
    如:kill -9 pid 强行停止服务
    kill -TERM pid 快速停止服务
    kill -QUIT pid 平缓停止服务
    注意:启动后,进程id存放位置 /usr/local/nginx/nginx.pid
    查看所有命令: ./nginx -h
    信号处理命令:./nginx -s +(stop,quit,reopen,reload)
    其中reload 是重新加载命令,在更改配置后使用
    quit仍然是平缓停止的意思(完整有序),stop快速停止

    五、Nginx配置(nginx.conf文件内容模块及作用)

    查看nginx配置:cat nginx.conf

    (一)文件内容及模块

    
    #user  nobody;
    worker_processes  1;
    
    #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;
    }
    
    
    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 {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            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 {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118

    分为三个部分:全局块、events块、http块。

    (1)、全局块的作用

    全局块:全局指令,指定运行时的用户组、进程id存在位置、日志存放位置、worker process数量等
    如:

    #配置用户或者用户组
    #user  nobody;
    
    #允许生成的进程数(支持的并发数量)
    worker_processes  1;
    
    #配置日志的路径 可以配置日志级别 (debug | info | notice | warn | error | crit)
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #配置存储进程id的文件地址
    #pid        logs/nginx.pid;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (2)、events块的作用

    影响nginx服务器和用户网络连接的配置,比如每个进程的最大连接数、选取哪种事件驱动模型、以及在网络连接过程中,是否开启多个,是否序列化等

    events {
    	#配置每个进程的最大连接数,默认为1024
        worker_connections  1024;
    }
    
    • 1
    • 2
    • 3
    • 4

    (3)、Http块的作用

    配置代理、缓存、日志等绝大部分功能的地方,可以嵌套多个server块,而且不同的server可以对应不同的域名(就是在一个nginx服务器上配置多个域名,这种方式通常称为虚拟主机),

    虚拟主机:同一台Nginx服务器,可以支持多个网站的运行,每个虚拟主机之间都相互独立,具有完整功能。(可以节约使用成本)

    (3.1、虚拟主机的配置

    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 {
        	#监听的端口
            listen       80;
            #监听的域名
            server_name  localhost;
            	
    		#定位出路径或文件地址
            location / {
            	#部署项目jar包的相对路径
                root   html;
                #默认跳转的首页地址
                index  index.html index.htm;
            }
        }    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    配置指定域名(www.ceshi.com),访问到虚拟机的页面
    1、在安装目录下,创建一个存放要部署的项目文件夹,如:mkdir ceshi
    2、将要部署的文件存放在ceshi文件夹中
    3、注意在配置config文件时记得备份一份,防止配置出错
    更改配置如下

     server {
            listen       80;
            server_name  www.ceshi.com;
            location / {
                root   ceshi;
                index  index.html index.htm;
            }
        }    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4、给域名配置ip地址的映射(更改C:\Windows\System32\drivers\etc 下的host文件)

    # Copyright (c) 1993-2009 Microsoft Corp.
    #
    		.............
    		
    # localhost name resolution is handled within DNS itself.
    #	127.0.0.1       localhost
    #	::1             localhost
    
    #给域名配置ip地址的映射
    192.168.1.20		www.ceshi.com
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5、浏览器输入虚拟机地址或者域名,均能返回项目首页

    (3.2、日志的配置

    通过日志,可以获取用户的地址信息、跳转来源、终端、以及url访问量的

    	
    	#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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    日志的demo

    127.0.0.1 - - [12/Sep/2022:17:56:58 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.33"
    
    • 1

    log_format main 参数说明

    名字用途
    remote_addr客户端的ip地址
    remote_user客户端的用户名称
    time_local访问时间和时区
    request请求方法
    status响应状态码 如:200
    body_bytes_sent主体内容字节数 如:612
    http_referer记录是从哪个链接访问过来的
    http_user_agent代表用户使用的代理,一般为浏览器
    http_x_forwarded_for通过代理服务器来记录客户端的ip地址

    可以通过脚本实现日志切割(每天生成一份日志)
    1、重命名日志文件
    2、让nginx重新从配置文件总读取日志文件名,这样就可以达到在新的日志文件中记录日志效果

    六、反向代理配置

    前提:在linux系统中安装好jdk和tomcat(配置好环境变量)
    安装路径:
    1、jdk路径:/usr/local/java/
    2、tomcat路径:/usr/local/tomcat/
    启动方式:/usr/local/tomcat/bin 执行 ./startup.sh
    关闭方式:执行 ./shutdown.sh
    验证方式: 虚拟机ip:8080 可以看到tomcat页面

    需求:
    访问www.ceshi.com 显示百度的页面

    (一)配置反向代理的nginx.conf文件

    	#配置对应的虚拟主机
        server {
        	#监听的端口
            listen       80;
            #监听的域名
            server_name  www.ceshi.com;
            	
    		#定位出路径或文件地址
            location / {
            	#部署项目jar包的相对路径
                root   ceshi;
                #将域名请求,跳转发送到百度上,相当于直接访问https://www.baidu.com
                proxy_pass  https://www.baidu.com
                #默认跳转的首页地址
                index  index.html index.htm;
            }
        }    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    注意:更改配置文件nginx.conf文件后,执行重加载命令 ./nginc -s reload

    (二)实现在同一域名下,根据不同的访问路径访问不同的项目

    **需求:**一个nginx服务器连接多个项目,当域名对应的路径不同时,跳转不同的项目

    配置nginx.conf配置文件

    #配置对应的虚拟主机
        server {
        	#监听的端口
            listen       80;
            #监听的域名
            server_name  www.ceshi.com;
            	
    		#定位出路径或文件地址
            location ~/baidu1 {  #~/baidu1 表示当访问www.ceshi.com+baidu1时跳转的页面为https://baidu.com
            	#部署项目jar包的相对路径
                root   ceshi;
                #将域名请求,跳转发送到百度上,相当于直接访问https://www.baidu.com
                proxy_pass  https://www.baidu.com
                #默认跳转的首页地址
                index  index.html index.htm;
            }
            #定位出路径或文件地址
            location ~/guge1 {  #~/guge1 表示当访问www.ceshi.com+guge时跳转的页面为https://www.guge.com
            	#部署项目jar包的相对路径
                root   guge1;
                #将域名请求,跳转发送到百度上,相当于直接访问https://www.baidu.com
                proxy_pass  https://www.guge.com
                #默认跳转的首页地址
                index  index.html index.htm;
            }
        }    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    七、负载均衡

    (一)概念

    早期使用DNS(域名解析系统)做负载,具体而言,给客户端解析不同的ip地址,让流量直接到达服务器。
    clientN 先到达负载均衡器(load balancer) 再通过调度算法 分配到不同的serverN
    优点:
    1、通过健康检测,避免单点故障
    2、当发现节点故障时,从集群中移除,保证应用的高可用
    四层负载均衡,在OSI模型的传输层,主要是转发
    七层负载均衡,在OSI模型的应用层,主要是代理

    (二)负载均衡器可以处理的四大类型的请求

    HTTP/HTTPS/TCP/UDP等

    (三)负载均衡的调度算法

    1、轮询:相当于将服务器从第一台到最后一台形成一个环状,每接收一个请求,则从第一台开始循环遍历。
    2、最小连接,优先选择连接数最小的服务器,适用于会话时间较长的业务处理
    3、ip映射,根据请求的ip地址进行散列,让同一个ip下的请求都映射到同一服务器上,可以解决session问题(粘性会话)

    (四)负载均衡的使用

    需求:当访问虚拟机ip 192.168.2.10/lb/index.html时,通过负载均衡,让请求平均分配到8080和8081tomcat端口中
    1、分别找到两个tomcat的安装目录,如/usr/local/tomcat/webapps
    创建lb目录, mkdir lb
    创建访问页面 ,cp tomcat1/index.html
    查看页面内容, cat lb/index.html
    2、配置nginx.conf
    注意:使用负载均衡时,需要在http块下创建一个upstream 名字 块,如

    http{
    	#创建upstream块,用来记录server列表的的地址和端口
    	upstream  myserver{
    		server 192.168.1.20:8080
    		server 192.168.1.20:8081
    	}
    	server{
    	
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    再增加一个location

    location ~/lb/ {
    	#将请求映射到负载均衡器中 参数为配置的upstream名称
    	proxy_pass  http://myserver;
    }
    
    • 1
    • 2
    • 3
    • 4

    完整如:

    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;
        
        #创建upstream块,用来记录server列表的的地址和端口
    	upstream  myserver{
    		server 192.168.1.20:8080
    		server 192.168.1.20:8081
    	}
        
    	#配置对应的虚拟主机
        server {
        	#监听的端口
            listen       80;
            #监听的域名
            server_name  localhost;
            	
    		location ~/lb/ {
    			#将请求映射到负载均衡器中  参数为配置的upstream名称
    			proxy_pass  http://myserver;
    		}
        }    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    以上时默认的轮询调度算法

    如果需要某个服务器处理的更多些,则需要额外设置权重,则在server 后面加 weigth=数字,weight的默认值是1

    如:

         upstream  myserver{
    		server 192.168.1.20:8080 weight=2
    		server 192.168.1.20:8081 weigth=1
    	}
    
    • 1
    • 2
    • 3
    • 4

    如果需要根据ip地址,固定server处理,可以使用ip_hash。
    如:

    upstream  myserver{
    		server 192.168.1.20:8080 weight=2;
    		server 192.168.1.20:8081 weigth=1;
    		ip_hash;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    八、动静分离

    (一)概念

    将动态和静态请求分离开,不能单纯的理解为动态页面和静态页面的物理分离。
    如果是静态资源请求,直接查找nginx上的静态资源地址
    如果是动态资源请求,通过反向代理,映射到tomcat路径下的资源

    (二)实现方式

    1、单独把静态文件放在独立的服务器及独立的域名下,推荐方案
    2、将动态资源和静态资源混合在一起,通过nginx来分开

    (三)动静分离的应用

    需求:
    访问图片等静态资源时,可以直接从nginx中获取,访问jsp等动态资源时,通过tomcat返回结果
    处理流程
    1、在/usr/local/tomcat/webapps下通过rz命令上传本地的index.jsp
    2、在/usr/local/nginx/image下通过rz命令上传本地的test.png图片
    3、配置nginx.conf文件
    如:

    #配置动态资源的请求转发	
    		location ~.*.jsp$ {
    			#将请求映射到负载均衡器中  参数为配置的upstream名称
    			proxy_pass  http://myserver;
    		}
    		#配置静态资源的请求转发	
    		location ~.*\.(gif|jpg|png|css)$ {
    			#配置静态资源的存放路径
    			root /usr/local/nginx/image
    			#在浏览器端使用缓存,配置过期时间,相当于redis 3d表示三天
    			ecpire 3d}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    完整配置

    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;
        
        #创建upstream块,用来记录server列表的的地址和端口
    	upstream  myserver{
    		server 192.168.1.20:8080
    	}
        
    	#配置对应的虚拟主机
        server {
        	#监听的端口
            listen       80;
            #监听的域名
            server_name  localhost;
            #配置动态资源的请求转发	
    		location ~.*.jsp$ {
    			#将请求映射到负载均衡器中  参数为配置的upstream名称
    			proxy_pass  http://myserver;
    		}
    		#配置静态资源的请求转发	
    		location ~.*\.(gif|jpg|png|css)$ {
    			#配置静态资源的存放路径
    			root /usr/local/nginx/image
    			#在浏览器端使用缓存,配置过期时间,相当于redis 3d表示三天
    			ecpire 3d}
        }    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    4、验证方式:分别访问:http://192.168.1.20/jsp/index.html和http://192.168.1.20/test.png

    九、location块补充

    (一)、匹配规则

    1、location=/uri 精确匹配
    2、location^~ /uri 前缀匹配 顺序在正则之前
    3、location /uri 前缀匹配,顺序在正则匹配之后
    4、location -pattern 区别大小写的正则匹配
    5、location -*pattern 不区分大小写的正则匹配
    6、location / 通用匹配,接受未匹配到其他location的请求

    匹配顺序:
    首先会精确匹配,然后会进行前缀匹配,具体顺序按照指令长度,从长到短的顺序依次匹配。但是在正则匹配时,是按照配置文件的顺序依次匹配的,如果不希望前缀匹配进行正则匹配,那么使用^~

    (二) URL重写

    对url的规范处理,域名更换时的新旧跳转,一些额外的参数调整等

    #配置对应的虚拟主机
        server {
        	#监听的端口
            listen       80;
            #监听的域名
            server_name  www.ceshi.com;
            #url重写,当访问www.ceshi.com 时,地址栏会变成www.baidu.com
          	rewrite ^/(.*) http://www.baidu.com/$1 pernanent;
        }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    把图片压缩成指定大小,释放你的内存空间
    没想到吧,Spring中还有一招集合注入的写法
    销量预测设计
    MySQL索引详解及演进过程以及延申出面试题(别再死记硬背了,跟着我推演一遍吧)
    linux运行ant 报错 Unable to locate tools.jar【已解决】
    解决Spring Boot应用在Kubernetes上健康检查接口返回OUT_OF_SERVICE的问题
    2023-10-20 游戏开发-开源游戏-记录
    rk3128-android7-allapp按键和hotseat栏
    hid-ft260驱动学习笔记 5 - ft260_i2c_probe
    前端不使用 il8n,如何优雅的实现多语言?
  • 原文地址:https://blog.csdn.net/qq_45429856/article/details/126817902