Nginx超详细讲解+实操

前言

nginx作为当今火爆的、高性能的http及反向代理服务,不管前端还是后端,都需要全面去了解,学习,实操。

nginx 介绍

为了有一个全面的认知,接下来我们先来看看nginx的架构以及一些特点。

nginx 特点

  1. 处理响应请求快(异步非阻塞I/O,零拷贝,mmap,缓存机制)
  2. 扩展性好(模块化设计)
  3. 内存消耗低(异步非阻塞,多阶段处理)
  4. 具有很高的可靠性(无数次的生产验证,很多头部公司都在用)
  5. 热部署
  6. 高并发连接(事件驱动模型,多进程机制)
  7. 自由的BSD许可协议(可以自己修改代码后发布,包容性极强)

nginx模块

nginx服务器由n多个模块组成,每个模块就是一个功能,某个模块只负责自身的功能,所以说对于 “高内聚,低耦合“ 的编程规则,在nginx身上可谓体现的淋漓尽致

Nginx模块名称模块作用
ngx_http_access_module四层基于IP的访问控制,可以通过匹配客户端源IP地址进行限制
ngx_http_auth_basic_module状态页,使用basic机制进行用户认证,在编译安装nginx的时候需要添加编译参数–withhttp_stub_status_module,否则配置完成之后监测会是提示语法错误
ngx_http_stub_status_module状态统计模块
ngx_http_gzip_module文件的压缩功能
ngx_http_gzip_static_module静态压缩模块
ngx_http_ssl_modulenginx 的https 功能
ngx_http_rewrite_module重定向模块,解析和处理rewrite请求
ngx_http_referer_module防盗链功能,基于访问安全考虑
ngx_http_proxy_module将客户端的请求以http协议转发至指定服务器进行处理
ngx_stream_proxy_moduletcp负载,将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module将客户端对Python的请求以uwsgi协议转发至指定服务器处理
ngx_http_headers_module可以实现对头部报文添加指定的key与值
ngx_http_upstream_module负载均衡模块,提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_stream_upstream_module后端服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理
ngx_http_flv_module为flv伪流媒体服务端提供支持

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

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

可选HTTP模块 :主要用于扩展标准的 HTTP 功能,让nginx能处理一些特殊的服务,如:Flash 多 媒体传输、解析 GeoIP 请求、SSL 支持等

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

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

nginx常见应用场景

  • 反向代理
  • 负载均衡
  • 缓存
  • 限流
  • 黑/白名单
  • 静态资源服务
  • 动静分离
  • 防盗链
  • 跨域
  • 高可用

反向代理

使用一台代理服务器(下图中的深色服务器)对底层的应用服务器(下图中的浅色服务器)进行代理。将他们的地址信息对客户端屏蔽,客户端只需要访问代理服务器即可,代理服务器会将请求转发给底层的真正起作用的应用服务器。但在客户端眼里,服务器只有唯一的一台,就是代理服务器。


最近又赶上跳槽的高峰期(招聘旺季),好多读者都问我有没有面试题神器,我苦苦整了一份内部资料《互联网大厂面试题+Java3套知识精华》并分类 4 份 PDF,累计 926 页!
在这里插入图片描述

Linux保姆级教程|互联网大厂面试题|算法小抄

nginx.conf文件解读

nginx.conf 这个文件是 nginx 的核心配置,一共由三部分组成,分别为全局块、events块和http块。

默认配置文件

#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;#    }#}}

结构说明

全局模块
event模块
http模块upstream模块server模块location块location块....server模块location块location块.......    

各模块的功能作用如下描述:

  1. 全局模块: 配置影响nginx全局的指令,比如运行nginx的用户名,nginx进程pid存放路径,日志存放路径,配置文件引入,worker进程数等。
  2. events块: 配置影响nginx服务器或与用户的网络连接。比如每个进程的最大连接数,选取哪种事件驱动模型(select/poll epoll或者是其他等等nginx支持的)来处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  3. http块: 可以嵌套多个server,配置代理,缓存,日志格式定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  4. server块: 配置虚拟主机的相关参数比如域名端口等等,一个http中可以有多个server。
  5. location块: 配置url路由规则
  6. upstream块: 配置上游服务器的地址以及负载均衡策略和重试策略等等

配置示例

