nginx做服务器入口_「查缺补漏」巩固你的Nginx知识体系

Nginx篇


基本介绍

Nginx是一款轻量级的 Web服务器 / 反向代理服务器 / 电子邮件(IMAP/POP3)代理服务器,主要的优点是:

  1. 支持高并发连接,尤其是静态界面,官方测试Nginx能够支撑5万并发连接
  2. 内存占用极低
  3. 配置简单,使用灵活,可以基于自身需要增强其功能,同时支持自定义模块的开发使用灵活:可以根据需要,配置不同的负载均衡模式,URL地址重写等功能
  4. 稳定性高,在进行反向代理时,宕机的概率很低
  5. 支持热部署,应用启动重载非常迅速

基础使用

Windows版

安装

文件下载地址:http://nginx.org/en/docs/win…

如果下载很慢可以用该链接:

百度云盘链接: http://pan.baidu.com/s/1r3mSEGhm… 提取码: d8bi

解压即可

基本命令

# 启动
# 建议使用第一种,第二种会使窗口一直处于执行中,不能进行其他命令操作
C:servernginx-1.19.2> start nginx
C:servernginx-1.19.2> nginx.exe# 停止
# stop是快速停止nginx,可能并不保存相关信息;quit是完整有序的停止nginx,并保存相关信息
C:servernginx-1.19.2> nginx.exe -s stop
C:servernginx-1.19.2> nginx.exe -s quit# 重载Nginx
# 当配置信息修改,需要重新载入这些配置时使用此命令
C:servernginx-1.19.2> nginx.exe -s reload# 重新打开日志文件
C:servernginx-1.19.2> nginx.exe -s reopen# 查看Nginx版本
C:servernginx-1.19.2> nginx -v# 查看配置文件是否正确
C:servernginx-1.19.2> nginx -t

简单Demo

  1. 利用SwitchHost软件编辑域名和IP的映射关系,或到目录C:WindowsSystem32driversetc下,编辑hosts文件,增加配置如下(Mac 同理)
127.0.0.1 kerwin.demo.com 

PS:推荐使用软件SwitchHost,工作时几乎是必用的

  1. 修改配置,如图所示:

4f3eb1d95a1b698974fd87472834df70.png

效果如图所示:

6973150e40b407125d0a478df9856507.png

Nginx在架构体系中的作用

  • 网关 (面向客户的总入口)
  • 虚拟主机(为不同域名 / ip / 端口提供服务。如:VPS虚拟服务器)
  • 路由(正向代理 / 反向代理)
  • 静态服务器
  • 负载集群(提供负载均衡)

网关

网关:可以简单的理解为用户请求和服务器响应的关口,即面向用户的总入口

网关可以拦截客户端所有请求,对该请求进行权限控制、负载均衡、日志管理、接口调用监控等,因此无论使用什么架构体系,都可以使用Nginx作为最外层的网关

虚拟主机

虚拟主机的定义:虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供 www 服务,这样就可以实现一台主机对外提供多个 web 服务,每个虚拟主机之间是独立的,互不影响的。

通过 Nginx 可以实现虚拟主机的配置,Nginx 支持三种类型的虚拟主机配置

  • 基于 IP 的虚拟主机
  • 基于域名的虚拟主机
  • 基于端口的虚拟主机

表现形式其实大家多见过,即:

# 每个 server 就是一个虚拟主机
http {# ...server{# ...}# ...server{# ...}
}

路由

在Nginx的配置文件中,我们经常可以看到这样的配置:

location / {#....
}

location在此处就起到了路由的作用,比如我们在同一个虚拟主机内定义两个不同的路由,如下:

