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

nginx高级配置详解

目录

一、网页的状态页

1、状态页的基本配置

2、搭配验证模块使用

3、结合白名单使用

二、nginx 第三方模块

1、echo模块

1.1 编译安装echo模块

1.2 配置echo模块

三、nginx变量

1、内置变量

2、自定义变量

四、自定义图标

五、自定义访问日志

1、自定义日志格式

2、自定义 json 格式日志

3、日志分割脚本

六、nginx压缩功能

6.1 开启nginx压缩

6.2 开启nginx预压缩

七、https功能

7.1 https概念

7.2 配置自签名证书


一、网页的状态页

1、状态页的基本配置

基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module,否则配置完成之后监测会是提示语法错误注意:状态页显示的是整个服务器的状态,而非虚拟主机的状态

nginx服务器配置: 

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name www.pc.com;root /opt;location /status {stub_status;}
}
[root@localhost ~]#nginx -s reload

客户端测试:

网页的状态页输出详解

Active connections: 2
server accepts handled requests2       2       56上面三个数字分别对应accepts(接收),handled(处理),requests(请求)三个值
Reading: 0 Writing: 1 Waiting: 1
  • Active connections:当前处于活动状态的客户端连接数,包括连接等待空闲连接数=reading+writing+waiting
  • accepts:统计总值,Nginx自启动后已经接受的客户端请求的总数
  • handled:统计总值,Nginx自启动后已经处理完成的客户端请求总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接
  • requests:统计总值,Nginx自启动后客户端发来的总的请求数
  • Reading:当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
  • Writing:当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
  • Waiting:当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于active – (reading+writing)

 拓展:客户端如何只提取基本状态的accepts、handle、requests的总值?

 

[root@localhost ~]#curl 172.16.12.10/status 2>/dev/null | awk '/Reading/{print $2,$4,$6}'

2、搭配验证模块使用

为安全考虑,可以搭配验证模块一起使用,即需要使用用户和密码,才能打开网页状态页

 nginx服务器配置: 

#htpasswd命令生成密钥
[root@localhost ~]#yum install -y httpd-tools
[root@localhost ~]#htpasswd -c /mnt/.nginxuser dh
[root@localhost ~]#cat /mnt/.nginxuser

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name  www.dh.com;root /opt/;location /status {stub_status;auth_basic  "welcome";auth_basic_user_file  /mnt/.nginxuser;} 
}
[root@localhost ~]#nginx -s reload

客户端测试:

  拓展:此时客户端如何再想只提取基本状态的accepts、handle、requests的总值? 

[root@localhost ~]#curl http://dh:123@172.16.12.10/status 2>/dev/null | awk '/Reading/{print $2,$4,$6}'

3、结合白名单使用

为进一步安全考虑,只允许一个IP地址可查看网页状态页,其他都不被允许

 nginx服务器配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name  www.dh.com;root /opt/;location /status {stub_status;auth_basic  "welcome";auth_basic_user_file  /mnt/.nginxuser;allow 172.16.12.1;deny all;}
}
[root@localhost ~]#nginx -s reload

客户端测试:

二、nginx 第三方模块

Nginx是一个高性能的HTTP和反向代理服务器,它的功能可以通过第三方模块进行扩展。可以通过源代码编译Nginx时进行包含,也可以通过Nginx的模块管理系统进行安装

1、echo模块

用于在nginx服务器上输出自定义内容的模块。通过使用echo模块,用户可以在nginx配置中编写自定义的响应内容,包括文本、变量和其他信息。这使得nginx服务器能够更加灵活地生成响应,以满足特定需求或动态生成内容

开源的echo模块下载网:https://github.com/openresty/echo-nginx-module

1.1 编译安装echo模块

①先关闭 nginx,然后下载压缩包,并解压

[root@localhost ~]#systemctl stop nginx
[root@localhost ~]#yum install git -y      #安装git
[root@localhost ~]#cd /data
[root@localhost ~]#git clone https://github.com/openresty/echo-nginx-module.git
[root@localhost data]#unzip echo-nginx-module-master.zip

② 切换至nginx安装包目录,编译安装echo模块

[root@localhost data]#cd nginx-1.18.0/
[root@localhost nginx-1.18.0]# ./configure --help | grep add
[root@localhost nginx-1.18.0]#./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/data/echo-nginx-module-master
[root@localhost nginx-1.18.0]# make && make install
[root@localhost nginx-1.18.0]# systemctl start nginx