########### 每个指令必须有分号结束。#################
#配置用户或者组,默认为nobody nobody,以什么用户启动 nginx程序,涉及到文件的读写权限,一般应该用root。
user root;  #允许生成的进程数,默认为1。标配一个cpu起一个进程。
worker_processes auto;  #指定nginx进程运行文件存放地址
pid /nginx/pid/nginx.pid;   #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
#error_log log/error.log debug;  events {#设置网路连接序列化,防止惊群现象发生,默认为on#accept_mutex on;  #设置一个进程是否同时接受多个网络连接,默认为off#multi_accept on; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport#use epoll;     #最大连接数,可以根据实际情况扩大,生产可扩大到10240worker_connections  10240;    
}http {#文件扩展名与文件类型映射表include       mime.types; #默认文件类型,默认为text/plaindefault_type  application/octet-stream; #取消服务日志#access_log off; #自定义格式    #log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #combined为日志格式的默认值#access_log log/access.log myFormat;  #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。sendfile on; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。sendfile_max_chunk 100k;  #连接超时时间,默认为75s,可以在http,server,location块。keepalive_timeout 75;  #接收客户端请求体超时client_body_timeout 20s;#客户端连接nginx超时, 建议5s内,接收客户端header超时时间,超时返回408client_header_timeout 10s;#限制请求体的大小,若超过所设定的大小,返回413错误。client_max_body_size 10M;#Nginx分配给请求数据的Buffer大小,如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。#大于该值小于client_max_body_size,就会将数据先存储到临时文件(用户组要有读写权限)中,client_body_temp 指定的路径中,默认该路径值是/tmp/。client_body_buffer_size 128k;#开启自定义错误重定向,不存在会返回404页面fastcgi_intercept_errors on;#热备upstream mysvr {   server 127.0.0.1:7878;server 192.168.10.121:3333 backup;  }server {#单连接请求上限次数。keepalive_requests 120; #监听端口listen       4545;   #监听地址 server_name  127.0.0.1;    #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。     location  ~*^.+$ {   #根目录,设置目录#root path;  #设置默认页#index index.htm;  #请求转向mysvr 定义的服务器列表proxy_pass  http://mysvr;  #拒绝的ip#deny 127.0.0.1; #允许的ip#allow 172.18.5.54;           } }
}

location 路由匹配规则

nginx根据用户请求的URI来匹配对应的location模块,匹配到哪个location,请求将被哪个location块中的配置项所处理。

location配置语法:location [修饰符] pattern {…}

常见匹配规则如下:

修饰符作用
无修饰符的前缀匹配,匹配前缀是 你配置的(比如说你配的是 /aaa) 的url
=精确匹配
~正则表达式模式匹配,区分大小写
~*正则表达式模式匹配,不区分大小写
^~^~类型的前缀匹配,类似于无修饰符前缀匹配,不同的是,如果匹配到了,那么就停止后续匹配
/通用匹配,任何请求都会匹配到(只要你域名对,所有请求通吃!)

以上规则简单总结就是优先级从高到低依次为(序号越小优先级越高):

1. location =    # 精准匹配
2. location ^~   # 带参前缀匹配
3. location ~    # 正则匹配(区分大小写)
4. location ~*   # 正则匹配(不区分大小写)
5. location /a   # 普通前缀匹配,优先级低于带参数前缀匹配。
6. location /    # 任何没有匹配成功的,都会匹配这里处理
前缀匹配(无修饰符)

这种方式最常用