location / {proxy_pass https://www.baidu.com/;
}location /api {proxy_pass https://apinew.juejin.im/user_api/v1/user/get?aid=2608&user_id=1275089220013336&not_self=1;}

效果如下:

c80ba85cda704ec2443003ad382ae866.png

因为路由的存在,为我们后续解决跨域问题提供了一定的思路,同时配置内容和API接口等更加方便

PS:路由的功能非常强大,支持正则匹配

正向与反向代理

此处额外解释一下proxy_pass的含义

在Nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加 /,表示绝对根路径;

如果没有/,表示相对路径

正向代理

  1. 代理客户;
  2. 隐藏真实的客户,为客户端收发请求,使真实客户端对服务器不可见;
  3. 一个局域网内的所有用户可能被一台服务器做了正向代理,由该台服务器负责 HTTP 请求;
  4. 意味着同服务器做通信的是正向代理服务器;

反向代理

  1. 代理服务器;
  2. 隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见;
  3. 负载均衡服务器,将用户的请求分发到空闲的服务器上;
  4. 意味着用户和负载均衡服务器直接通信,即用户解析服务器域名时得到的是负载均衡服务器的 IP ;

共同点

  1. 都是做为服务器和客户端的中间层
  2. 都可以加强内网的安全性,阻止 web 攻击
  3. 都可以做缓存机制,提高访问速度

区别

  1. 正向代理其实是客户端的代理,反向代理则是服务器的代理。
  2. 正向代理中,服务器并不知道真正的客户端到底是谁;而在反向代理中,客户端也不知道真正的服务器是谁。
  3. 作用不同。正向代理主要是用来解决访问限制问题;而反向代理则是提供负载均衡、安全防护等作用。

静态服务器

静态服务器是Nginx的强项,使用非常容易,在默认配置下本身就是指向了静态的HTML界面,如:

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

所以前端同学们,如果构建好了界面,可以进行相应的配置,把界面指向目标文件夹中即可,root指的是html文件夹

负载均衡

负载均衡功能是Nginx另一大杀手锏,一共有5种方式,着重介绍一下。

轮询

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除,配置如下:

upstream tomcatserver {server 192.168.0.1;server 192.168.0.2;
}

轮询策略是默认的负载均衡策略

指定权重

即在轮询的基础之上,增加权重的概念,weight和访问比率成正比,用于后端服务器性能不均的情况,配置如下:

upstream tomcatserver {server 192.168.0.1 weight=1;server 192.168.0.2 weight=10;
}

IP Hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,配置如下:

upstream tomcatserver {ip_hash;server 192.168.0.14:88;server 192.168.0.15:80;
}

fair

第三方提供的负载均衡策略,按后端服务器的响应时间来分配请求,响应时间短的优先分配,生产环境中有各种情况可能导致响应时间波动,需要慎用

upstream tomcatserver {server server1;server server2;fair;
}

url_hash

第三方提供的负载均衡策略,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器

upstream tomcatserver {server squid1:3128;server squid2:3128;hash $request_uri;hash_method crc32;
}

Nginx的模块化设计

先来看看Nginx模块架构图:

4e3e51c27ddec0155ccc082a53fabc21.png

这5个模块由上到下重要性一次递减。

(1)核心模块;

核心模块是Nginx服务器正常运行必不可少的模块,如同操作系统的内核。它提供了Nginx最基本的核心服务。像进程管理、权限控制、错误日志记录等;

(2)标准HTTP模块;

标准HTTP模块支持标准的HTTP的功能,如:端口配置,网页编码设置,HTTP响应头设置等;

(3)可选HTTP模块;

可选HTTP模块主要用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务,如:解析GeoIP请求,SSL支持等;

(4)邮件服务模块;

邮件服务模块主要用于支持Nginx的邮件服务;

(5)第三方模块;

第三方模块是为了扩展Nginx服务器应用,完成开发者想要的功能,如:Lua支持,JSON支持等;

模块化设计使得Nginx方便开发和扩展,功能很强大

Nginx的请求处理流程

基于上文中的Nginx模块化结构,我们很容易想到,在请求的处理阶段也会经历诸多的过程,Nginx 将各功能模块组织成一条链,当有请求到达的时候,请求依次经过这条链上的部分或者全部模块,进行处理,每个模块实现特定的功能。

一个 HTTP Request 的处理过程:

  • 初始化 HTTP Request
  • 处理请求头、处理请求体
  • 如果有的话,调用与此请求(URL 或者 Location)关联的 handler
  • 依次调用各 phase handler 进行处理
  • 输出内容依次经过 filter 模块处理

9295bda84467d74ecc9fa63782f63deb.png

Nginx的多进程模型

Nginx 在启动后,会有一个 master 进程和多个 worker 进程。

master 进程主要用来管理worker 进程,包括接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态以及启动 worker 进程。

worker 进程是用来处理来自客户端的请求事件。多个 worker 进程之间是对等的,它们同等竞争来自客户端的请求,各进程互相独立,一个请求只能在一个 worker 进程中处理。worker 进程的个数是可以设置的,一般会设置与机器 CPU 核数一致,这里面的原因与事件处理模型有关

Nginx 的进程模型,可由下图来表示:

5b83982043e1e0b6bfe8c1597cd16257.png

这种设计带来以下优点:

1) 利用多核系统的并发处理能力