1.2 配置echo模块

 nginx服务器配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name www.dh.com;root /opt/;location /ip {echo "welcome,your ip addr: ";echo $remote_addr;}
}
[root@localhost ~]#nginx -s reload

客户端测试:

三、nginx变量

1、内置变量

内置变量说明
$remote_addr;存放了客户端的地址,注意是客户端的公网IP
$args;变量中存放URL中的参数
$document_root;保存了针对当前资源的请求系统的根目录,如:/apps/nginx/html
$document_uri;保存了当前请求中不包含参数的URI,注意是不包含请求的指令
$host;存放了请求的host名称,服务端的地址
$request_filename;当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,如:/apps/nginx/html/main/index.html
$scheme;请求的协议,例如:http、https、ftp等
$http_user_agent;客户端浏览器的详细信息
$http_cookie;客户端的cookie信息
#补充$proxy_add_x_forwarded_for
#此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没有X-Forwarded-For,就使用$remote_addrthe “X-Forwarded-For” client request header field with the $remote_addr variable appended to it, separated by a comma. If the “X-Forwarded-For” field is not present in the client request header, the $proxy_add_x_forwarded_for variable is equal to the $remote_addr variable.
客户机    代理1     代理2     nginx服务器
$proxy_add_x_forwarded_for: 在代理1 上存的是  客户机的ip
$proxy_add_x_forwarded_for: 在代理2 上存的是  客户机的ip,代理1的ip            用逗号隔开
$proxy_add_x_forwarded_for: nginx  上存的是  客户机的ip,代理1的ip,代理2的ip$args; 
#变量中存放了URL中的参数,例如:http://www.kgc.org/main/index.do?id=20190221&partner=search
#返回结果为: id=20190221&partner=search    #存放的就是这个select   *  from table  where id=20190221$document_uri;
#保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比
如:http://www.kgc.org/main/index.do?id=20190221&partner=search会被定义为/main/index.do 
#返回结果为:/main/index.dolimit_rate 10240;
echo $limit_rate;
#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0$remote_port; 
#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口$remote_user; 
#已经经过Auth Basic Module验证的用户名$request_body_file; 
#做反向代理时发给后端服务器的本地资源的名称$request_method; 
#请求资源的方式,GET/PUT/DELETE等$request_uri;   https:// www.baidu.com/main/index.do?id=20190221&partner=search 
#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,例如:/main/index.do?id=20190221&partner=search $server_protocol; 
#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等$server_addr; 
#保存了服务器的IP地址$server_name; 
#请求的服务器的主机名$server_port;
#请求的服务器的端口号$http_<name>
#name为任意请求报文首部字段,表示记录请求报文的首部字段
arbitrary request header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores 
#用下划线代替横线
#示例: echo $http_User_Agent;  $cookie_<name>
#name为任意请求报文首部字部cookie的key名$http_<name>
#name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有横线需要替换为下划线
arbitrary request header field; the last part of a variable name is the field 
name converted to lower case with dashes replaced by underscores #用下划线代替横线
#示例: 
echo $http_user_agent; 
echo $http_host;$sent_http_<name>
#name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题
echo $sent_http_server;$arg_<name>
#此变量存放了URL中的指定参数,name为请求url中指定的参数
#对比变量 $arg 是全部, 如果要id如下
echo $arg_id;

nginx服务器配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name www.dh.com;root /opt/;
location /main {index index.html;default_type text/html;echo "hello world,main-->";echo $remote_addr;echo $args;echo $arg_user;echo $document_root;echo $document_uri;echo $host;echo $http_user_agent;echo $http_cookie;echo $request_filename;echo $scheme;echo $scheme://$host$document_uri?$args;}
}
[root@localhost ~]#nginx -s reload

  客户端测试:

[root@localhost ~]#curl 'http://172.16.12.10/main?user=dh&title=welcome'

2、自定义变量

假如需要自定义变量名称和值,使用指令 set $variable value;

#语法格式
Syntax: set $variable value;
#$variable 是要定义或更新的变量名,value 是要分配给变量的值
Context: server, location, if

nginx服务器配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name www.dh.com;root /opt/;location /mnt {set $name yun;echo $name;set $my_port $server_port;    #将内置变量定义给自定义变量echo $my_port; }
}
[root@localhost ~]#nginx -s reload

客户端测试:

四、自定义图标

favicon.ico 文件是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件,但是当浏览器请求的 favicon.ico 文件不存在时,服务器会记录404日志,而且浏览器也会显示404报错

nginx服务器配置:

