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

Linux服务之Nginx服务部署及基础配置

目录

一.Nginx介绍

1.Nginx功能介绍

2.基础特性

3.Web服务相关的功能

4.I/O模型相关概念

5.nginx模块

6.Nginx文件存放位置

7.Nginx事件驱动模型

二.平滑升级及信号使用

1.Nginx 程序当作命令使用

2.信号类型

3.平滑升级nginx

4.回滚

三.Nginx调优

1.隐藏版本号或修改名称

2.修改worker进程数和cpu一致

3.cpu亲缘绑定

4.提高nginx进程的优先级

5.设置nginx可以打开文件的上限,需要和系统limit参数配合


一.Nginx介绍

1.Nginx功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源

  • http/https协议的反向代理 ,7层 url

  • 结合FastCGI /uWSGI/SCGI等协议反向代理动态资源请求

  • tcp/udp协议的请求转发(反向代理) 4层

2.基础特性

  • 模块化设计,较好的扩展性

  • 高可靠性

  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件

  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存

  • event-driven, aio, mmap,sendfile

3.Web服务相关的功能

  • 虚拟主机(server)

  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)

  • 访问日志(支持基于日志缓冲提高其性能)

  • url rewirte

  • 路径别名

  • 基于IP及用户的访问控制

  • 支持速率限制及并发数限制

  • 重新配置和在线升级而无须中断客户的工作进程

4.I/O模型相关概念

①Nginx服务使用异步非阻塞模式:请求不需要排队,会反馈任务的完成结果。

②Apache服务使用同步阻塞模式:请求需要排队,且不会主动返回结果。

③同步/异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时。被调用者是否提供完成。

④同步:调用者需要主动询问结果。

⑤异步:调用者不需要主动询问结果,被调用者会主动返回结果。

⑥阻塞:系统同时只能处理1个请求,另外的请求需要排队。

⑦非阻塞:系统同时处理多个请求。

5.nginx模块

  • 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能

  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等

  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等

  • 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持

  • Stream服务模块: 实现反向代理功能,包括TCP协议代理 四层

  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

常用模块

ngx_http_core_module         核心模块
ngx_http_access_module       访问控制  
ngx_http_auth_basic_module   身份验证
ngx_http_gzip_module         压缩模块
ngx_http_log_module          日志模块
ngx_http_proxy_module        代理模块
ngx_http_rewrite_module      重写模块
ngx_http_stub_status_module  状态页模块
ngx_http_upstream_module     反向代理
ngx_http_stream_module       四层代理

6.Nginx文件存放位置

安装方式日志文件  配置文件     默认主站点
ubuntu 编译 安装目录下 logs目录下安装目录下 conf目录下 安装目录下 html 目录下/index.html
centos7编译 安装目录下 logs目录下安装目录下 conf目录下 安装目录下 html 目录下/index.html
apt  /var/log/nginx/   /etc/nginx/nginx.conf  /var/www/html/index.html
 
yum  /var/log/nginx/   /etc/nginx/nginx.conf  

 /usr/share/nginx/html/index.html

7.Nginx事件驱动模型

①select:一个应用程序,代理系统功能处理异步请求,最大连接数是1024个。

它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。

②poll:select加强版取消了1024最大连接数。

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的。

③epoll:poll的加强版。

epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。

二.平滑升级及信号使用

1.Nginx 程序当作命令使用

nginx  -v     显示当前程序版本            

常用选项

-V      显示当前程序版本及编译信息          

 -t        检测配置文件是否有错误            

-T       检测配置文件是否有错误,并打印当前配置文件

nginx    启动nginx服务

nginx命令kill命令含义
nginx -s relaodkill -s HUP重新加载配置文件
nginx -s stopkill -9(KILL)立即停止
nginx -s quitkill -3(QUITt)优雅的退出
nginx -s reopenkill -s USR1重新生成日志文件
nginxkill -s USR2飞行中升级

2.信号类型

stop          SIGTERM        直接停止
quit           SIGQUIT        优雅的退出:有人在访问不会结束进程
reopen       SIGUSR1        分割日志
reload       SIGHUP         重新加载配置文件
                 
             SIGQUIT          Shut down gracefully.  优雅的关闭:有人在访问不会结束进程
             SIGUSR1          Reopen log files.       重新分割日志
             SIGUSR2          Upgrade the nginx executable on the fly.  运行中升级
             SIGWINCH         Shut down worker processes gracefully.    优雅的关闭worker进程,work进程负责处理请求,还有请求不会关闭

3.平滑升级nginx

  1. 将旧Nginx文件换成新Nginx文件(注意备份)

  2. 向master进程发送USR2信号

  3. master进程修改pid文件名,加后缀.oldbin

  4. master进程用新Nginx文件启动新master进程,系统中将有新旧两个Nginx主进程共同提供Web服务

  5. 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止,并删除Nginx.pid.oldbin文件

  6. 向旧master进程发送QUIT信号,关闭老master

  7. 如果发现升级有问题,可以回滚向老master发送HUP,向新master发送QUIT