现代操作系统已经支持多核 CPU 架构,这使得多个进程可以分别占用不同的 CPU 核心来工作。Nginx 中所有的 worker 工作进程都是完全平等的。这提高了网络性能、降低了请求的时延。

2) 负载均衡

多个 worker 工作进程通过进程间通信来实现负载均衡,即一个请求到来时更容易被分配到负载较轻的 worker 工作进程中处理。这也在一定程度上提高了网络性能、降低了请求的时延。

3) 管理进程会负责监控工作进程的状态,并负责管理其行为

管理进程不会占用多少系统资源,它只是用来启动、停止、监控或使用其他行为来控制工作进程。首先,这提高了系统的可靠性,当 worker 进程出现问题时,管理进程可以启动新的工作进程来避免系统性能的下降。其次,管理进程支持 Nginx 服务运行中的程序升级、配置项修改等操作,这种设计使得动态可扩展性、动态定制性较容易实现。

Nginx如何解决惊群现象

什么是惊群现象?

惊群效应(thundering herd)是指多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应。

上文中介绍了Nginx的多进程模型,而典型的多进程模型正如文中所说,多个worker进程之间是对等的,因此当一个请求到来的时候,所有进程会同时开始竞争,最终执行的又只有一个,这样势必会造成资源的浪费。

Nginx解决该问题的思路是:不让多个进程在同一时间监听接受连接的socket,而是让每个进程轮流监听,这样当有连接过来的时候,就只有一个进程在监听那肯定就没有惊群的问题。

具体做法是:利用一把进程间锁,每个进程中都尝试获得这把锁,如果获取成功将监听socket加入wait集合中,并设置超时等待连接到来,没有获得锁的进程则将监听socket从wait集合去除。

事件驱动模型和异步非阻塞IO

承接上文,我们知道了Nginx的多进程模型后了解到,其工作进程实际上只有几个,但为什么依然能获得如此高的并发性能,当然与其采用的事件驱动模型和异步非阻塞IO的方式来处理请求有关。

Nginx服务器响应和处理Web请求的过程,是基于事件驱动模型的,它包含事件收集器、事件发送器和事件处理器等三部分基本单元,着重关注事件处理器,而一般情况下事件处理器有这么几种办法:

  • 事件发送器每传递过来一个请求,目标对象就创建一个新的进程
  • 事件发送器每传递过来一个请求,目标对象就创建一个新的线程,来进行处理
  • 事件发送器每传递过来一个请求,目标对象就将其放入一个待处理事件的列表,使用非阻塞I/O方式调用

第三种方式,在编写程序代码时,逻辑比前面两种都复杂。大多数网络服务器采用了第三种方式,逐渐形成了所谓的事件驱动处理库。

事件驱动处理库又被称为多路IO复用方法,最常见的包括以下三种:select模型,poll模型和epoll模型。

其中Nginx就默认使用的是epoll模型,同时也支持其他事件模型。

epoll的帮助就在于其提供了一种机制,可以让进程同时处理多个并发请求,不用关心IO调用的具体状态。IO调用完全由事件驱动模型来管理,这样一来,当某个工作进程接收到客户端的请求以后,调用IO进行处理,如果不能立即得到结果,就去处理其他的请求;而工作进程在此期间也无需等待响应,可以去处理其他事情;当IO返回时,epoll就会通知此工作进程;该进程得到通知后,会来继续处理未完的请求

Nginx配置的最佳实践

在生产环境或者开发环境中Nginx一般会代理多个虚拟主机,如果把所有的配置文件写在默认的nginx.conf中,看起来会非常臃肿,因此建议将每一个虚拟文件单独放置一个文件夹,Nginx支持这样的配置,如下:

http {# 省略中间配置# 引用该目录下以 .conf 文件结尾的配置include /etc/nginx/conf.d/*.conf;
}

具体文件配置如:

# Demo
upstream web_pro_testin {server 10.42.46.70:6003 max_fails=3 fail_timeout=20s;ip_hash;
}server {listen 80;server_name web.pro.testin.cn;location / {proxy_pass http://web_pro_testin;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}location ~ ^/(WEB-INF)/ {deny all;}
}

Nginx全量配置参数说明

# 运行用户
user www-data;    # 启动进程,通常设置成和cpu的数量相等
worker_processes  6;# 全局错误日志定义类型,[debug | info | notice | warn | error | crit]
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;# 进程pid文件
pid        /var/run/nginx.pid;# 工作模式及连接数上限
events {# 仅用于linux2.6以上内核,可以大大提高nginx的性能use   epoll; # 单个后台worker process进程的最大并发链接数worker_connections  1024;     # 客户端请求头部的缓冲区大小client_header_buffer_size 4k;# keepalive 超时时间keepalive_timeout 60;      # 告诉nginx收到一个新连接通知后接受尽可能多的连接# multi_accept on;            
}#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {# 文件扩展名与文件类型映射表义include       /etc/nginx/mime.types;# 默认文件类型default_type  application/octet-stream;# 默认编码charset utf-8;# 服务器名字的hash表大小server_names_hash_bucket_size 128;# 客户端请求头部的缓冲区大小client_header_buffer_size 32k;# 客户请求头缓冲大小large_client_header_buffers 4 64k;# 设定通过nginx上传文件的大小client_max_body_size 8m;# 开启目录列表访问,合适下载服务器,默认关闭。autoindex on;# sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,# 必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度sendfile        on;# 此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用#tcp_nopush     on;# 连接超时时间(单秒为秒)keepalive_timeout  65;# gzip模块设置gzip on;               #开启gzip压缩输出gzip_min_length 1k;    #最小压缩文件大小gzip_buffers 4 16k;    #压缩缓冲区gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)gzip_comp_level 2;     #压缩等级gzip_types text/plain application/x-javascript text/css application/xml;gzip_vary on;# 开启限制IP连接数的时候需要使用#limit_zone crawler $binary_remote_addr 10m;# 指定虚拟主机的配置文件,方便管理include /etc/nginx/conf.d/*.conf;# 负载均衡配置upstream mysvr {# 请见上文中的五种配置}# 虚拟主机的配置server {# 监听端口listen 80;# 域名可以有多个,用空格隔开server_name www.jd.com jd.com;# 默认入口文件名称index index.html index.htm index.php;root /data/www/jd;# 图片缓存时间设置location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${expires 10d;}#JS和CSS缓存时间设置location ~ .*.(js|css)?${expires 1h;}# 日志格式设定#$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;#$remote_user:用来记录客户端用户名称;#$time_local: 用来记录访问时间与时区;#$request: 用来记录请求的url与http协议;#$status: 用来记录请求状态;成功是200,#$body_bytes_sent :记录发送给客户端文件主体内容大小;#$http_referer:用来记录从那个页面链接访问过来的;log_format access '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';# 定义本虚拟主机的访问日志access_log  /usr/local/nginx/logs/host.access.log  main;access_log  /usr/local/nginx/logs/host.access.404.log  log404;# 对具体路由进行反向代理location /connect-controller {proxy_pass http://127.0.0.1:88;proxy_redirect off;proxy_set_header X-Real-IP $remote_addr;# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host;# 允许客户端请求的最大单文件字节数client_max_body_size 10m;# 缓冲区代理缓冲用户端请求的最大字节数,client_body_buffer_size 128k;# 表示使nginx阻止HTTP应答代码为400或者更高的应答。proxy_intercept_errors on;# nginx跟后端服务器连接超时时间(代理连接超时)proxy_connect_timeout 90;# 后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据proxy_send_timeout 90;# 连接成功后,后端服务器响应的超时时间proxy_read_timeout 90;# 设置代理服务器(nginx)保存用户头信息的缓冲区大小proxy_buffer_size 4k;# 设置用于读取应答的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8kproxy_buffers 4 32k;# 高负荷下缓冲大小(proxy_buffers*2)proxy_busy_buffers_size 64k;# 设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长# 设定缓存文件夹大小,大于这个值,将从upstream服务器传proxy_temp_file_write_size 64k;}# 动静分离反向代理配置(多路由指向不同的服务端或界面)location ~ .(jsp|jspx|do)?$ {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://127.0.0.1:8080;}}
}

Nginx还能做什么

解决CORS跨域问题

思路有两个:

  • 基于多路由,把跨域的两个请求发到各自的服务器,然后统一访问入口即可避免该问题
  • 利用Nginx配置Headerd的功能,为其附上相应的请求头

适配 PC 或移动设备