[root@localhost conf.d]#cd /apps/nginx/html/
[root@localhost html]#echo "welcome" > index.html 
[root@localhost html]#rm -rf /apps/nginx/conf.d/dh.conf 
[root@localhost html]#wget www.baidu.com/favicon.ico
[root@localhost html]#nginx -s reload

客户端测试:

五、自定义访问日志

1、自定义日志格式

访问日志是记录客户端即用户的具体请求内容信息,而在全局配置模块中的 error log 是记录 nginx服务器运行时的日志保存路径和记录日志的 level,因此两者是不同的,而且Nginx的错误日志一般只有一个,但是访问日志可以在不同 server 中定义多个,定义一个日志需要使用 access_log 指定日志的保存路径,使用 log_format 指定日志的格式,格式中定义要保存的具体日志内容。
访问日志由 ngx_http_log_module 模块实现

Syntax: access_log path [format [buffer=size] [gzip[=level]] (flush=time] [if=condition]];access_log off;
Defau1t:
access_log 1ogs/access.1og combined;
Context: http,server, location,if in location,limit_except

nginx服务器配置: 

[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"''$server_name:$server_port';log_format  test  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"''$server_name:$server_port';#格式可以定义多个,但只能启用一个
#注:如果开启 include 注意定义自配置文件与日志格式的上下关系,日志格式一定要在include 之前,否则会不生效
[root@localhost ~]#nginx -s reload

客户端访问: 

服务端查看日志: 

[root@localhost ~]#tailf /apps/nginx/logs/access.log

拓展:如何提取日志中的状态码?

[root@localhost ~]#cat /apps/nginx/logs/access.log|tail -n 1|awk '{print $9}'

拓展:如何统计状态码个数?

[root@localhost ~]#cat /apps/nginx/logs/access.log|awk '{print $9}'|sort -n|uniq -c

拓展:如何统计远端客户端ip地址个数?

[root@localhost ~]#cat /apps/nginx/logs/access.log|awk '{print $1}'|sort -n|uniq -c
[root@localhost ~]#cat /apps/nginx/logs/access.log|awk '{a[$1]++};END{for (i in a){print i,a[i]}}'

2、自定义 json 格式日志

方便ELK收集日志

nginx服务器配置: 

[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
log_format access_json '{"@timestamp":"$time_iso8601",''"host":"$server_addr",''"clientip":"$remote_addr",''"size":$body_bytes_sent,''"responsetime":$request_time,''"upstreamtime":"$upstream_response_time",''"upstreamhost":"$upstream_addr",'  '"http_host":"$host",''"uri":"$uri",''"xff":"$http_x_forwarded_for",''"referer":"$http_referer",''"tcp_xff":"$proxy_protocol_addr",''"http_user_agent":"$http_user_agent",''"status":"$status"}';
access_log logs/access.log access_json;
#格式可以定义多个,但只能启用一个
#注:如果开启 include 注意定义自配置文件与日志格式的上下关系,日志格式一定要在include 之前,否则会不生效
[root@localhost ~]#nginx -s reload

客户端访问:

服务端查看日志:

[root@localhost ~]#tailf /apps/nginx/logs/access.log

拓展:如何提取日志中的状态码?

[root@localhost ~]#cat /apps/nginx/logs/access.log|tail -n 1|sed -r 's/.*(status)":"(.*)"}.*/\2/'

拓展:如何统计状态码个数?

[root@localhost ~]#cat /apps/nginx/logs/access.log |sed -r 's/.*(status)":"(.*)"}.*/\2/'|sort -n|uniq -c

拓展:如何统计远端客户端ip地址个数?

[root@localhost ~]#cat /apps/nginx/logs/access.log|awk -F: '{print $7}'|sed -r 's/"(.*)",.*/\1/'|sort -n|uniq -c

3、日志分割脚本

[root@localhost ~]#vim /opt/fenge.sh
#!/bin/bash
# Filename: fenge.sh
day=$(date -d "-1 day" "+%Y%m%d")											#显示前一天的时间
logs_path="/apps/nginx"
pid_path="/apps/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path 									#创建日志文件目录
mv /apps/nginx/logs/access.log ${logs_path}/dh.com-access.log-$day	#移动并重命名日志文件
kill -USR1 $(cat $pid_path)													#重建新日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;								#删除30天之前的日志文件
#find $logs_path -mtime +30 | xargs rm -rf [root@localhost ~]#chmod +x /opt/fenge.sh
[root@localhost ~]#/opt/fenge.sh
[root@localhost ~]#ls /apps/nginx
[root@localhost ~]#ls /apps/nginx/logs/access.log #设置周期计划任务
[root@localhost ~]#crontab -e
0 1 * * * /opt/fenge.sh

六、nginx压缩功能

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

#指令
#启用或禁用gzip压缩,默认关闭
gzip on | off; #压缩比由低到高从1到9,默认为1
gzip_comp_level level;#指令
#禁用IE6 gzip功能
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;#预压缩,先压缩好,不用临时压缩,消耗cpu
gzip_static on | off;

6.1 开启nginx压缩

[root@localhost ~]#cd /apps/nginx/html/
[root@localhost html]#dd if=/dev/zero of=/apps/nginx/html/index.html count=1 bs=5M
[root@localhost html]#ll -h

此时未开启nginx压缩时,用客户端访问,并查看服务器日志及客户端浏览器的开发者工具(按快捷键F12)

可以看到客户端下载的网页文件大小非常大

nginx服务器配置: 

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen       80;server_name  www.dh.com;root         /apps/nginx/html;gzip on;gzip_comp_level 9;gzip_min_length 1k;gzip_vary on;
}
[root@localhost ~]#nginx -s reload

此时开启nginx压缩后,用客户端访问,并查看服务器日志及客户端浏览器的开发者工具(按快捷键F12)

可以看到客户端下载的网页文件大小被压缩了

6.2 开启nginx预压缩

gzip_static on | off    预压缩,先压缩好,不用临时压缩,消耗cpu

[root@localhost html]#gzip index.html
[root@localhost html]#mv index.html.gz  m.html.gz

nginx服务器配置: 

[root@localhost ~]#nginx -V
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen       80;server_name  www.dh.com;root         /apps/nginx/html;gzip on;gzip_comp_level 9;gzip_min_length 1k;gzip_vary on;gzip_static on;
}
[root@localhost ~]#nginx -s reload

