Nginx安全防护与HTTPS部署
目录
一、Nginx 概述
二、Nginx 核心安全配置
(一)编译安装 Nginx
(二)隐藏版本号
(三)限制危险请求方法
(四)请求限制(CC 攻击防御)
(五)防盗链
三、Nginx 高级防护
(一)动态黑名单
(二)Nginx HTTPS 配置
一、Nginx 概述
在互联网技术蓬勃发展的当下,Web 服务的安全性和可靠性至关重要。Nginx 作为一款高性能的 Web 服务器和反向代理工具,凭借其轻量级架构、卓越的高并发处理能力以及灵活的模块化设计,在全球 Web 服务器市场中占据近三分之一的份额,成为众多企业和开发者的首选。然而,网络攻击手段层出不穷,如 DDoS 攻击、SQL 注入、恶意爬虫等,同时数据隐私保护法规日益严格,如 GDPR、等保 2.0 等,这使得掌握 Nginx 的安全防护策略与 HTTPS 部署能力,成为运维工程师和开发者不可或缺的技能。
二、Nginx 核心安全配置
(一)编译安装 Nginx
- 安装支持软件:Nginx 的配置和运行依赖于 pcre、zlib 等软件包,因此需要预先安装这些软件的开发包(devel),以提供相应的库和头文件,确保 Nginx 安装顺利进行。在基于 DNF 包管理器的系统(如 OpenEuler)上,执行以下命令安装相关软件:
[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
- 创建运行用户、组和日志目录:为了提高安全性,创建专门的 Nginx 运行用户和组,并设置相应的日志目录。执行以下命令:
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx
- 编译安装 Nginx:下载 Nginx 源码包并解压,进入解压目录进行配置和编译安装。假设下载的 Nginx 版本为 1.26.3,执行以下命令:
[root@localhost ~]# tar zxf nginx-1.26.3.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]#./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module
[root@localhost nginx-1.26.3]# make && make install
上述./configure
命令中的参数含义如下:
--prefix=/usr/local/nginx
:指定 Nginx 的安装路径。--user=nginx
和--group=nginx
:指定 Nginx 运行的用户和组。--with-http_ssl_module
:启用 HTTPS 支持。--with-http_v2_module
:启用 HTTP/2 支持。--with-http_realip_module
:用于获取客户端真实 IP 地址。--with-http_stub_status_module
:启用状态统计模块。
安装完成后,可以通过以下命令检查 Nginx 是否安装成功,并查看版本号:
[root@localhost ~]# curl -I 192.168.10.101
如果 Nginx 正常运行,会返回类似如下信息,其中包含 Nginx 的版本号:
HTTP/1.1 200 OK
Server: nginx/1.26.3
# 省略部分内容
(二)隐藏版本号
Nginx 的版本号可能会被攻击者利用,获取服务器的相关信息,增加安全风险。因此,需要隐藏 Nginx 的版本号。修改 Nginx 配置文件nginx.conf
,在http
块中添加server_tokens off;
配置项:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
http {include mime.types;default_type application/octet-stream;# 隐藏版本号server_tokens off;# 省略部分内容
}
修改完成后,检查配置文件语法是否正确,并重新加载配置:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
再次使用curl -I
命令检查,版本号已被隐藏:
[root@localhost ~]# curl -I 192.168.10.101
HTTP/1.1 200 OK
Server: nginx
# 省略部分内容
(三)限制危险请求方法
TRACE、PUT、DELETE、CONNECT 等请求方法可能存在安全风险,如 TRACE 易引发 XST 攻击,PUT/DELETE 存在文件修改风险,CONNECT 可能导致代理滥用。通过正则表达式匹配请求方法,对非白名单方法返回 444(无响应关闭连接)。在 Nginx 配置文件nginx.conf
的server
块中添加如下配置:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
server {if ($request_method!~ ^(GET|HEAD|POST)$) {return 444;}# 省略部分内容
}
修改完成后,同样检查配置文件语法并重新加载配置:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
验证测试请求,以 PUT 请求为例:
[root@localhost ~]# curl -XPUT -I 192.168.10.101
curl: (52) Empty reply from server
查看access.log
日志,可以看到相应的记录:
192.168.10.101 - - [11/Mar/2025:18:30:46 +0800] "PUT / HTTP/1.1" 444 0 "-" "curl/8.4.0"
需要注意的是,测试 TRACE 和 CONNECT 方法时,状态码可能不是 444。原因如下:
- CONNECT 请求的目标不是代理服务器时,服务器必须返回 400 Bad Request,Nginx 核心层在请求解析阶段直接拦截,根本不进入后续的 location 处理流程。
- 现代 Nginx 默认禁用 TRACE 方法,在
ngx_http_core_module
阶段直接返回 405 Not Allowed。
(四)请求限制(CC 攻击防御)
CC 攻击(Challenge Collapsar 攻击)通过大量合法或伪造的小流量请求耗尽服务器资源,导致正常用户无法访问网站。可以使用 Nginx 的limit_req
模块限制请求速率,使用limit_conn
模块限制并发连接数。
- 使用 limit_req 模块限制请求速率:编辑 Nginx 配置文件
nginx.conf
,在http
块中定义限制区,在server
块的location
中实施速率限制:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
http {# 定义限制区(10MB内存/每秒10请求)limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;# 其他全局配置...server {location / {root html;index index.html index.php;limit_req zone=req_limit burst=20 nodelay;}}
}
上述配置中关键参数说明如下:
limit_req_zone
:定义共享内存区。$binary_remote_addr
:内置变量,表示客户端 IP 地址的二进制格式。zone=req_limit:10m
:创建名为req_limit
的共享内存区,大小为 10M,用于存储客户端 IP。rate=10r/s
:限制并发数,每个 IP 每秒可以发起的请求次数为 10 次。limit_req
:实施速率限制。zone=req_limit
:绑定到预定义的共享内存区。burst=20
:类似等候区,超出并发数的请求会进入等候区,等候区占满后,多余的请求会立刻返回 503。nodelay
:立即处理突发请求而不延迟,相当于立即处理等候区的请求,多余的请求会立刻返回 503。
- 压力测试验证:安装 ApacheBench(简称 ab)测试工具,它是 Apache HTTP 服务器自带的轻量级、易用的 HTTP 服务器性能测试工具。执行以下命令安装:
[root@localhost ~]# dnf install httpd-tools -y
发起测试请求,共发起 300 个请求,每次发起 30 个请求:
[root@localhost ~]# ab -n 300 -c 30 http://192.168.10.101/
其中,-n 300
表示总请求数为 300 次,即模拟客户端向服务器发送 300 次 HTTP 请求;-c30
表示并发用户数为 30,即同时有 30 个请求并行发送到服务器。
查看access.log
日志,会发现大量请求日志状态码为 503:
[root@localhost ~]# tail -300 /usr/local/nginx/logs/access.log | grep -c 503
279
(五)防盗链
防盗链用于防止未经授权的用户盗用网站(静态)资源,保护网站的带宽和资源,避免版权侵犯。盗链行为是指一个网站在没有自身页面资源的情况下,链接到其他网站的资源展示给浏览者,增加自身访问量,同时损害原网站的合法利益,加重服务器负担。
- 准备工作:本实验需要两台主机,分别为源主机(
192.168.10.101
,域名www.aaa.com
)和盗链主机(192.168.10.102
,域名www.bbb.com
)。修改 Windows 的C:\Windows\System32\drivers\etc\hosts
文件以及两台 OpenEuler 主机的hosts
文件,设置域名和 IP 映射关系:
192.168.10.101 www.aaa.com
192.168.10.102 www.bbb.com
在源主机(www.aaa.com
)的工作目录(假设为/usr/local/nginx/html
)下放置图片kgc.png
,并编辑原网站首页文件index.html
:
[root@localhost ~]# vi /usr/local/nginx/html/index.html
<html>
<body>
<h1>aaa It work!</h1>
<img src="kgc.png"/>
</body>
</html>
- 测试盗链:在盗链主机上安装
httpd
服务(用于模拟盗链网站),编辑盗链网站首页文件index.html
:
[root@localhost ~]# dnf -y install httpd
[root@localhost ~]# vi /usr/local/nginx/html/index.html
<html>
<body>
<h1>bbb It work!</h1>
<img src="http://www.aaa.com/kgc.png"/>
</body>
</html>
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl start httpd
此时访问盗链网站(www.bbb.com
),可以看到盗链成功,显示出源网站的图片。
3. 配置 Nginx 防盗链:在源主机的 Nginx 配置文件nginx.conf
中添加防盗链配置:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
location ^* \.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$ {root html;valid_referers aaa.com *.aaa.com;if ($invalid_referer) {return 403;}
}
上述配置中:
^*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$
:这段正则表达式表示匹配不区分大小写,以.jpg
或.gif
或.swf
等结尾的文件。valid_referers
:设置信任的网站,可以正常使用图片。if ($invalid_referer)
:如果链接的来源域名不在valid_referers
所列出的列表中,$invalid_referer
为 1,则执行后面的操作,即返回 403 页面。
修改完成后,检查配置文件语法并重新加载配置:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
再次访问盗链网站(www.bbb.com
),会发现盗链失败,显示 403 页面。
三、Nginx 高级防护
(一)动态黑名单
动态黑名单是 Nginx 中一种实时拦截恶意请求的安全机制,允许在不重启服务的情况下,动态更新需要封禁的 IP 地址或网段,相比静态配置的allow/deny
指令,更加灵活高效,适用于高并发、多变的攻击防护场景。
- 编辑黑名单配置文件:创建或编辑黑名单配置文件
blockips.conf
,添加需要封禁的 IP 地址或网段,以及对应的封禁动作:
[root@localhost ~]# vi /usr/local/nginx/conf/blockips.conf
192.168.1.0/24 1; # 封禁整个网段
192.168.10.102 1; # 封禁ip
IP 地址后的数字含义如下:
0
:允许访问。1
:返回 403,完全封禁。2
:返回 444,静默断开。3
:返回 503,服务不可用。
- 编辑主配置文件:在 Nginx 主配置文件
nginx.conf
中,使用geo
模块引入黑名单配置,并设置相应的封禁逻辑:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
http {geo $block_ip {default 0; # 默认允许访问include /usr/local/nginx/conf/blockips.conf; # 包含黑名单}server {if ($block_ip) {return 403; # 封禁动作}}
}
上述配置中:
geo
:Nginx 内置模块指令,专门用于处理 IP 地址相关的逻辑,基于客户端 IP 地址生成一个变量值,用于后续的访问控制判断。$block_ip
:自定义的变量名,存储计算结果(通常为 0 或 1)。default 0
:默认值,表示不在黑名单中的 IP 允许访问。if ($block_ip)
:当变量值为 1 时触发封禁逻辑。
修改完成后,检查配置文件语法并重新加载配置:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
- 使用封禁 ip 测试访问:使用封禁的 IP(如
192.168.10.102
)访问 Nginx 服务器,会返回 403 Forbidden 页面:
[root@localhost ~]# curl 192.168.10.101
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
- 自动添加黑名单:可以编写脚本实现自动封禁访问超过一定次数的 IP。例如,以下脚本可以自动封禁访问超过 100 次的 IP:
#!/bin/bash
# 自动封禁访问超过100次的IP
awk '{print $1}' /var/log/nginx/access.log |sort |uniq -c|sort -nr | awk '{if($1>100) print $2" 1;"}' > /usr/local/nginx/conf/blockips.conf
上述脚本中:
awk '{print $1}' /var/log/nginx/access.log
:从access.log
日志文件中提取客户端 IP 地址。sort
:对提取的 IP 地址进行排序。uniq -c
:统计连续出现的次数,并在行首显示次数。sort -nr
:按数值从大到小排序。awk '{if($1>100) print $2" 1;"}'
:筛选出访问次数大于 100 的 IP 地址,并添加封禁标记(返回 403)。> /usr/local/nginx/conf/blockips.conf
:将结果输出到黑名单配置文件中。
(二)Nginx HTTPS 配置
- HTTPS 概念
- HTTPS 的设计初衷与发展:HTTPS(HyperText Transfer Protocol over Secure Socket Layer)的设计初衷是为了保证数据传输安全。国内大型互联网巨头从 2016 年开始大力推行 HTTPS,期间发生了一系列重大事件。例如,Google 搜索引擎让 HTTPS 的网站在搜索排名中更靠前;从 2017 年开始,chrome 浏览器把只采用 HTTP 的网站标记为不安全网站;苹果要求 App Store 中的所有应用都必须使用 HTTPS 加密链接;新一代的 http/2 协议的支持需要以 HTTPS 为基础。
- HTTP 不安全的原因:HTTP 由于是明文传输,主要存在三大风险:窃听风险、篡改风险、冒充风险。
- 窃听风险:中间人可以获取到通信内容,由于内容是明文,所以获取明文后有安全风险。例如在转账场景中,中间人可以截获 “转账 100” 的信息,造成用户信息泄露和资金安全隐患 。
- 篡改风险:中间人可以篡改报文内容后再发送给对方,风险极大。如将 “转账 100 到 A 账户” 篡改为 “转账 200 到其他账户” 。
- 冒充风险:用户可能误以为在和合法网站通信,但实际上是在和钓鱼网站通信。比如以为是在和某宝通信,结果却是在和钓鱼网站交互。
- 安全通信的四大原则:安全的通信需要包括机密性、完整性、身份认证和不可否认这四个原则。
- 机密性:对数据加密,解决了窃听风险。即使数据被中间人窃听,由于数据是加密的,也无法获取明文。
- 完整性:数据在传输过程中没有被篡改,接收方能够识别数据是否被修改。一旦数据有任何改动,接收报文就会被判定为不合法。
- 身份认证:确认对方的真实身份,解决了冒充风险。让用户不用担心访问的是正规网站却实际与钓鱼网站通信的问题。
- 不可否认:不可否认已发生的行为。避免出现类似小明向小红借钱却不承认的情况,保障交易或行为的可追溯性和不可抵赖性。
- HTTPS 通信原理简述:
- 对称加密的困境:HTTP 是明文传输,给报文加密可采用对称加密方式,即通信双方使用同一把密钥进行加解密。但问题在于,对称加密的密钥协商存在困难。如果通过报文直接传输密钥,密钥会被中间人截获和替换,导致后续通信依然不安全。例如,客户端向服务器请求密钥,中间人截获真密钥并返回假密钥,客户端使用假密钥加密报文,中间人就能用假密钥解密并篡改内容,再用真密钥加密篡改后的内容发送给服务器 。
- 非对称加密的引入:非对称加密即加解密双方使用不同的密钥,一把作为公钥可以公开,一把作为私钥不能公开。公钥加密的密文只有私钥可以解密,私钥签名的内容只有公钥可以验签。服务器保管好私钥,发布公钥给客户端,客户端用公钥加密对称加密的密钥(或用于生成对称加密密钥的信息)传给服务器,服务器用私钥解密获得对称加密密钥,之后双方就可以用对称加密密钥进行通信。
- 数字证书解决公钥传输信任问题:然而,服务器的公钥在传输过程中也存在被中间人调包的风险。为解决此问题,引入数字证书。服务器向证书颁发机构(CA)申请证书,在证书中附上公钥,客户端收到证书后,通过验证证书的合法性以及证书中的域名信息,来确认公钥的真实性。客户端拿到服务器端的公钥后,用公钥加密会话密钥(对称加密的密钥)发送给服务端,服务端用私钥解密获得会话密钥,然后双方就可以安全地进行数据传输。需要注意的是,HTTPS 加密采用混合模式,在握手阶段使用非对称加密,在数据传输阶段使用对称加密,因为对称加密的密钥管理简单且加密和解密效率更高。同时,中间人无法通过申请受信任的证书来替换服务器的证书,因为每个证书中的域名是唯一的,客户端会验证证书中的域名与实际访问的域名是否一致。
- Nginx 配置 HTTPS 证书
- 使用 openssl 生成证书和私钥:由于 SSL 证书需要向 CA 组织申购,在实验环境中可以采用自签名证书(自己给自己签名并颁发证书,这种证书不被信任,仅适用于测试场景)。
- 创建证书存储目录:执行以下命令创建证书存储目录:
- 使用 openssl 生成证书和私钥:由于 SSL 证书需要向 CA 组织申购,在实验环境中可以采用自签名证书(自己给自己签名并颁发证书,这种证书不被信任,仅适用于测试场景)。
[root@localhost ~]# mkdir -p /etc/nginx/ssl
- 生成自签名证书:使用 openssl 命令生成自签名证书和私钥,执行以下命令:
[root@localhost ~]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx-selfsigned.key -out /etc/nginx/ssl/nginx-selfsigned.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=localhost"
- 参数解释:
-x509
:生成自签名证书(而非 CSR)。-nodes
:不加密私钥(无密码保护)。-days 365
:证书有效期 1 年。-keyout
:指定私钥文件。-out
:指定自签名文件。-newkey rsa:2048
:生成 2048 位的 RSA 私钥。-subj
:设置证书主题信息(可按需修改字段)。
- CA 签名证书与自签名证书对比:
- CA 签名证书:需要由受信任的第三方证书颁发机构(CA)签发。流程为用户生成私钥和 CSR(证书签名请求),将 CSR 提交给 CA(如 Let's Encrypt、DigiCert 等),CA 机构验证身份后,用 CA 的私钥对证书签名,生成最终证书。这种证书具有较高的信任度,适用于正式的线上环境。
- 自签名证书:证书的颁发者(Issuer)和主体(Subject)是同一个实体(即自己)。无需第三方 CA 参与,直接用工具(如 OpenSSL)生成私钥和证书。签名时使用自己的私钥,而不是 CA 的私钥。适用于测试、内部环境或无需公开信任的场景。
- Nginx 启用 HTTPS:编辑 Nginx 配置文件
nginx.conf
,添加 HTTPS 相关配置:
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
server {listen 443 ssl; # 监听HTTPS端口server_name localhost; # 域名或IP# 指定证书和私钥路径ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;# SSL协议和加密套件配置(可选,提升安全性)ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;ssl_prefer_server_ciphers on;# 其他配置(如根目录)location / {root /usr/local/nginx/html;index index.html;}# 可选:将HTTP请求重定向到HTTPSserver {listen 80;server_name localhost;return 301 https://$host$request_uri;}
}
- 配置说明:
listen 443 ssl
:表示 Nginx 监听 443 端口,并启用 SSL 加密。server_name
:指定服务器的域名或 IP 地址。ssl_certificate
和ssl_certificate_key
:分别指定 SSL 证书和私钥的路径。ssl_protocols
:指定允许的 SSL/TLS 协议版本,这里启用了 TLSv1.2 和 TLSv1.3,TLSv1.0 和 TLSv1.1 因存在安全风险已被弃用。ssl_ciphers
:设置加密套件,选择安全强度较高的加密算法组合。ssl_prefer_server_ciphers on
:表示优先使用服务器端配置的加密套件。location /
:定义网站的根目录和默认首页。- 第二个
server
块配置用于将 HTTP 请求重定向到 HTTPS,确保所有访问都通过加密连接进行。
- 检查配置并重启 Nginx:修改完成后,检查配置文件语法是否正确,并重新加载 Nginx 配置:
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload
- 通过浏览器验证:访问
https://你的服务器ip
,由于使用的是自签名证书,浏览器会提示证书不安全。在测试环境中,可以选择 “高级”-“继续前往” 或 “信任此证书”(在正式环境中,应使用受信任的 CA 签名证书)。如果配置正确,将能够正常访问网站内容。
相关文章:
Nginx安全防护与HTTPS部署
目录 一、Nginx 概述 二、Nginx 核心安全配置 (一)编译安装 Nginx (二)隐藏版本号 (三)限制危险请求方法 (四)请求限制(CC 攻击防御) (五&…...
HTTP 与 HTTPS 的深度剖析:差异、原理与应用场景
HTTP 与 HTTPS 的深度剖析:差异、原理与应用场景 在互联网的世界里,HTTP(超文本传输协议)和 HTTPS(超文本传输安全协议)是数据传输的 “高速公路”,它们承载着我们日常浏览网页、购物支付等各种…...
SMT贴片钢网精密设计与制造要点解析
内容概要 SMT贴片钢网作为电子组装工艺的核心载体,其设计与制造质量直接影响焊膏印刷精度及产品良率。本文系统梳理了钢网全生命周期中的15项关键技术指标,从材料选择、结构设计到工艺控制构建完整技术框架。核心要点涵盖激光切割精度的微米级调控、开口…...
算法每日一题 | 入门-顺序结构-三角形面积
三角形面积 题目描述 一个三角形的三边长分别是 a、b、c,那么它的面积为 p ( p − a ) ( p − b ) ( p − c ) \sqrt{p(p-a)(p-b)(p-c)} p(p−a)(p−b)(p−c) ,其中 p 1 2 ( a b c ) p\frac{1}{2}(abc) p21(abc) 。输入这三个数字,…...
Linux内核视角:线程同步与互斥的原理、实现与锁优化策略
Linux系列 文章目录 Linux系列前言一、前提知识二、线程互斥概念引入三、线程互斥3.1 什么是线程的互斥3.2 线程互斥的实现 四、锁的实现原理 前言 在前两篇文章中,我们已经对线程的相关概念及基本操作进行了深入介绍。在本篇中,我们将深入探讨编写多线…...
【区块链】Uniswap详细介绍
一、前言 本文将结合网上的资料和博主的理解,像大家详细介绍Uniswap,包括其核心概念、工作原理、版本演进、代币经济学以及风险点,适合想深入了解去中心化交易所(DEX)机制的用户。 二、Uniswap是什么 Uniswap 是一个…...
YOLOv8的Python基础--函数篇
1. 文件/目录操作相关函数 这些函数来自 os 和 shutil 模块: 函数/用法作用示例说明os.listdir(dir)列出目录下所有文件名os.listdir("./images")返回文件名列表(不包含路径)os.path.join()拼接路径os.path.join("dir"…...
vue源代码采用的设计模式分解
No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…...
强化学习是AI Agent的进化引擎还是技术枷锁呢?
第一章 强化学习:Agent的“灵魂”觉醒之路 1.1 AlphaGo的启示:从规则到目标驱动的范式革命 2016年AlphaGo击败李世石的事件,标志着RL首次在复杂决策场景中展现其颠覆性价值。通过深度神经网络与RL的结合,AlphaGo无需依赖人类棋谱…...
python简易实现勒索病毒
python简易实现勒索病毒 1.首先介绍Crypto库1.1首先是对称加密1.2 非对称加密1.3 哈希 2.生成RSA密钥并保存3.文件加密4.文件解密1. 导入必要的模块2. 定义解密函数3. 设置私钥的密码4. 打开并读取文件5. 导入私钥6. 读取加密数据7. 解密会话密钥8. 创建 AES 解密器9. 解密数据…...
Nacos源码—4.Nacos集群高可用分析三
大纲 6.CAP原则与Raft协议 7.Nacos实现的Raft协议是如何写入数据的 8.Nacos实现的Raft协议是如何选举Leader节点的 9.Nacos实现的Raft协议是如何同步数据的 10.Nacos如何实现Raft协议的简版总结 6.CAP原则与Raft协议 (1)CAP分别指的是什么 (2)什么是分区以及容错 (3)为…...
AWS WebRTC如何实现拉流?内部是这样实现的
当我们通过手机上的app选择某一个Iot设备,例如,摄像头,想看实时视频的时候,aws都做了什么?最近在搞自研Iot项目,借机整理一下相关流程。 App通过 AWS SDK 发起拉流请求的内部机制是AWS Kinesis Video Streams (KVS) WebRTC 模式中一个非常关键的问题。 一、KVS WebRTC …...
NGINX `ngx_http_browser_module` 深度解析与实战
1. 模块定位 ngx_http_browser_module 在 HTTP 头 User-Agent 解析的基础上,给出三个内置变量: 变量作用典型值$modern_browser当 UA 被判定为 现代浏览器 时取 modern_browser_value 指定的值;否则为空modern. / 1$ancient_browser当 UA 被…...
Elasticsearch知识汇总之 ElasticSearch高可用方案
六 ElasticSearch高可用方案 6.1 高可用架构 请求协调节点根据负载均衡,转发给主分片节点,主分片同步复制给从节点,主从节点都写入完成返回客户端请求成功。对于读请求,协调负载到任意节点数据节点,数据节点把各自符合…...
多线程2-多线程编程
引入 当我们想要代码能够实现并发执行时,我们可以使用多进程进行并发编程(在Java中并不推荐这种方式,许多API在Java标准库中都没有提供),也可以使用多线程进行并发编程(系统提供了相关的API,Ja…...
电商系统中单商户和多商户的区别
在电商的商业版图上,单商户与多商户模式如同两条并行的发展脉络,各自构建起独特的商业生态。它们在运营逻辑、商业模式等多方面存在显著差异,这些差异不仅塑造了不同的平台特性,也深刻影响着企业的发展路径。接下来,我…...
【东枫科技】代理英伟达产品:智能网卡的连接线
文章目录 总览详细:NVIDIA 400Gb/s QSFP-DD 线缆详细:NVIDIA 400Gb/s OSFP 线缆详细:NVIDIA 200Gb/s QSFP56 线缆详细:NVIDIA 100Gb/s QSFP28 线缆 总览 详细:NVIDIA 400Gb/s QSFP-DD 线缆 详细:NVIDIA 400…...
使用ip池后,爬虫还被封,是什么原因呢?
嘿,亲爱的小伙伴们!今天我们聊一个让很多爬虫工程师抓狂的问题:明明用上了IP池,结果爬虫还是被封了!怎么回事呢?如果你也曾在爬虫与反爬的“猫鼠游戏”里痛苦“翻车”,别着急,这篇文…...
C++23 新利器:深入解析栈踪迹库 (P0881R7)
文章目录 为何需要标准化的栈踪迹?P0881R7 的核心组件与使用基本用法示例与异常处理的集成优势与价值潜在的考量总结 对于 C 开发者而言,调试和错误诊断一直是开发周期中不可或缺但又充满挑战的一环。当程序崩溃或发生未预期行为时,获取清晰、…...
2025-05-06 事业-独立开发项目-记录
摘要: 2025-05-06 事业-独立开发项目-记录 独立开发项目记录 Product Hunt | InDev 独立开发者导航站https://www.producthunt.com/ Nomads.com - Best Places to Live for Digital Nomads (formerly Nomad List)https://nomads.com/ InDev 独立开发者导航站https://indev.bei…...
【Linux系统】探索进程等待与程序替换的奥秘
文章目录 前言一、重谈进程创建1.1 fork 函数1.2 写时拷贝1.3 fork 的常规用法1.4 fork 调用失败的原因1.5 创建一批进程 二、进程终止2.1 进程退出场景2.2 strerror 函数的作用2.3 errno 全局变量2.4 程序异常机制2.5 进程退出方式 三、进程等待3.1 进程等待必要性3.2 进程等待…...
Github 2025-05-06Python开源项目日报 Top10
根据Github Trendings的统计,今日(2025-05-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10C++项目2TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…...
【愚公系列】《Manus极简入门》021-音乐创作助手:“音符魔术师”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
【Azure Redis】Redis导入备份文件(RDB)失败的原因
问题描述 在测试Azure Redis的导入/导出备份文件的功能中,突然发现在Redis 4.0上导入的时候,一直报错。 image.png 问题解答 因为门户上只是显示导入失败,没有任何错误消息说明。根据常理推断,Redis 的RDB文件格式都具有一致性。居…...
git “分离头指针”(detached HEAD) 状态。
在 Git 中,当你运行 git branch 命令时,看到如下输出: * (detached from 5b596b5)master 其中的: * (detached from 5b596b5) 表示你当前处于 “分离头指针”(detached HEAD) 状态。 🧠 什…...
Gitee的介绍
目录 1.Gitee介绍: 1.1 代码托管 1.2 本土化优势 1.3 企业级服务 1.4 开源生态 1.5 多形态适配 定位:国内开发者首选的高效代码协作平台,兼顾个人开源与企业级私有开发需求。 2.Gitee和GitHub区别 3.Gitee使用教程 4.Gitee相关…...
NoUniqueKey问题和Regular join介绍
问题背景 在flink任务中,遇到了 NoUniqueKey Join的情况,导致了数据膨胀,和下游结果与数据库数据不一致问题 那NoUniqueKey Join为什么会导致问题呢,下面是其中一种场景示例: 为什么会出现 NoUniqueKey :…...
TC8:SOMEIP_ETS_027-028
SOMEIP_ETS_027: echoUINT8 目的 检查method方法echoUINT8的参数及其顺序能够被顺利地发送和接收 说白了就是检查UINT8数据类型参数在SOME/IP协议层的序列化与反序列化是否正常。 UINT8相比于测试用例SOMEIP_ETS_021: echoINT8中的SINT8数据类型来说,属于无符号整数,也就是…...
小微企业SaaS ERP管理系统,SpringBoot+Vue+ElementUI+UniAPP
小微企业的SaaS ERP管理系统,ERP系统源码,ERP管理系统源代码 一款适用于小微企业的SaaS ERP管理系统, 采用SpringBootVueElementUIUniAPP技术栈开发,让企业简单上云。 专注于小微企业的应用需求,如企业基本的进销存、询价&#…...
css filter 常用方法函数和应用实例
1. blur() 模糊 filter: blur(半径);参数:模糊半径(像素),值越大越模糊 示例:filter: blur(5px);2. brightness() 亮度 filter: brightness(百分比); 参数:1原始对比度,0全灰,>…...
chrome inspect 调试遇到的问题
1、oppp 手机打开webview 的时候, 报错这个并没有页面 Offline #V8FIG6SGLN75M7FY Pending authentication: please accept debugging session on the device. 解决方法,保持chrome 浏览器在显示的状态 去设置里开启usb 调试再关闭,反复重…...
Kotlin 中 List 和 MutableList 的区别
在 Kotlin 中,List 和 MutableList 是两种不同的集合接口,核心区别在于可变性。 Kotlin 集合框架的重要设计原则:通过接口分离只读(read - only)和可变(mutable)操作,以提高代码的安…...
openssl 生成自签名证书实现接口支持https
1.下载安装openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 2.配置环境变量 将 openssl 的目录(D:\tools\openssl\bin)添加到 path 中 3.生成自签名证书 找一个存证书的目录打开powershell 3.1 生成私钥 openssl gen…...
React 中集成 Ant Design 组件库:提升开发效率与用户体验
React 中集成 Ant Design 组件库:提升开发效率与用户体验 一、为什么选择 Ant Design 组件库?二、基础引入方式三、按需引入(优化性能)四、Ant Design Charts无缝接入图标前面提到了利用Redux提供全局维护,但如果在开发时再自己手动封装组件,不仅效率不高,可能开发的组件…...
神经网络:节点、隐藏层与非线性学习
神经网络:节点、隐藏层与非线性学习 摘要: 神经网络是机器学习领域中一种强大的工具,能够通过复杂的结构学习数据中的非线性关系。本文从基础的线性模型出发,逐步深入探讨神经网络中节点和隐藏层的作用,以及它们如何…...
vue+tsc+noEmit导致打包报TS类型错误问题及解决方法
项目场景: 提示:这里简述项目相关背景: 当我们新建vue3项目,package.json文件会自动给我添加一些配置选项,这写选项基本没有问题,但是在实际操作过程中,当项目越来越复杂就会出现问题,本文给大家分享vuetscnoEmit导致打包报TS类型错误问题及…...
Ragflow服务器上部署教程
参考官方文档进行整理 克隆相应代码 git clone https://github.com/infiniflow/ragflow.git修改vm.max_map_count sudo sysctl -w vm.max_map_count262144修改 daemon.json文件 {"registry-mirrors": ["https://docker.m.daocloud.io","https://0…...
Ubuntu 系统中解决 Firefox 中文显示乱码的完整指南
Firefox 是一款流行的网络浏览器,但在 Ubuntu 系统中有时会遇到中文显示乱码的问题。本文将为您提供一个全面的解决方案,帮助您轻松解决这个烦人的问题。 问题概述 在 Ubuntu 系统中使用 Firefox 浏览器时,有时会发现中文字符显示为乱码或方块。这通常是由于缺少合适的中文…...
JVM——垃圾回收
垃圾回收 在Java虚拟机(JVM)的自动内存管理中,垃圾回收(Garbage Collection, GC)是其核心组件之一。它负责回收堆内存中不再使用的对象所占用的内存空间,以供新对象的分配使用。下面我们将深入探讨JVM中的…...
【AI News | 20250506】每日AI进展
AI Repos 1、gitsummarize GitSummarize是一个在线工具,用户只需将GitHub URL中的“hub”替换为“summarize”,即可为任何公开或私有代码库生成交互式文档。该工具利用Gemini分析代码结构,自动生成系统级架构概述、目录和文件摘要、自然语言…...
LabVIEW高冲击加速度校准系统
在国防科技领域,高 g 值加速度传感器广泛应用于先进兵器研制,如深侵彻系统、精确打击弹药及钻地弹药等。其性能指标直接影响研究结果的准确性与可靠性,因此对该传感器进行定期校准意义重大。高冲击加速度校准系统具备多方面功能,适…...
优化算法 - intro
优化问题 一般形式 minimize f ( x ) f(\mathbf{x}) f(x) subject to x ∈ C \mathbf{x} \in C x∈C 目标函数 f : R n → R f: \mathbb{R}^n \rightarrow \mathbb{R} f:Rn→R限制集合例子 C { x ∣ h 1 ( x ) 0 , . . . , h m ( x ) 0 , g 1 ( x ) ≤ 0 , . . . , g r …...
从PotPlayer到专业播放器—基于 RTSP|RTMP播放器功能、架构、工程能力的全面对比分析
从PotPlayer到专业播放器SDK:工程项目怎么选择合适的播放方案? ——基于 RTSP、RTMP 播放器功能、架构、工程能力的全面对比分析 在许多音视频项目早期,我们都听过这句话: “本地测试就用 PotPlayer 播吧,能播就行了…...
EasyRTC嵌入式音视频通信SDK技术,助力工业制造多场景实时监控与音视频通信
一、背景 在数字化时代,实时监控广泛应用于安防、工业、交通等领域。但传统监控系统实时性、交互性欠佳,难以满足需求。EasyRTC作为先进实时通信技术,具有低延迟、高可靠、跨平台特性,能有效升级监控系统。融入EasyRTC后…...
MPay码支付系统第四方聚合收款码多款支付插件个人免签支付源码TP8框架全开源
一、源码描述 这是一套码支付源码(MPay),基于TP8框架,前端layui2.9后端PearAdmin,专注于个人免签收款,通过个人的普通收款码,即可实现收款通知自动回调,支持绝大多数商城系统&#…...
wrod生成pdf。[特殊字符]改背景
import subprocess import os,time from rembg import remove, new_session from PIL import Image import io from docxtpl import DocxTemplate, InlineImage from docx.shared import Inches input_folder ‘tupian’ # 输入文件夹 kouchu_folder ‘kouchu’ # 去背景图像…...
动手学深度学习12.1. 编译器和解释器-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:无 本节教材地址:12.1. 编译器和解释器 — 动手学深度学习 2.0.0 documentation 本节…...
数字文明时代开源技术驱动的商业范式重构:基于开源AI大模型、AI智能名片与S2B2C商城小程序源码的协同创新研究
摘要:数字文明时代,数字技术正以指数级速度重构全球经济与社会结构。本文聚焦开源AI大模型、AI智能名片与S2B2C商城小程序源码的协同创新机制,从技术架构、商业逻辑、实践案例三个维度展开系统研究。基于多行业实证数据,揭示开源技…...
【Bootstrap V4系列】学习入门教程之 组件-轮播(Carousel)
Bootstrap V4系列 学习入门教程之 组件-轮播(Carousel) 轮播(Carousel)一、How it works二、Example2.1 Slides only 仅幻灯片2.2 With controls 带控制装置2.3 With indicators 带指示器2.4 With captions 带字幕 轮播࿰…...
嵌入式openharmony标准鸿蒙系统驱动开发基本原理与流程
第一:鸿蒙概述 OpenHarmony采用多内核(Linux内核或者LiteOS)设计,支持系统在不同资源容量的设备部署。当相同的硬件部署不同内核时,如何能够让设备驱动程序在不同内核间平滑迁移,消除驱动代码移植适配和维护的负担,是OpenHarmony驱动子系统需要解决的重要问题。 …...