根据用户设备不同返回不同样式的站点,以前经常使用的是纯前端的自适应布局,但无论是复杂性和易用性上面还是不如分开编写的好,比如我们常见的淘宝、京东......这些大型网站就都没有采用自适应,而是用分开制作的方式,根据用户请求的 user-agent 来判断是返回 PC 还是 H5 站点

请求限流

Nginx按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值,如:

http {limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {location /search/ {limit_req zone=one burst=5 nodelay;}}
}      

其他技巧

如:图片防盗链,请求过滤,泛域名转发,配置HTTPS等等

可参考文章:《Nginx 从入门到实践,万字详解!》

常见问题

Q1:Nginx一般用作什么?

见上文中Nginx在架构体系中的作用,配合Nginx还能做什么作答即可

Q2:为什么要用Nginx?

理解网关的必要性,以及Nginx保证高可用,负载均衡的能力

Q3:为什么Nginx这么快?

如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。

而nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。

nginx是如何利用的呢,简单来说:同样的4个进程,如果采用一个进程负责一个request的方式,那么,同时进来4个request之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第5个request进来了。就无法及时反应了,因为4个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个request,就新开个进程来处理。

nginx不这样,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。

由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。

总结:事件模型,异步非阻塞,多进程模型加上细节优化的共同作用

Q4:什么是正向代理和反向代理

见上文

Q5:Nginx负载均衡的算法有哪些?

见上文

Q6:Nginx如何解决的惊群现象?

见上文

Q7:Nginx为什么不用多线程模型?

深入理解多进程模型加上异步非阻塞IO的好处以及多线程模型中上下文切换的劣势

Q8:Nginx压缩功能有什么坏处吗?

非常耗费服务器的CPU

Q9:Nginx有几种进程模型?

实际上有两种,多进程和单进程,但是实际工作中都是多进程的

参考

  • 【前端词典】如何向老板解释反向代理
  • [code.nginx] Nginx服务器的事件驱动模型
  • Nginx模块化设计
  • Nginx中文文档

最后

如果你觉得这篇内容对你挺有帮助的话:

  1. 当然要点赞支持一下啦~

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

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

相关文章

Oracle 维护数据的完整性 一 索引

简介:索引是用于加速数据存取的数据对象,合理的使用索引可以大大降低i/o 次数,从而提高数据的访问性能. 当我们从一张表中检索我们需要的数据是,oralce往往会进行全表扫描,就是遍历所有的数据行,来找到我们需要的数据,并返回结果集给我们,这个过程就像下图: 当这个人需要去图书…

特征值_陶哲轩数学发现的故事 | 特征值特征向量等式

12月3日,陶哲轩在其个人博客上更新了一篇文章,https://terrytao.wordpress.com/2019/12/03/eigenvectors-from-eigenvalues-a-survey-of-a-basic-identity-in-linear-algebra/说他与合作者在arXiv上更新了此前关于特征值的文章Eigenvectors from Eigenva…

迪士尼研究院等将人造“神经纤维”用于软体机器人,赋予其“本体感知能力”!...

来源:机器人大讲堂 导读软体机器人模仿章鱼,象鼻,海星等动物而设计,栩栩如生,他们由软材料(硅胶,橡胶)构成,有着天生优良的环境适应性以及安全交互性。但是相比于传统机器…

C# 静态类和非静态类(实例类)