客户端测试:

七、https功能

7.1 https概念

Web 网站的登录页面都是使用 https 加密传输的,加密数据以保障数据的安全,HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据

过程:

  • 客户端发起HTTPS请求

用户在浏览器里输入一个 https 网址,然后连接到服务器的 443 端口

  • 服务端的配置

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥

  • 传送服务器的证书给客户端

证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等

  • 客户端解析验证服务器证书

这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书中公钥对该随机值进行非对称加密

  • 客户端将加密信息传送服务器

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加感解密了

  • 服务端解密信息

服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值

  • 服务器加密信息并发送信息

服务器将数据利用随机值进行对称加密,再发送给客户端

  • 客户端接收并解密信息

客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容

7.2 配置自签名证书

nginx 的 https 功能基于模块 ngx_http_ssl_module 实现,因此如果是编译安装的nginx要使用参数 ngx_http_ssl_module 开启 ssl 功能,但是作为 nginx 的核心功能,yum安装的 nginx 默认就是开启的,编译安装的nginx需要指定编译参数 --with-http_ssl_module 开启

#指令
ssl on | off;   
#为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代
listen 443 ssl;ssl_certificate /path/to/file;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件ssl_certificate_key /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl缓存off: #关闭缓存none:  #通知客户端支持ssl session cache,但实际不支持builtin[:size]:#使用OpenSSL内建缓存,为每worker进程私有[shared:name:size]:#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称ssl_session_timeout time;
#客户端连接可以复用ssl session cache中缓存的有效时长,默认5m

OpenSSL:

一个开源的密码库,它提供了一系列的加密和解密功能,包括对称加密、非对称加密、哈希函数、数字证书等。OpenSSL的命令行工具可以用来生成密钥对、生成证书请求、签发证书、加密和解密文件等 

 nginx服务器配置: 

[root@localhost ~]#cd /opt/ssl/
[root@localhost ssl]#vim certificate.sh
#自签名证书脚本
CA_SUBJECT="/O=dh/CN=ca.dh.com"
SUBJECT="/C=CN/ST=js/L=nj/O=dh/CN=www.dh.com"
SERIAL=34
EXPIRE=202002
FILE=dh.comopenssl req  -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crtopenssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key  -subj $SUBJECT -out ${FILE}.csropenssl x509 -req -in ${FILE}.csr  -CA ca.crt -CAkey ca.key -set_serial $SERIAL  -days $EXPIRE -out ${FILE}.crtchmod 600 ${FILE}.key ca.key[root@localhost ssl]#bash certificate.sh