具体步骤:

ps aux |grep nginx
#先查看是否开启nginx
root      26603  0.0  0.0  46204  1160 ?        Ss   04:58   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     26604  0.0  0.1  48736  2240 ?        S    04:58   0:00 nginx: worker process
root      30924  0.0  0.0 118744  1152 pts/1    S+   10:10   0:00 man /opt/nginx-1.18.0/man/nginx.8
root      31035  0.0  0.0 112824   976 pts/2    S+   10:16   0:00 grep --color=auto nginx


[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
#开启 两核
#user  nobody;
worker_processes  2;
#worker_processes  1 原来是1核


[root@localhost ~]#nginx -s reload
#重新加载配置文件

[root@localhost ~]#ps aux |grep nginx
root      26603  0.0  0.1  46344  2012 ?        Ss   04:58   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root      30924  0.0  0.0 118744  1152 pts/1    S+   10:10   0:00 man /opt/nginx-1.18.0/man/nginx.8
nginx     31132  0.0  0.1  48856  2092 ?        S    10:17   0:00 nginx: worker process
nginx     31133  0.0  0.1  48856  2080 ?        S    10:17   0:00 nginx: worker process
##此处多了一个子进程
root      31158  0.0  0.0 112824   972 pts/2    S+   10:19   0:00 grep --color=auto nginx
[root@localhost ~]#ps auxf |grep nginx
#查看进程树
root      30924  0.0  0.0 118744  1152 pts/1    S+   10:10   0:00  |       \_ man /opt/nginx-1.18.0/man/nginx.8
root      31184  0.0  0.0 112824   976 pts/2    S+   10:20   0:00          \_ grep --color=auto nginx
root      26603  0.0  0.1  46344  2012 ?        Ss   04:58   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     31132  0.0  0.1  48856  2092 ?        S    10:17   0:00  \_ nginx: worker process
nginx     31133  0.0  0.1  48856  2080 ?        S    10:17   0:00  \_ nginx: worker process

[root@localhost ~]#wget https://nginx.org/download/nginx-1.20.2.tar.gz -P /usr/local/src/
#下载安装包到src目录

[root@localhost ~]#cd /usr/local/src/
[root@localhost src]#ls
nginx-1.20.2.tar.gz
[root@localhost src]#tar xf nginx-1.20.2.tar.gz 
[root@localhost src]#cd nginx-1.20.2/
[root@localhost nginx-1.20.2]#ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src

############################################################################
# 这时需要重新编译安装   ./configure   安装参数基本一致  这时可以使用 nginx -V  查看 #
############################################################################

[root@localhost nginx-1.20.2]#nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --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
########################################################################
如果 有新模块在后添加即可
########################################################################

[root@localhost nginx-1.20.2]#./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
#重新编译
[root@localhost nginx-1.20.2]#make
###########注意不要执行  make install######

[root@localhost objs]#cd objs    
#此文件夹中有新版本的nginx  运行程序
[root@localhost nginx-1.20.2]#objs/nginx -v
#查看版本
nginx version: nginx/1.20.2

[root@localhost nginx-1.20.2]#mv /apps/nginx/sbin/nginx   /apps/nginx/sbin/nginx.bak
#将低版本的nginx主程序改名

[root@localhost nginx-1.20.2]#cp objs/nginx /apps/nginx/sbin/
#将新版本 拷入进去
[root@localhost nginx-1.20.2]#ll /apps/nginx/sbin/
总用量 15308
-rwxr-xr-x. 1 root root 7896080 4月  21 10:46 nginx
-rwxr-xr-x. 1 root root 7774624 4月  19 10:43 nginx.bak

[root@localhost nginx-1.20.2]#/apps/nginx/sbin/nginx -t
#检查下语法问题
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful

[root@localhost nginx-1.20.2]#kill -USR2 `cat /apps/nginx/logs/nginx.pid`
#发送 2 信号   信号在 man手册中可以看到
SIGNALS
     The master process of nginx can handle the following signals:

     SIGINT, SIGTERM  Shut down quickly.
     SIGHUP           Reload configuration, start the new worker process with a new configuration,
                      and gracefully shut down old worker processes.
     SIGQUIT          Shut down gracefully.
     SIGUSR1          Reopen log files.
     SIGUSR2          Upgrade the nginx executable on the fly.
     #                飞行中升级
     SIGWINCH         Shut down worker processes gracefully.

     While there is no need to explicitly control worker processes normally, they support some sig‐
     nals too:

     SIGTERM          Shut down quickly.
     SIGQUIT          Shut down gracefully.
     SIGUSR1          Reopen log files.


[root@localhost nginx-1.20.2]#ps auxf|grep nginx
#生成新的master
root      34765  0.0  0.0 112824   976 pts/2    S+   10:53   0:00          \_ grep --color=auto nginx
root      26603  0.0  0.1  46344  2012 ?        Ss   04:58   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     31132  0.0  0.1  48856  2092 ?        S    10:17   0:00  \_ nginx: worker process
nginx     31133  0.0  0.1  48856  2080 ?        S    10:17   0:00  \_ nginx: worker process
root      34761  0.0  0.1  46220  3360 ?        S    10:53   0:00  \_ nginx: master process /apps/ngin/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     34762  0.0  0.1  48756  1988 ?        S    10:53   0:00      \_ nginx: worker process
nginx     34763  0.0  0.1  48756  1988 ?        S    10:53   0:00      \_ nginx: worker process


[root@localhost nginx-1.20.2]#lsof -i :80
#查看谁在监听 80
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   26603  root    6u  IPv4  73696      0t0  TCP *:http (LISTEN)
nginx   31132 nginx    6u  IPv4  73696      0t0  TCP *:http (LISTEN)
nginx   31133 nginx    6u  IPv4  73696      0t0  TCP *:http (LISTEN)
nginx   34761  root    6u  IPv4  73696      0t0  TCP *:http (LISTEN)
nginx   34762 nginx    6u  IPv4  73696      0t0  TCP *:http (LISTEN)
nginx   34763 nginx    6u  IPv4  73696      0t0  TCP *:http (LISTEN)

检验
[root@localhost html]#dd if=/dev/zero of=/apps/nginx/html/m.img bs=1G count=10
记录了10+0 的读入
记录了10+0 的写出
10737418240字节(11 GB)已复制,19.3238 秒,556 MB/秒
[root@localhost html]#ls
50x.html  index.html  m.img
[root@localhost html]#pwd
/apps/nginx/html


#开启新机器下载
[root@localhost data]#wget --limit-rate=1M http://192.168.91.100/m.img
--2022-04-21 11:05:14--  http://192.168.91.100/m.img
正在连接 192.168.91.100:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:10737418240 (10G) [application/octet-stream]
正在保存至: “m.img”

#回到网页服务器
[root@localhost html]#ss -ntap|grep 80
#查看那个进程在管理 下载
LISTEN     0      128          *:80                       *:*                   users:(("nginx",pid=34763,fd=6),("nginx",pid=34762,fd=6),("nginx",pid=34761,fd=6),("nginx",pid=26603,fd=6))
ESTAB      0      993328 192.168.91.100:80                 192.168.91.101:52402               users:(("nginx",pid=34763,fd=7))


[root@localhost man]#ls /apps/nginx/run/
#会有 新老两个进程
nginx.pid  nginx.pid.oldbin
[root@localhost man]#cat /apps/nginx/run/nginx.pid.oldbin 
26603

[root@localhost man]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
#优雅关闭老进程的  worker 进程      

#再开启一台服务器测试 是否是新的进程 在下载
[root@localhost ~]# wget --limit-rate=1M http://192.168.91.100/m.img
--2022-04-21 11:14:36--  http://192.168.91.100/m.img
正在连接 192.168.91.100:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:10737418240 (10G) [application/octet-stream]
正在保存至: “m.img”

#回到网页服务器可以看到   之前的在 但是又开启了一个 102
[root@localhost html]#ss -ntap|grep 80
LISTEN     0      128          *:80                       *:*                   users:(("nginx",pid=34763,fd=6),("nginx",pid=34762,fd=6),("nginx",pid=34761,fd=6),("nginx",pid=26603,fd=6))
ESTAB      0      993328 192.168.91.100:80                 192.168.91.101:52402               users:(("nginx",pid=34763,fd=7))
ESTAB      0      957128 192.168.91.100:80                 192.168.91.102:44266               users:(("nginx",pid=34763,fd=12))


测试一段时间无问题  就可以了
[root@localhost html]#pstree -p |grep nginx
#查看进程关系     1.18          
  |-nginx(26603)
                      --nginx(work 23333)
                      --nginx(34761M)-+-nginx(34762)
  |                      1.20        `-nginx(34763)
 

4.回滚

[root@localhost man]#kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
#唤起老的进程
[root@localhost man]#ps aux|grep nginx
#又有两个master
root      26603  0.0  0.1  46344  2028 ?        Ss   04:58   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root      34761  0.0  0.1  46220  3360 ?        S    10:53   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     34762  0.0  0.1  48756  1988 ?        S    10:53   0:00 nginx: worker process
nginx     34763  0.0  0.1  48756  2232 ?        S    10:53   0:01 nginx: worker process
nginx     35296  0.0  0.1  48856  2092 ?        S    11:25   0:00 nginx: worker process
nginx     35297  0.0  0.1  48856  2092 ?        S    11:25   0:00 nginx: worker process
root      35303  0.0  0.0 112824   976 pts/1    S+   11:26   0:00 grep --color=auto nginx

[root@localhost man]#kill -WINCH `cat /apps/nginx/logs/nginx.pid`
#优雅关闭新进程的worker进程      

[root@localhost sbin]#curl -I 127.1
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Thu, 21 Apr 2022 03:35:18 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Apr 2022 02:43:17 GMT
Connection: keep-alive
ETag: "625e21c5-264"
Accept-Ranges: bytes

三.Nginx调优

1.隐藏版本号或修改名称

#修改配置文件  放在   http语句中
http {
    server_tokens  off;

#nginx -s reload
#重新加载

验证
[root@localhost sbin]#curl -I http://192.168.91.100/
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Thu, 21 Apr 2022 03:34:51 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Apr 2022 02:43:17 GMT
Connection: keep-alive
ETag: "625e21c5-264"
Accept-Ranges: bytes

[root@localhost sbin]#curl -I http://192.168.91.100/
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 21 Apr 2022 04:04:23 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Apr 2022 02:43:17 GMT
Connection: keep-alive
ETag: "625e21c5-264"
Accept-Ranges: bytes

自行修改

#去修改源码,在安装包里, 再重新编译  #号不要去掉
#先把nginx服务关闭,不然编译不成功

[root@localhost core]#vim  /opt/nginx-1.18.0/src/core/nginx.h
13 #define NGINX_VERSION      "9527"
14 #define NGINX_VER          "http/" NGINX_VERSION

[root@localhost core]#vim /opt/nginx-1.18.0/src/http/ngx_http_header_filter_module.c
49 static u_char ngx_http_server_string[] = "Server: lucky" CRLF;

重新编译安装
./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

[root@localhost nginx-1.18.0]#make && make install

2.修改worker进程数和cpu一致

worker_processes  1;   
#允许的启动工作进程数数量,和你真实的cpu数量有关   1

worker_processes auto;
#如果设置为auto  就是你真实的cpu数量

[root@localhost ~]#ps axo pid,cmd,psr,ni|grep nginx
#可以看到 nginx的  worker数量
 18620 nginx: master process /usr/   0   0
 18621 nginx: worker process         2   0
 18622 nginx: worker process         3   0
 18623 nginx: worker process         0   0
 18624 nginx: worker process         3   0
 18641 grep --color=auto nginx       0   0

3.cpu亲缘绑定

worker_cpu_affinity 00000001 00000010 00000100 00001000;第0号---第3号CPU   
#序号绑定cpu    亲缘性
worker_cpu_affinity 00000101 00001010;
#同一个work  可以绑定  两个cpu可以这么写 但是不建议,本来就是 不希望飘动,这样也是飘动


实际操作
例子:
user nginx;
worker_processes auto;
worker_cpu_affinity 00000001 00000010;
#绑定到  第一 和 第二块cpu上
error_log /var/log/nginx/error.log;
#注意 要绑一起绑


[root@localhost ~]#ps axo pid,cmd,psr,ni|grep -v grep |grep nginx|sort -n
 18620 nginx: master process /usr/   2   0
 18951 nginx: worker process         0   0
 18952 nginx: worker process         1   0
 18954 grep --color=auto nginx       2   0
 
 
 验证cpu乱跑可以刷新网页即可
while true ;do ab -c 1000 -n 1000 http://192.168.91.100/;done
 

4.提高nginx进程的优先级

ps axo pid,cmd,psr,ni|grep nginx|sort -n
#查看默认优先级,默认优先级为0
 18620 nginx: master process /usr/   3   0
 19045 nginx: worker process         0   0
 19046 nginx: worker process         1   0
 19082 vim /etc/nginx/nginx.conf     1   0
 19173 grep --color=auto nginx       1   0

修改配置文件
user nginx;
worker_processes 2;
worker_cpu_affinity 00000101 00000010;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
worker_priority -20;
#添加此项
nginx -s reload

[root@localhost ~]#ps axo pid,cmd,psr,ni|grep nginx|sort -n
 18620 nginx: master process /usr/   3   0
 19196 nginx: worker process         0 -20
 19197 nginx: worker process         1 -20
 19199 grep --color=auto nginx       1   0
 

5.设置nginx可以打开文件的上限,需要和系统limit参数配合

pid /run/nginx.pid;
worker_priority -20;
worker_rlimit_nofile 65536; 
#所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致。

vim /etc/security/limits.conf 
#最后加入

*                soft    core            unlimited
*                hard    core            unlimited
*                soft    nproc           1000000
*                hard    nproc           1000000
*                soft    nofile          1000000
*                hard    nofile          1000000
*                soft    memlock         32000
*                hard    memlock         32000
*                soft    msgqueue        8192000
*                hard    msgqueue        8192000

#设置完后重启

相关文章:

Linux服务之Nginx服务部署及基础配置

目录 一.Nginx介绍 1.Nginx功能介绍 2.基础特性 3.Web服务相关的功能 4.I/O模型相关概念 5.nginx模块 6.Nginx文件存放位置 7.Nginx事件驱动模型 二.平滑升级及信号使用 1.Nginx 程序当作命令使用 2.信号类型 3.平滑升级nginx 4.回滚 三.Nginx调优 1.隐藏版本号或…...

Centos小白之在CentOS8.5中安装Rabbitmq 3.10.8

注意事项 安装以及运行等其他操作,要使用root账号进行,否则会遇到很多麻烦的事情。 使用命令行进行远程登录 ssh root192.168.0.167 安装make 执行安装命令 yum -y install make gcc gcc-c kernel-devel m4 ncurses-devel openssl-devel这里有可能会…...

基于单片机的游泳馆智能管理系统设计与实现

标题:基于单片机的游泳馆智能管理系统设计与实现 内容:1.摘要 随着游泳馆规模的不断扩大和管理需求的日益提高,传统的管理方式已难以满足高效、精准的管理要求。本文旨在设计并实现一种基于单片机的游泳馆智能管理系统。采用单片机作为核心控制单元,结合…...

深度相机(一)——深度相机模型及用途介绍

一、深度相机概述 深度相机,又称 3D 相机,是一种能够获取场景中物体深度信息(即物体到相机的距离)的设备。与传统相机只能拍摄二维平面图像不同,深度相机不仅能记录物体的颜色和纹理,还能通过特定技术手段测…...

【Torch】nn.Conv1d、nn.Conv2d、nn.Conv3d算法详解

1. nn.Conv1d 1.1 输入(Input)和输出(Output) 输入张量 形状:(batch_size, in_channels, length) batch_size:一次过网络的样本数in_channels:每个样本的通道数(特征维度&#xff0…...

Android WebRTC回声消除

文章目录 安卓可用的回声消除手段各种回声消除技术优缺点WebRTC回声消除WebRTC回声消除回声消除处理流程WebRTC AECM APP 安卓可用的回声消除手段 硬件回声消除 使用 AudioRecord 的 VOICE_COMMUNICATION 模式:通过 AudioRecord 的 VOICE_COMMUNICATION 音频源可以…...

[Linux运维] [Ubuntu/Debian]在Lightsail Ubuntu服务器上安装Python环境的完整指南

在之前的教程中,我们已经讲过如何开通亚马逊Lightsail服务器并安装宝塔面板。今天,我们来进一步补充:如何在Lightsail上的Ubuntu/Debian系统中安装和配置Python开发环境。 本教程不仅适用于Lightsail服务器,也适用于所有使用Ubunt…...

2025医疗领域AI发展五大核心趋势与路线研究

引言 人工智能技术正在全球范围内深刻改变医疗服务的提供方式,推动全球医疗的普惠化、技术合作、产业升级以及公共卫生防控发生巨变[0]。医疗AI的浪潮奔涌向前,从2024年开始,生成式AI的爆发式发展更是将医疗AI推到了新的十字路口[1]。在这一背景下,本报告将深入探讨医疗领…...

【学习笔记】机器学习(Machine Learning) | 第六周|过拟合问题

机器学习(Machine Learning) 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习(Machine Learning)简要声明 摘要过拟合与欠拟合问题一、回归问题中的过拟合1. 欠拟合(Underfit&#x…...

【MQ篇】RabbitMQ之惰性队列!

目录 引言:当“生产”大于“消费”,队列就“胖”了!肥宅快乐队列?🤔队列界的“躺平”大师:惰性队列(Lazy Queues)驾到!😴如何“激活”你的队列的“惰性”属性…...

计算机视觉——通过 OWL-ViT 实现开放词汇对象检测

介绍 传统的对象检测模型大多是封闭词汇类型,只能识别有限的固定类别。增加新的类别需要大量的注释数据。然而,现实世界中的物体类别几乎无穷无尽,这就需要能够检测未知类别的开放式词汇类型。对比学习(Contrastive Learning&…...

第二部分:网页的妆容 —— CSS(下)

目录 6 布局基础:Display 与 Position - 元素如何排列和定位6.1 小例子6.2 练习 7 Flexbox 弹性布局:一维布局利器7.1 小例子7.2 练习 8 Grid 网格布局:强大的二维布局系统8.1 小例子8.2 练习 9 响应式设计与媒体查询:适应不同设备…...

vite项目tailwindcss4的使用

1、安装taillandcss 前几天接手了一个项目,看到别人用tailwindcss节省了很多css代码的编写,所以自己也想在公司项目中接入tailwindcss。 官网教程如下: Installing Tailwind CSS with Vite - Tailwind CSS 然而,我在vite中按…...

css中:is和:where 伪函数

在 CSS 里,:is() 属于伪类函数,其作用是对一组选择器进行匹配,只要元素与其中任何一个选择器相匹配,就可以应用对应的样式规则。以下是详细介绍: 基本语法 :is() 函数的参数是一个或多个选择器,各个选择器之…...

线下零售数据采集:在精度与效率之间寻找平衡点

线下零售数据采集:在精度与效率之间寻找平衡点 为什么线下零售必须重视数据采集? 随着零售行业竞争加剧,门店执行的标准化与透明化成为供应链协作、销售提升的基础工作。 POG(陈列执行规范)的落地效果、陈列策略的调整…...

【Robocorp实战指南】Python驱动的开源RPA框架

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:网页数据抓取案例2:Excel报表生成 运行结果验证 三、性能对比测试方…...

新ubuntu物理机开启ipv6让外网访问

Ubuntu 物理机 SSH 远程连接与 IPv6 外网访问测试指南 1. 通过 SSH 远程连接 Ubuntu 物理机 1.1 安装 SSH 服务 sudo apt update sudo apt install openssh-server1.2 检查 SSH 服务状态 sudo systemctl status ssh确认出现 active (running)。 1.3 获取物理机 IP 地址 i…...

驱动开发硬核特训 │ Regulator 子系统全解

一、Regulator子系统概述 在 Linux 内核中,Regulator 子系统是专门用于管理电源开关、电压调整、电流控制的一套完整框架。 它主要解决以下问题: 设备需要的电压通常不一样,如何动态调整?有些设备休眠时需要关闭供电&#xff0…...

入门版 鸿蒙 组件导航 (Navigation)

入门版 鸿蒙 组件导航 (Navigation) 注意:使用 DevEco Studio 运行本案例,要使用模拟器,千万不要用预览器,预览器看看 Navigation 布局还是可以的 效果:点击首页(Index)跳转到页面&#xff08…...

怎样将visual studio 2015开发的项目 保存为2010版本使用

用的老旧电脑跑vs2015太慢了,实在忍不了了! 想把用 Visual Studio 2015 的做的项目保存为 Visual Studio 2010 兼容的格式,以后都使用2010写了。自己在网上搜了一下,亲测以下步骤可以的 手动修改解决方案和项目文件 修改解决方案…...

【学习笔记】软件测试流程-测试设计阶段

软件测试设计阶段这个阶段主要工作是编写测试用例。 什么是测试用例? 测试用例(TestCase)是为项目需求而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序是否满足客户需求。简而言之,测试用例是每一个测…...

Rust 学习笔记:关于切片的两个练习题

Rust 学习笔记:关于切片的两个练习题 Rust 学习笔记:关于切片的两个练习题引用和切片引用的大小以下程序能否通过编译? Rust 学习笔记:关于切片的两个练习题 参考视频: https://www.bilibili.com/video/BV1GrDQYeEzS…...

BeeWorks企业内部即时通讯软件支持国产化,已在鸿蒙系统上稳定运行

一、企业用户面临的困境与痛点 一些企业用的即时通讯软件比较旧,存在的问题不仅影响了日常工作的正常开展,也阻碍了企业信息化建设的进程: ● 国产系统与移动端不兼容:仅支持Windows和MAC系统,无法在银河麒麟、统信U…...

java对文字按照语义切分

实现目标 把一段文本按照一个完整的一句话为单元进行切分。如&#xff1a;以逗号&#xff0c;感叹号结尾看作是一个句子。 实现方案 StanfordCoreNLP切分 引入依赖 <dependency><groupId>edu.stanford.nlp</groupId><artifactId>stanford-corenlp<…...

华纳云:centos如何实现JSP页面的动态加载

JSP(JavaServer Pages)作为Java生态中常用的服务器端网页技术&#xff0c;具有动态内容生成、可扩展性强、与Java无缝结合等优势。 而CentOS作为一款稳定、高效、安全的Linux服务器操作系统&#xff0c;非常适合部署JSP应用。 想要让JSP页面实现动态更新加载&#xff0c;避免…...

Android 消息队列之MQTT的使用(二):会话+消息过期机制,设备远程控制,批量控制实现

目录 一、实际应用场景 室内温湿度数据上传设备远程控制批量控制实现 二、会话管理、消息过期设置 4.1 会话管理 Clean Session参数 新旧会话模式对比典型应用场景 4.2 消息过期设置 MQTT 5.0消息过期机制 Message Expiry Interval属性QoS级别影响 三、实际应用场景 …...

一、JVM基础概念

一、JVM的设计目标 一次编译&#xff0c;到处运行(跨平台) ➔ Java编译成字节码&#xff0c;由JVM在不同平台解释/编译执行&#xff0c;实现跨平台。 内存管理与垃圾回收 ➔ JVM统一负责内存分配和回收&#xff0c;降低内存泄漏的风险。 性能优化 ➔ JIT&#xff08;即时编译…...

深度学习---Pytorch概览

一、PyTorch 是什么&#xff1f; 1. 定义与定位 开源深度学习框架&#xff1a;由 Facebook&#xff08;Meta&#xff09;AI 实验室开发&#xff0c;基于 Lua 语言的 Torch 框架重构&#xff0c;2017 年正式开源&#xff0c;主打动态计算图和易用性。核心优势&#xff1a;灵活…...

第33周JavaSpringCloud微服务 分布式综合应用

第33周JavaSpringCloud微服务 分布式综合应用 一、分布式综合应用概述 分布式知识体系内容广泛&#xff0c;主要包括分布式事务、分布式锁、RabbitMQ等消息中间件的应用以及跨域问题的解决。 1.1 课程重点内容介绍 分布式事务 &#xff1a;在大型项目中普遍存在&#xff0c;…...

Paramiko 完全指南

目录 Paramiko 概述核心功能与模块框架安装与依赖基础用法与案例详解 SSH 连接与命令执行密钥认证SFTP 文件传输交互式会话端口转发 高级功能与实战技巧常见问题与解决方案总结与资源推荐 1. Paramiko 概述 是什么&#xff1f; Paramiko 是一个纯 Python 实现的 SSHv2 协议库…...

夜莺监控V8(Nightingale)二进制部署教程(保姆级)

夜莺监控部署 前置工作 1. 部署好mysql 2. 部署好redis 3. 部署好prometheus夜莺压缩包下载 本教程基于Centos7系统下的二进制方式部署&#xff0c;先去官网进行压缩包下载 在系统创建/opt/n9etest目录,并将压缩包拖进目录 mkdir /opt/n9etest进入/opt/n9etest&#xff0…...

鸿蒙应用开发 知识点 官网快速定位表

ArkTS 语言介绍 ArkTS 语言介绍 基础入门 资源分类与访问 添加组件(基础组件) 显示图片 (Image) 按钮 (Button) 单选框 (Radio) 切换按钮 (Toggle) 进度条 (Progress) 视频播放 (Video) 使用文本 文本显示 (Text/Span) 文本输入 (TextInput/TextArea) 使用弹窗 使用弹…...

【神经网络与深度学习】两种加载 pickle 文件方式(joblib、pickle)的差异

引言 从深度学习应用到数据分析的多元化需求出发&#xff0c;Python 提供了丰富的工具和模块&#xff0c;其中 pickle 和 joblib 两种方式在加载数据文件方面表现尤为突出。不同场景对性能、兼容性以及后续处理的要求不尽相同&#xff0c;使得这两种方式各显优势。本文将通过深…...

quickbi finebi 测评(案例讲解)

quickbi & finebi 测评 国产BI中入门门槛比较低的有两个&#xff0c;分别是quickbi和finebi。根据我的经验通过这篇文章做一个关于这两款BI的测评文章。 quickbi分为个人版、高级版、专业版、私有化部署四种。这篇文章以quickbi高级版为例&#xff0c;对quickbi进行分享。…...

vue的生命周期 以及钩子

最早可以在created 时调用后端接口获取数据&#xff0c;因为beforecreated的时候 那个data 都还还是初始化出来 修改数据的时候触发 update 案例1&#xff1a;create 案例2:一进来页面获取搜索框焦点 echarts 饼图渲染 初始化dom后才去准备实例&#xff0c;所以必须要在dom之后…...

Mariadb 防火墙服务器和端口:mysql | 3306

Centos7 Mariadb 理解&#xff1a;Mariadb数据库就类似于我们生活中常见的Excel。 主要工作原理就是我们创造一个数据库其中创造一个数据表再在数据表中输入内容&#xff0c;分为三类。在详细点就是打开Excel&#xff08;数据库&#xff09;&#xff0c;我们在其中加入…...

爬虫学习笔记(二)--web请求过程

Web请求全过程&#xff08;重要&#xff09; 从输入完网址&#xff08;如输入百度网址&#xff09;到返回页面以及页面中的数据这一完整的过程发生了什么事情&#xff1f; 服务器端渲染 在服务器端直接把数据和html整合&#xff0c;统一返回给浏览器&#xff0c;在页面源代码…...

开发vue项目所需要安装的依赖包

在开发Vue项目时&#xff0c;通常需要安装以下几个核心依赖包&#xff1a;1、Vue CLI、2、Vue Router、3、Vuex、4、Axios。这些依赖包可以确保你的Vue项目拥有基础的功能和良好的开发体验。接下来&#xff0c;我们将详细介绍每个依赖包的作用、安装方法以及使用案例。 一、VUE…...

Java SE(4)——方法详解

1.方法的概念&使用 1.1 什么是方法&#xff1f; Java中的方法类似于C语言中的函数&#xff0c;是用于执行特定任务的代码块。 那么用方法组织起来的代码块和普通的代码相比有什么优势呢&#xff1f; 1.当代码规模较大且应用场景较为复杂时&#xff0c;方法能够模块化地组…...

网络安全实战指南:从安全巡检到权限维持的应急响应与木马查杀全(命令查收表)

目录 一、安全巡检的具体内容 1. 巡检的频率与目标是什么 2. 巡检的内容是什么以及巡检后如何加固 二、Windows环境下应急响应的主要流程 1. 流程概述及每个步骤详细解释 步骤1&#xff1a;隔离与遏制 步骤2&#xff1a;识别与分析 步骤3&#xff1a;清除与恢复 步骤4…...

Infrared Finance:Berachain 生态的流动性支柱

在加密市场中&#xff0c;用户除了参与一级和二级交易&#xff0c;还有一种低门槛参与的就是空投。从 2021 年 DeFi 成为主流开始&#xff0c;空投一直都是“以小搏大”的机会&#xff0c;通过参与项目早期的链上交互和任务以获取空投奖励&#xff0c;近几年已成为一种广受欢迎…...

Hadoop和Spark大数据挖掘与实战

1.概述 本节将系统讲解大数据分析的完整流程&#xff0c;包括数据采集、预处理、存储管理、分析挖掘与结果可视化等核心环节。与此同时&#xff0c;我们还将对主流数据分析工具进行横向对比&#xff0c;帮助读者根据实际需求选用最合适的工具&#xff0c;提升数据价值挖掘的效…...

TCP vs UDP:核心区别、握手过程与应用场景(附对比图)

&#x1f310; 引言 在网络通信中&#xff0c;TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两大核心传输层协议。它们各有优劣&#xff0c;适用于不同场景。本文将用图文对比实战示例&#xff0c;帮你彻底理解两者的区别&#xff0…...

人工智能-深度学习之多层感知器

深度学习 任务任务1任务2任务3 机器学习的弊端多层感知器 &#xff08;MLP/人工神经网络&#xff09;MLP实现非线性分类Keras介绍与实战准备Keras or TensorflowKeras建立MLP模型 实战&#xff08;1&#xff09;: 建立MLP实现非线性二分类实战&#xff08;2&#xff09;: MLP实…...

Improving Deep Learning For Airbnb Search

解决问题 问题1: 解决推荐酒店与用户实际预定酒店价格存在偏差问题&#xff0c;实际预定比推荐要更便宜&#xff1a; 所以问题为是否更低价格的list更倾向于用户偏好&#xff0c;应该被优先推荐&#xff1f; 1. 该文通过数据分析与模型演进&#xff0c;将模型改造为item sco…...

多模态大型模型,实现以人为中心的精细视频理解

大家看完觉得有帮助记得点赞和关注&#xff01;&#xff01;&#xff01; 抽象 精细理解视频中人类的动作和姿势对于以人为中心的 AI 应用程序至关重要。在这项工作中&#xff0c;我们介绍了 ActionArt&#xff0c;这是一个细粒度的视频字幕数据集&#xff0c;旨在推进以人为中…...

向量数据库Milvus的部署与使用

Milvus介绍 Milvus是一个开源、高性能、高扩展性的向量数据库&#xff0c;Milvus可以用来存储文本、图像、音频等非结构化数据&#xff0c;本质上是用Embeddings将非结构化数据转换成能够捕捉其基本特征的数字向量&#xff0c;然后将这些向量存储在向量数据库中&#xff0c;从…...

1.文档搜索软件Everything 的使用介绍

Everything 是 Windows 文件搜索的效率天花板&#xff0c;通过灵活语法和极速响应&#xff0c;彻底告别「找文件焦虑」。 定位&#xff1a;一款专注于 极速文件名搜索 的 Windows 工具&#xff0c;免费且轻量&#xff08;安装包仅几 MB&#xff09;。 核心优势…...

2025系统架构师---论企业集成平台的技术与应用

摘要 本文探讨了企业集成平台的技术与应用,以某商业银行开发的绩效考核平台系统为例,分析了企业集成平台的基本功能及关键技术,并详细阐述了在表示集成、数据集成、控制集成和业务流程集成方面的应用和实施方式。通过异构系统之间的集成,绩效考核平台与其他系统实现了有机…...

STM32Cubemx-H7-16-FreeRTOS-1-创建工程,实现两个灯的基本亮灭

前言 裸机也是开发到一半快要结束了&#xff0c;接下来开始上操作系统&#xff0c;然后先能使用基本的&#xff0c;后面再讲理论。 Cubemx创建工程 基本打开生成就不说了&#xff0c;直接从界面开始 从这里开始吧 1.首先开启外部高速晶振 2.先这样选择 选择HSE时钟环&#xff…...