1.非静态类里面可以出现静态成员和非静态成员 using System; namespace shuzu { class dom_class{public string name "张三";private int age;public int Age//通过属性访问私有成员{get { return age; }set { age value; }}}class aclass {static void Main(s…

保存时间 默认_一些不起眼但又非常的实用的PPT制作技巧,大大节省PPT制作时间...

从PPT小白到PPT大神的过程中,我们总会无数次碰壁,无数次陷入困境。今天为大家带来的是一些不起眼的PPT技巧,但是非常的实用,不信就看下文吧!自定义访问工具栏在PPT中我们有很多的常用操作,例如「左对齐/右对…

人机融合智能:人工智能3.0

来源:人机与认知实验室摘要:人工智能(客观智能)与人类智能(主观智能)最有可能演变成为一对相生相克的阴阳对立统一体,从而开启一个全新的时代,即“人机融合智能时代”。在“人机融合…

css 背景图片透明度_web前端入门到实战:css重点知识和bug解决方法

1.图片向下撑大3像素问题在一个盒子里面放一张图片,默认情况下,图片会向下撑大3像素,有以下几种解决方法:1.1给图片添加display:block;1.2给图片添加float:left;1.3 给图片添加vertical-align:middle;1.4 给…

像个字段相减绝对值_遇见你丨像个英雄一样活着 瘫痪作家用手指敲击文字著百万字文学作品...

患有先天性肌迟缓症,出生后便全身瘫痪,这样一个原本生活里充满艰难的人,他的名字却出现在了中国作家协会的2020年新会员名单中,他叫高淳。 今年36岁的高淳,家住江苏常熟,从2002年开始文学创作,凭…

一幅图读懂量子力学(数学的判决)

来源:悦智网 未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网&#x…

python中扑克牌类设计_Python中的计数 Counter类

点击上方"AI机器学习与深度学习算法",选择"星标"公众号原创干货,第一时间送达在很多场景中经常会用到统计计数的需求,比如在实现 kNN 算法时统计 k 个标签值的个数,进而找出标签个数最多的标签值作为最终 kNN…

计算机多文件管理,电脑文件管理几条小技巧

电脑文件管理几条小技巧在电脑的内部,在电脑的桌面上,在“资源管理器”中,充斥着无序与混乱,这种虚拟的混乱极大地影响了电脑的性能和我们办公的效率,下面小编为大家带来了电脑文件管理几条小技巧,希望对大家有用。电脑…

python读取excel画散点图对应多个y_Python Scatter Plot,每个X都有多个Y值

How can I plot different numbers of Y values for each X value 只需分别绘制每个组: for xe, ye in zip(x, y): plt.scatter([xe] * len(ye), ye) and how can I change the X axis from being the numbers 1 and 2 to text categories “cat1” and “cat2”. 手…

追加10亿!腾讯宣布设立15亿元“战疫基金”

来源:腾讯刚刚,腾讯宣布设立15亿元“抗击新型冠状病毒感染肺炎疫情综合保障基金”(以下简称战疫基金)。这是腾讯在设立首期3亿元疫情防控基金、2亿元战疫开发者公益联盟资金池后,再次升级追加10亿元基金,为…

equals null报错吗_轻轻松松教你搞定Java中的==和equals

前言相信很多读者关于和equals懂了又懵,懵了又懂,如此循环,事实上可能是因为看到的博客文章之类的太多了,长篇大论,加上一段时间的洗礼之后就迷路了。本篇文章再一次理清楚。当然如果觉得本文太啰嗦的话,当…

java八股 spring + mybatis

Spring常用注解(绝对经典)_spring注解-CSDN博客 框架篇-02-Spring-单例bean是线程安全的吗_哔哩哔哩_bilibili 1.spring.bean 单例 线程不安全 2.AOP 项目里可以说记录用户登录日志,利用request去获取姓名、ip、、请求方式、url&#xff0…

服务器数据库2008怎么备份数据库文件,怎么备份SQL Server2008数据库

在使用SQL Server 2008服务器的时候,我们需要定时的备份数据库来防止数据的丢失,下面学习啦小编为大家介绍备份SQL Server 2008数据库的方法。备份SQL Server 2008数据库的方法在开始菜单中点击“SQL Server Management Studio”在弹出的界面点击连接&am…

蝙蝠为啥这么厉害?地球人整明白了没有?

来源:周末八点半公元一世纪的时候,希腊的普鲁塔克提出了一个问题:如果忒修斯船上的零件被逐渐替换,直到所有的零件都不是原来的零件,那么这艘船还是原来的那艘船吗?这就是人类历史上的忒修斯悖论&#xff0…

vant input框禁止调用手机键盘_春运不要变“泰囧”手机这些功能让回家的路更安全...

随着春节的临近,年味儿可以说是越来越浓了,比如刚刚开始的支付宝集五福活动激发了大家的参与热情,而每年都会上热搜的春运更是成为了我国人民过年最真实的写照。就拿小编来说,作为一个张家口的北漂人,前几天京张高铁的…

math python 向上取整_Python成为专业人士笔记-各数学运算操作深度剖析

“专业人士笔记”系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.comPython可以执行常见的数学运算符,包括整数和浮点除法、乘法、取幂、加法和减法,而数学math模块…

css3 shapes是什么意思,如何在Web中使用CSS Shapes

布局一般都是遵循按行和列等线性原则,Web网站的布局到今天为止很大程度上受到这些原则的影响。虽然CSS Grid的出现让布局变得更好,更灵活,但相对于印刷媒体而言,Web布局总体上还是受到很好的限制,特别是内容流上。杂志…