[root@localhost ssl]#ls
[root@localhost ssl]#cat dh.com.crt ca.crt >www.dh.com.crt
[root@localhost ssl]#mv dh.com.key www.dh.com.key
[root@localhost ssl]#ll www*

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server{listen 80;server_name www.dh.com;root /apps/nginx/html/;listen 443 ssl;ssl_certificate /opt/ssl/www.dh.com.crt;ssl_certificate_key /opt/ssl/www.dh.com.key;ssl_session_cache shared:sslcache:20m;ssl_session_timeout 10m;
}
[root@localhost ~]#nginx -s reload

客户端测试: 

相关文章:

nginx高级配置详解

目录 一、网页的状态页 1、状态页的基本配置 2、搭配验证模块使用 3、结合白名单使用 二、nginx 第三方模块 1、echo模块 1.1 编译安装echo模块 1.2 配置echo模块 三、nginx变量 1、内置变量 2、自定义变量 四、自定义图标 五、自定义访问日志 1、自定义日志格式…...

小程序--分包加载

分包加载是优化小程序加载速度的一种手段。 一、为什么进行分包 小程序限制单个包体积不超过2M&#xff1b; 分包可以优化小程序页面的加载速度。 二、启用/使用分包语法subPackages subPackages&#xff1a;下载app.json文件中 root&#xff1a;分包所在的目录 pages&#x…...

R语言【base】——writeLines()

Package base version 4.2.0 Description 向连接写入文本行。 Usage writeLines(text, con stdout(), sep "\n", useBytes FALSE) Arguments 参数【text】&#xff1a;一个字符向量。 参数【con】&#xff1a;一个 connection 对象 或 一个字符串。 参数【se…...

微信小程序-人脸检测

微信小程序的人脸检测功能&#xff0c;配合蓝牙&#xff0c;配合ESP32 可以实现一些有趣的玩具 本文先只说微信小程序的人脸检测功能 1、人脸检测使用了摄像头&#xff0c;就必须在用户隐私权限里面声明。 修改用户隐私声明后&#xff0c;还需要等待审核&#xff0c;大概一天 …...

微信小程序自制动态导航栏

写在前面 关于微信小程序导航栏的问题以及解决办法我已经在先前的文章中有提到&#xff0c;点击下面的链接即可跳转~ &#x1f90f;微信小程序自定义的导航栏&#x1f90f; 在这篇文章中我们需要做一个这样的导航栏&#xff01;先上效果图 &#x1f447;&#x1f447;&#x1f…...

金融知识分享系列之:五日线

金融知识分享系列之&#xff1a;五日线 一、股票均线二、五日线三、五日线加量能三、五日线案例四、五日线案例五、五日线案例六、五日线案例七、五日线案例八、五日线案例 一、股票均线 股票均线是一种用于平滑股票价格的指标。它是根据一段时间内的股票价格计算得出的平均值…...

回归测试详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 什么是回归测试 回归测试&#xff08;Regression testi…...

渲染效果图有哪几种分类?效果图为什么用云渲染更快

云渲染利用了集群化的云端服务器资源&#xff0c;通过并行计算充分发挥了高性能硬件的优势&#xff0c;显著提升了渲染的速度。这一技术特别适用于处理规模庞大或细节丰富的渲染任务&#xff0c;在缩短项目完成时间方面表现卓越。无论是用于为建筑提供精确的可视化效果图&#…...

Docker镜像加速

前言 众所周知&#xff0c;我们常用的一些工具或系统的下载源都是国外的&#xff0c;这就会导致我们在下载一些东西时&#xff0c;会导致下载巨慢或者下载失败的情况&#xff0c;下面便是docker换下载源的教程 镜像加速 下面是几个常用的国内的镜像 科大镜像&#xff1a;ht…...