server {location /api/{proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://localhost:48080/;}
}
前缀匹配( ^~ )

^~ 表示 uri 以某个字符串开头

location ^~ /static/ {default_type text/plain;return 200 "hello";
}
#curl http://127.0.0.1:2880/static/aa
正则匹配(~ 区分大小写)
location  ~ ^/document$ {default_type text/plain;return 200 "hello";
}
#curl http://127.0.0.1:2880/document
正则匹配(~* 不区分大小写)
location  ~* ^/document$ {default_type text/plain;return 200 "hello";
}#curl http://127.0.0.1:2880/document 
#curl http://127.0.0.1:2880/DOCUMENT
通用匹配( / )

通用匹配使用一个 / 表示,可以匹配所有请求,一般nginx配置文件最后都会有一个通用匹配规则,当其他匹配规则均失效时,请求会被路由给通用匹配规则处理,如果没有配置通用匹配,并且其他所有匹配规则均失效时,nginx会返回404错误。

location / {root   html;index  index.html index.htm;
}

反向代理配置

server {listen 8279;location / { proxy_pass http://ip:6020;}
}

负载均衡

把www.domain.com均衡到本机不同的端口,也可以改为均衡到不同的地址上

http {upstream myproject {ip_hash;server 127.0.0.1:8000 weight=3;server 127.0.0.1:8001;server 127.0.0.1:8002;server 127.0.0.1:8003;}server {listen 80;server_name www.domain.com;location / {proxy_pass http://myproject;}}
}

Nginx常用的负载策略

负载策略描述特点
轮询默认方式1. 每个请求会按时间顺序逐一分配到不同的后端服务器 2. 在轮询中,如果服务器down掉了,会自动剔除该服务器 3. 缺省配置就是轮询策略 4. 此策略适合服务器配置相当,无状态且短平快的服务使用
weight权重方式1. 在轮询策略的基础上指定轮询的几率 2. 权重越高分配到的请求越多 3. 此策略可以与least_conn和ip_hash结合使用 4. 此策略比较适合服务器的硬件配置差别比较大的情况
ip_hash依据ip的hash值来分配1. 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight) 2. ip_hash不能与backup同时使用 3. 此策略适合有状态服务,比如session 4. 当有服务器需要剔除,必须手动down掉
least_conn最少连接方式1. 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况
fair(第三方)响应时间方式1. 根据后端服务器的响应时间来分配请求,响应时间短的优先分配 2. Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块
url_hash(第三方)依据URL分配方式1. 按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器 2. Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包

缓存

nginx代理缓存可以在某些场景下有效的减少服务器压力,让请求快速响应,从而提升用户体验和服务性能。

指令名称作用解释语法默认配置示例作用域
proxy_cache设置是否开启对后端响应的缓存。proxy_cache zone | off;proxy_cache off;proxy_cache mycache; # 规定开启nginx缓存并且缓存名称为: mycachehttp, server, location
proxy_cache_valid配置什么状态码可以被缓存,以及缓存时长proxy_cache_valid [code …] time;没有默认值proxy_cache_valid 200 304 2m; # 对于状态为200和304的缓存文件,缓存时间是2分钟http, server, location
proxy_cache_key设置缓存文件的 keyproxy_cache_key string;proxy_cache_key schemeschemeschemeproxy_host$request_uri;proxy_cache_key “hosthosthostrequest_uri $cookie_user”; # 使用host +请求的uri以及cookie拼接成缓存keyhttp, server, location
proxy_cache_path指定缓存存储的路径,文件名为cache key的md5值,然后多级目录的话,根据level参数来生成,key_zone参数用来指定在共享内存中缓存数据的名称和内存大小,比如keys_zone=mycache:100m,inactive用来指定缓存没有被访问后超时移除的时间,默认是10分钟,也可以自己指定比如inactive=2h ;max_size 用来指定缓存的最大值,超过这个值则会自动移除最近最少使用(lru淘汰算法)的缓存 这个指令对应的参数很多,具体见官网:proxy_cache_pathproxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:128m inactive=3d max_size=2g; # 设置缓存存放的目录为/data/nginx/cache,并设置缓存名称为mycache,大小为128m, 三天未被访问过的缓存将自动清除,磁盘中缓存的最大容量为2GB。http
proxy_cache_bypass定义不从缓存中获取响应数据的条件。如果字符串参数中至少有一个值不为空且不等于" 0 ",则不会从缓存中获取响应:proxy_cache_bypass string …;没有默认值proxy_cache_bypass cookienocachecookie_nocache cookienocachearg_nocache$arg_comment;http, server, location
proxy_cache_min_uses指定某一个相同请求在几次请求之后才缓存响应内容proxy_cache_min_uses number;proxy_cache_min_uses 1;proxy_cache_min_uses 3; 规定某一个请求在第3次之后才走nginx缓存http, server, location
proxy_cache_use_stale指定后端服务器在返回什么状态码的情况下可以使用过期的缓存proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 … |off ;proxy_cache_use_stale off;proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; # 规定服务在出现error timeout,以及502,503,504时可使用过期缓存http, server, location
proxy_cache_lock默认不开启,开启后若出现并发重复请求,nginx只让一个请求去后端读数据,其他的排队并尝试从缓存中读取;proxy_cache_lock on |off;proxy_cache_lock off;proxy_cache_lock on; # 开启缓存锁http, server, location
proxy_cache_lock_timeout等待缓存锁(proxy_cache_lock)超时之后将直接请求后端,且结果不会被缓存proxy_cache_lock_timeout time;proxy_cache_lock_timeout 5s;proxy_cache_lock_timeout 6s; # 等待缓存锁超时(6ms)之后将直接请求后端,结果不会被缓存。http, server, location
proxy_cache_methods如果客户端请求方法在该指令中,则响应将被缓存。“GET”和“HEAD”方法总是被添加到列表中,尽管建议显式地指定它proxy_cache_methods GET|HEAD |POST …;proxy_cache_methods GET HEAD;proxy_cache_methods GET HEAD PUT POST; # 规定 可缓存的方法有 :get head put posthttp, server, location

修改配置文件:

http{...# 指定缓存存放目录为/usr/local/nginx/test/nginx_cache_storage,并设置缓存名称为mycache,大小为64m, 1天未被访问过的缓存将自动清除,磁盘中缓存的最大容量为1gbproxy_cache_path /usr/local/nginx/test/nginx_cache_storage levels=1:2 keys_zone=mycache:64m inactive=1d max_size=1g;...server{...#  指定 username 参数中只要有字母 就不走nginx缓存  if ($arg_username ~ [a-z]) {set $cache_name "no cache";}location  /interface {proxy_pass http://myserver/;# 使用名为 mycache 的缓存空间proxy_cache mycache;# 对于200 206 状态码的数据缓存2分钟proxy_cache_valid 200 206 1m;# 定义生成缓存键的规则(请求的url+参数作为缓存key)proxy_cache_key $host$uri$is_args$args;# 资源至少被重复访问2次后再加入缓存proxy_cache_min_uses 3;# 出现重复请求时,只让其中一个去后端读数据,其他的从缓存中读取proxy_cache_lock on;# 上面的锁 超时时间为4s,超过4s未获取数据,其他请求直接去后端proxy_cache_lock_timeout 4s;# 对于请求参数中有字母的 不走nginx缓存proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,没有值则进行缓存# 在响应头中添加一个缓存是否命中的状态(便于调试)add_header Cache-status $upstream_cache_status;    }...
}

限流

Nginx主要有两种限流方式:按并发连接数限流(ngx_http_limit_conn_module)、按请求速率限流(ngx_http_limit_req_module 使用的令牌桶算法)。

按请求速率限流

http{...# 对请求速率限流limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=5r/s;server{location /interface{...limit_req zone=myRateLimit burst=5  nodelay;limit_req_status 520;limit_req_log_level info;}}
}

$binary_remote_addr:表示基于 remote_addr(客户端IP) 来做限流 zone=myRateLimit:10m:表示使用myRateLimit来作为内存区域(存储访问信息)的名字,大小为10M,1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息

rate=5r/s:表示相同ip每秒最多请求5次,nginx是精确到毫秒的,也就是说此配置代表每200毫秒处理一个请求,这意味着自上一个请求处理完后,若后续200毫秒内又有请求到达,将拒绝处理该请求(如果没配burst的话)
burst=5:意思是设置一个大小为5的缓冲队列,若同时有6个请求到达,Nginx 会处理第一个请求,剩余5个请求将放入队列,然后每隔200ms从队列中获取一个请求进行处理。若请求数大于6,将拒绝处理多余的请求,直接返回503
nodelay:针对的是 burst 参数,burst=5 nodelay 这个配置表示被放到缓冲队列的这5个请求会立马处理,不再是每隔200ms取一个了。但是值得注意的是,即使这5个突发请求立马处理并结束,后续来了请求也不一定不会立马处理,因为虽然请求被处理了但是请求所占的坑并不会被立即释放,而是只能按 200ms 一个来释放,释放一个后 才将等待的请求 入队一个。
另外两个: limit_req_status=520表示当被限流后,nginx的返回码,limit_req_log_level info代表日志级别

按并发连接数限流

http{# 针对ip  对请求连接数限流...limit_conn_zone $binary_remote_addr zone=myConnLimit:10m; ...server{...limit_conn myConnLimit 12;}
}    

limit_conn_zone $binary_remote_addr zone=myConnLimit:10m; 代表的意思 是 基于连接数量限流,限流的对象是ip 名称是myConnLimit 存储空间大小10mb(即存放某ip的访问记录),limit_conn myConnLimit 12;标识该ip最大支持12个连接超过则返回503

https配置

https_ssl模块安装

需要下载源码:

wget http://nginx.org/download/nginx-1.23.0.tar.gz

解压后编译:

 ./configure --prefix=/usr/local/nginx --with-http_ssl_modulemake && make install

查看版本:

nginx -V

出现 --with-http_ssl_module 代表安装了ssl模块。

证书可以自己生成免费证书,也可以购买。

配置https

   server {listen      8080 ssl;server_name  localhost;ssl_certificate      /home/nginx/cert/test.crt;ssl_certificate_key  /home/nginx/cert/test.key;root  html/dist;charset utf-8;}

压缩

http {# 开启/关闭 压缩机制gzip on;# 根据文件类型选择 是否开启压缩机制gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/jpg image/gif image/png  application/json;# 设置压缩级别,一共9个级别  1-9   ,越高资源消耗越大 越耗时,但压缩效果越好,gzip_comp_level 9;# 设置是否携带Vary:Accept-Encoding 的响应头gzip_vary on;# 处理压缩请求的 缓冲区数量和大小gzip_buffers 32 64k;# 对于不支持压缩功能的客户端请求 不开启压缩机制gzip_disable "MSIE [1-6]\."; # 比如低版本的IE浏览器不支持压缩# 设置压缩功能所支持的HTTP最低版本gzip_http_version 1.1;# 设置触发压缩的最小阈值gzip_min_length 2k;# off/any/expired/no-cache/no-store/private/no_last_modified/no_etag/auth 根据不同配置对后端服务器的响应结果进行压缩gzip_proxied any;
} 

Spring Cloud Alibaba开发手册,真香!
Spring Cloud Alibaba为分布式应用开发提供了一站式解决方案。它包含开发分布式应用程序所需的所有组件,可以轻松地使用Spring Cloud开发应用程序。

最近抽空整理了一份Spring Cloud Alibab学习笔记免费分享给大家,目录如下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/289272.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.1 图的基本概念试题

一、单项选择题 01.图中有关路径的定义是()。 A.由顶点和相邻顶点序偶构成的边所形成的序列 B.由不同顶点所形成的序列 C.由不同边所形成的序列 D.上述定义都不是 02.一个有n个顶点和n条边的无向图一…

Python入门练习 - 学生管理系统

Python 实现读书管理系统 """ 实现一个命令行版的读书管理系统 """ import os.path import sys# 使用这个全局变量,来管理所有的学生信息 # 这个列表的每个元素都是一个‘字典’,每 个 字典就分别表示了一个同学students …

南京观海微电子---Vitis HLS设计流程介绍——Vitis HLS教程

1. 传统的FPGA设计流程 传统的RTL设计流程如下图所示: 传统的FPGA RTL设计流程主要是采用VHDL、VerilogHDL或System Verilog进行工程的开发,同时也是通过硬件描述语言来编写测试案例(Test Bench)对开发的工程进行仿真验证。 随后…

八大排序算法之希尔排序

希尔排序是插入排序的进阶版本,他多次调用插入排序,在插入排序上进行了改造,使其处理无序的数据时候更快 核心思想:1.分组 2.直接插入排序:越有序越快 算法思想: 间隔式分组,利用直接插入排序…

Windows安装Odoo结合内网穿透实现公网访问本地企业管理系统

文章目录 前言1. 下载安装Odoo:2. 实现公网访问Odoo本地系统:3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件,是一个一站式全功能ERP及电商平台。 开源性质:Odoo是一个开源的ERP软件,这意味着企…

工业以太网无线网桥

一、功能概述 1.1设备简介 本产品是工业以太网(Profinet、EtherNet/IP、ModbusTCP等)转无线设备,成对使用(一对一),本产品出厂前已经配对好,用户不需要再配对,即插即用。 本产品适…

【C++】从C到C++、从面向过程到面向对象(类与对象)

文章目录 C入门知识C与C的关系1. 类的引入:从结构体到类2. 类的声明和定义3. 类的作用域4. 类的访问限定符5. 面向对象特性之一:封装6. 类的实例化:对象7. 计算类对象的内存大小8. 成员函数中暗藏的this指针9. 类的六个默认生成的成员函数9.1…

哪个洗地机性价比比较高?这几款品牌值得入手

洗地机是现在越来越受欢迎的清洁工具,功能非常齐全。它就像是吸尘器和电动拖把的结合体,对于每天要做家务的人来说,可以一次性解决多种类型的垃圾,省时省心省力。可是面对种类繁杂的洗地机市场,我们该如何选择呢&#…

如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问

前言 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问,希望大家能觉得实用! 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&am…

python_1

要求: 代码: # 先将分钟数转化成年数,再将余数做为天数 minute float(input("请输入分钟数:")) year_1 (minute / 60 / 24) // 365 day_1 (minute / 60 / 24) % 365 now f"{minute}分钟{year_1}年{day_1}天&q…

值得收藏!2024年智能交通领域顶级会议投稿信息汇总

智能交通系统(Intelligent Transportation Systems, ITS)是应用现代信息技术、通信技术、数据处理技术、控制技术和传感技术于交通管理系统中,旨在提高道路安全性、提升交通效率、改善交通环境、增加驾驶舒适度和效率的综合智能化系统。它通过…

【C++初阶】之类和对象(中)

【C初阶】之类和对象(中) ✍ 类的六个默认成员函数✍ 构造函数🏄 为什么需要构造函数🏄 默认构造函数🏄 为什么编译器能自动调用默认构造函数🏄 自己写的构造函数🏄 构造函数的特性 ✍ 拷贝构造…

淘宝商品评论抓取技术大揭秘:轻松获取用户评价,助力电商决策!

获取淘宝商品评论接口的技术实现涉及多个步骤,包括获取商品ID、构建请求URL、发送HTTP请求以及解析响应数据。以下是一个基本的指南和示例代码,帮助你了解如何实现这一功能。 步骤一:获取商品ID 首先,你需要知道你想要获取评论的…

fuzzywuzzy,一个好用的 Python 库!

目录 前言 安装 基本功能 1. 字符串相似度比较 2. 模糊匹配与排序 实际应用场景 1. 数据清洗 2. 文本匹配与搜索 3. 搜索引擎优化 总结 前言 大家好,今天为大家分享一个好用的 Python 库 - fuzzywuzzy Github地址:https://github.com/seatgeek/fu…

Stable Diffusion WebUI 图生图(img2img):图生图/涂鸦绘制/局部重绘/有色蒙版/上传蒙版/批量处理/反推提示词

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本篇文章我们介绍 Stable Diffusion WebUI 的图生图功能,主要包括:图生图、图生图&#xff08…

Spring-IoC-属性注入的注解实现

1、创建对象的注解 Component 用于声明Bean对象的注解,在类上添加该注解后,表示将该类创建对象的权限交给Spring容器。可以直接将这些类直接创建,使用的时候可以直接用。 注解的value属性用于指定bean的id值,value可以省略&…

BioXcell InVivoPlus anti-mouse Ly6G及部分参考文献

BioXcell InVivoPlus anti-mouse Ly6G 1A8单克隆抗体与小鼠Ly6G反应。Ly6G分子量为21-25kDa,是GPI锚定的细胞表面蛋白Ly-6超家族的成员,在细胞信号传导和细胞粘附中发挥作用。Ly6G在发育过程中由骨髓谱系中的细胞(包括单核细胞、巨噬细胞、粒…

在点集的新知识面前百年集论不堪一击

黄小宁 与x∈R相异(等)的实数均可表为yxδ(增量δ可0也可≠0),因各实数的绝对值都可是表示长度的数故各实数都可是数轴上点的坐标,于是x∈R变换为实数yxδ的几何意义可是:一维空间“管道”g内R…

产品推荐 | 基于 Xilinx ZYNQ UltraScale+的FACE-ZUSSD-C 多核SOC设计开发平台

01、产品概述 FACE-ZUSSD-C多核SOC设计开发平台是FACE系列的新产品。FACE-ZUSSD-C搭载有16nm工艺的ZYNQ UltraScale系列主器件ZU19EG。该主器件具有丰富的FPGA可编程逻辑资源,同时其内嵌有四核ARM CortexA53,双核ARM CortexR5以及Mali400 GPU。 平台板…

常用的苹果应用商店上架工具推荐

摘要 移动应用app上架是开发者关注的重要环节,但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作,各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用,最终指出合理使用工具的重要性。 引言 移动应…