吴恩达deeplearning.ai:sigmoid函数的替代方案以及激活函数的选择

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 引入——改进下需求预测模型ReLU函数(整流线性单元 rectified linear unit&#xff09;线性激活函数(linear activation function)激活函数的选择实现方式为什么需要激活函数 到现在…...

Alias许可分析中的数据可视化

Alias许可分析中的数据可视化&#xff1a;引领企业洞察合规之道的明灯 在信息化时代&#xff0c;数据可视化已成为各行各业的重要工具&#xff0c;能够帮助用户直观地理解和分析复杂的数据。在Alias许可分析中&#xff0c;数据可视化同样发挥着至关重要的作用&#xff0c;为企…...

【计算机网络】数据链路层--以太网/MTU/ARP/RARP协议

文章目录 一、以太网1.以太网帧格式2.MAC地址3.局域网的转发原理 二、MTU1.什么是MTU2.MTU对IP协议的影响3.MTU对UDP影响4.MTU对于TCP协议的影响 三、ARP协议1.ARP协议的作用2.ARP数据报的格式3.ARP协议的工作流程 一、以太网 “以太网” 不是一种具体的网络, 而是一种技术标准…...

typescript使用解构传参

看下面这个函数 interface Student {id: number;name: string;class: string;sex: string;}function matriculation(student: Student) {//...}我们要调用它,就需要传递一个实现了Student约束的对象进去 interface Student {id: number;name: string;class: string;sex: string…...

CSP-J 2023 复赛第4题:旅游巴士

【题目来源】https://www.luogu.com.cn/problem/P9751https://www.acwing.com/problem/content/description/5313/【题目描述】 小 Z 打算在国庆假期期间搭乘旅游巴士去一处他向往已久的景点旅游。 旅游景点的地图共有 n 处地点&#xff0c;在这些地点之间连有 m 条道路。 其中…...

JAVA算法和数据结构

一、Arrays类 1.1 Arrays基本使用 我们先认识一下Arrays是干什么用的&#xff0c;Arrays是操作数组的工具类&#xff0c;它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。 下面我们用代码来演示一下&#xff1a;遍历、拷贝、排序等操作。需要用到的方法如下 public…...

每日五道java面试题之spring篇(七)

目录&#xff1a; 第一题. 什么是Spring beans&#xff1f;第二题. 一个 Spring Bean 定义 包含什么&#xff1f;第三题. 如何给Spring 容器提供配置元数据&#xff1f;Spring有几种配置方式?第四题. Spring基于xml注入bean的几种方式?第五题&#xff1a;你怎样定义类的作用域…...

Keil编译GD32工程时找不到lib库文件

D:\Keil5\ARM\ARMCLANG\Bin\..\lib\armlib\mc_p.l:SELECTION_SCRIPT(2974): error: L6907E: Expected an expression. 问题 解决方法&#xff1a;因为编译器没有找到那个函数的代码&#xff0c;也就未解析了 其实问题很简单&#xff0c;把你的lib文件加进去&#xff0c;ok了…...

测试C#使用ViewFaceCore实现图片中的人脸遮挡

基于ViewFaceCore和DlibDotNet都能实现人脸识别&#xff0c;准备做个遮挡图片中人脸的程序&#xff0c;由于暂时不清楚DlibDotNet返回的人脸尺寸与像素的转换关系&#xff0c;最终决定使用ViewFaceCore实现图片中的人脸遮挡。   新建Winform项目&#xff0c;在Nuget包管理器中…...

2.21 Qt day2 菜单栏/工具栏/状态栏/浮动窗口、UI界面、信号与槽

思维导图 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;…...

300分钟吃透分布式缓存-16讲:常用的缓存组件Redis是如何运行的?

Redis 基本原理 Redis 简介 Redis 是一款基于 ANSI C 语言编写的&#xff0c;BSD 许可的&#xff0c;日志型 key-value 存储组件&#xff0c;它的所有数据结构都存在内存中&#xff0c;可以用作缓存、数据库和消息中间件。 Redis 是 Remote dictionary server 即远程字典服务…...

上一篇文章补充:已经存在的小文件合并

对于HDFS上已经存在的大量小文件问题&#xff0c;有多种策略可以进行处理和优化&#xff1a; 1. **合并小文件**&#xff1a; - **使用Spark作业合并**&#xff1a;通过编写Spark程序读取小文件并调用repartition()或coalesce()函数重新分区数据&#xff0c;然后将合并后的…...

代码随想录训练营第三十期|第四十三天|动态规划 part05|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; class Solution {public int lastStoneWeightII(int[] stones) {int sum 0;for (int n : stones) {sum n;}int target sum / 2;int[] dp new int[target 1];for (int i 0; i < stones.length; i…...

c++学习记录 string容器—字符串插入和删除

函数原型&#xff1a; string& insert(int pos,const char* s); //插入字符串string& insert(int pos,const string& str); //插入字符串string& insert(int pos,int n,char c); //在指定位置插入n个字符cstring&…...

【IEEE会议征稿】2024年第九届智能计算与信号处理国际学术会议(ICSP 2024)

2024年第九届智能计算与信号处理国际学术会议&#xff08;ICSP 2024&#xff09; 2024年第八届智能计算与信号处理国际学术会议&#xff08;ICSP 2024&#xff09;将在西安举行&#xff0c; 会期是2024年4月19-21日&#xff0c; 为期三天, 会议由西安科技大学主办。 欢迎参会&…...

【电机仿真】HFI算法脉振高频电压信号注入观测器-PMSM无感FOC控制

【电机仿真】HFI算法脉振高频电压信号注入观测器-PMSM无感FOC控制 文章目录 前言一、脉振高频电压注入法简介&#xff08;注入在旋转坐标系的d轴&#xff09;1.旋转高频电压&#xff08;电流&#xff09;注入法2.脉振高频电压注入法 二、高频注入理论1.永磁同步电机的高频模型2…...

Java学习——集合框架

Java集合框架&#xff08;Java Collections Framework&#xff09;是一套性能优良、使用方便的接口和类的集合&#xff0c;它位于java.util包下。这个框架包含了一系列集合接口的标准实现&#xff0c;比如列表、集合、队列&#xff0c;以及映射。使用这些集合&#xff0c;你可以…...

【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期

一、背景 主要梳理下鸿蒙系统开发中常用的生命周期 二、UIAbility组件 UIAbility组件是一种包含UI界面的应用组件&#xff0c;主要用于和用户交互。 UIAbility组件是系统调度的基本单元&#xff0c;为应用提供绘制界面的窗口&#xff1b;一个UIAbility组件中可以通过多个页…...

jdk动态代理与CGLib动态代理

jdk动态代理 目标对象 package com.study;/*** 目标对象&#xff08;被代理的对象&#xff09;**/ public class Target implements TargetInf{public String name;public Target() {}public Target(String name) {this.name name;}public String buyCola (String name){Sys…...

Linux 命令行的世界 :4.操作文件和目录

此时此刻&#xff0c;我们已经准备好了做些真正的工作&#xff01;这一章节将会介绍以下命令&#xff1a; • cp —复制文件和目录 • mv —移动/重命名文件和目录 • mkdir —创建目录 • rm —删除文件和目录 • ln —创建硬链接和符号链接 图形文件管理器能轻松地实现…...

如何使用ArcGIS Pro生成等高线

无论在制图还是规划中&#xff0c;经常会使用到等高线&#xff0c;大多数情况下&#xff0c;从网上获取的高程数据都是DEM文件&#xff0c;我们可以通过ArcGIS Pro来生成等高线&#xff0c;这里为大家介绍一下生成方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的…...

golang学习2,golang开发配置国内镜像

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct...

Stable Diffusion 绘画入门教程(webui)-ControlNet(线稿约束)

上篇文章介绍了openpose&#xff0c;本篇文章介绍下线稿约束&#xff0c;关于线稿约束有好几个处理器都属于此类型&#xff0c;但是有一些区别。 包含&#xff1a; 1、Canny(硬边缘&#xff09;&#xff1a;识别线条比较多比较细&#xff0c;一般用于更大程度得还原照片 2、ML…...

前端笔记——var let const 之间的区别

Var&#xff1a; 关键字来声明变量。它有以下特点&#xff1a; var声明的变量作用域是函数级的&#xff0c;即在函数内部声明的变量在整个函数范围内可见。 var变量可以被重复声明&#xff0c;而不会引发错误。 var变量会存在变量提升&#xff08;hoisting&#xff09;现象&…...

AI工具新革命:从ChatGPT到Sora,生成式AI改变世界

这个春节着实精彩&#xff0c;“春山学”吃透了&#xff0c;不如把目光移向OpenAI又一重磅产品——文生视频大模型Sora。智能新纪元已然开启&#xff0c;因为正如周鸿祎所说&#xff1a;“,Sora的诞生意味着AGI&#xff08;通用人工智能&#xff09;的实现将从10年缩短到1年。”…...

C 标准库 - <stdio.h> 详解

在 C 语言中&#xff0c;stdio.h 是一个非常重要的头文件&#xff0c;定义了一系列用于输入和输出的函数、变量和宏。本文将逐一介绍 stdio.h 中定义的函数&#xff0c;并提供每个函数的完整示例。 变量类型 在 stdio.h 中定义了三个变量类型&#xff1a; size_t&#xff1a…...

支付宝小程序中唤起支付(前后端)

Java后台获取支付宝支付唯一订单号 /*** 支付宝小程序支付*/PostMapping(value "/xcxPayZFBTHREE")ResponseBodypublic Map<String,Object> xcxPayZFBTHREE(RequestBody byte[] req) {HashMap<String, Object> objectObjectMap new HashMap<>();…...

AI:139-基于深度学习的语音指令识别与执行

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…...

选择 Python IDE(VSCode、Spyder、Visual Studio 2022和 PyCharm)

前言 当选择 Python 开发工具时&#xff0c;你需要考虑自己的需求、偏好和项目类型。下面是对VSCode、Spyder、Visual Studio 2022和 PyCharm的对比推荐总结&#xff1a; 结论 1、如果你专注于“数据科学”&#xff0c;选择SpyDer没错。 内容 Visual Studio Code (VS Code)…...

Rabbitmq 超时异常解决:PRECONDITION_FAILED - Timeout value used: 1800000 ms.

Rabbitmq 超时异常解决&#xff1a;PRECONDITION_FAILED - Timeout value used: 1800000 ms. 在使用 docker 启动 rabbitmq 的时候&#xff0c;执行一个超长时间的任务&#xff0c;出现了报错。 查询了一下发现&#xff0c;这个问题在于 rabbitmq 默认客户端超时时间是30分钟,…...

Java架构师之路二、数据库:SQL语言、关系型数据库、非关系型数据库、数据一致性、事务管理等。

目录 SQL语言&#xff1a; 关系型数据库&#xff1a; 非关系型数据库&#xff1a; 数据一致性&#xff1a; 事务管理&#xff1a; 上篇&#xff1a;Java架构师之路一、Java基础知识&#xff1a;Java语言特性、集合框架、IO流、多线程、反射、注解等基础知识。-CSDN博客 下…...

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…...

springAOP落地实现

文章目录 前言一、熟悉相关概念&#xff1a;1、Aspect&#xff1a;2、Pointcut&#xff1a;3、Before&#xff1a;4、AfterReturning&#xff1a;5、AfterThrowing&#xff1a;6、After&#xff1a;7、Around&#xff1a; 二、具体使用case&#xff1a;1.pom文件2.代码 总结 前…...

Linux学习之vi/vim详细介绍

目录 ​编辑 1. 什么是 vim&#xff1f; 2. vi/vim 的使用 2.1 命令模式 2.2 输入模式 2.3 底线命令模式 3. vi/vim 使用实例 3.1 使用 vi/vim 进入一般模式 3.2 按下 i 进入输入模式(也称为编辑模式)&#xff0c;开始编辑文字 3.3 按下 ESC 按钮回到一般模式…...

【AIGC大模型】跑通wonder3D (windows)

论文链接&#xff1a;https://arxiv.org/pdf/2310.15008.pdf windows10系统 显卡&#xff1a;NVIDIA rtx 2060 一、安装anaconda 二、安装CUDA 11.7 (CUDA Toolkit 11.7 Downloads | NVIDIA Developer) 和 cudnn 8.9.7(cuDNN Archive | NVIDIA Developer)库 CUDA选择自定…...

Opencv(2)深浅拷贝与基本绘图(c++python

Opencv(2)深浅拷贝与基本绘图 文章目录 Opencv(2)深浅拷贝与基本绘图三、深浅拷贝四、HSV色域(1).意义(2).cvtColor()(3).inRange()(4).适应光线 三、深浅拷贝 浅拷贝是指当图像之间进行赋值时&#xff0c;图像数据并未发生复制&#xff0c;而是两个对象都指向同一块内存块。 …...

二叉树与堆

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.4 二叉树的性质 2.5 二叉树的…...

神经网络系列---损失函数

文章目录 损失函数均方误差&#xff08;Mean Squared Error&#xff0c;MSE&#xff09;&#xff1a;平均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09;&#xff1a;交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;&#xff1a;Hinge Loss&a…...

LeetCode每日一题 有效的字母异位词(哈希表)

题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1&#xff1a; 输入: s "anagram", t "nagaram" 输…...

设计模式学习笔记 - 面向对象 - 8.实践:贫血模型和充血模型的原理及实践

1.Web开发常用的贫血MVC架构违背OOP吗&#xff1f; 前面我们依据讲过了面向对象四大特性、接口和抽象类、面向对象和面向过程编程风格&#xff0c;基于接口而非实现编程和多用组合少用继承设计思想。接下来&#xff0c;通过实战来学习如何将这些理论应用到实际的开发中。 大部…...

AI新纪元:可能的盈利之道

本文来源于Twitter大神宝玉&#xff08;dotey&#xff09;在聊 Sora 的时候&#xff0c;总结了 Sora 的价值和可能的盈利方向&#xff0c;我把这部分内容单独摘出来再整理一下。现在的生成式 AI 大家应该不陌生&#xff0c;用它总结文章、翻译、写作、画图&#xff0c;当然真正…...