Nginx优化(重点)与防盗链(新版)

Nginx优化(重点)与防盗链

  • Nginx优化(重点)与防盗链
    • 一、隐藏Nginx版本号
      • 1、修改配置文件
      • 2、修改源代码
    • 二、修改Nginx用户与组
      • 1、编译安装时指定用户与组
      • 2、修改配置文件指定用户与组
    • 三、配置Nginx网页的缓存时间
    • 四、实现Nginx的日志切割
      • 1、data的用法
      • 2、编写脚本进行日志切割的思路
    • 五、连接超时
    • 六、更改Nginx运行进程数
      • 1、修改配置文件
      • 2、修改进程配置参数
    • 七、配置Nginx实现网页压缩功能
      • 1、配置参数
      • 2、实现网页图片的大小压缩
    • 八、配置Nginx实现防盗链
      • 1、模拟盗链
      • 2、配置防盗链
    • 九、fpm参数优化
    • 十、系统内核级别的优化

一、隐藏Nginx版本号

避免安全漏洞泄漏

1、修改配置文件

cd /usr/local/nginx/conf
vim nginx.confhttp {server_tokens off;//关闭版本号
}#检查语法
nginx -t 
#重启服务
systemctl restart nginx使用curl -I命令检测
curl -I 192.168.210.101

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、修改源代码

Nginx源码文件/opt/nginx-1.24.0/src/core/nginx.h包含版本信息,可以随意设置,重新编译安装,隐藏版本信息
vim /opt/nginx-1.24.0/src/core/nginx.h
#define NGINX_VERSION "2.36.0",修改版本号为2.36.0
#define NGINX_VER "llS/",修改软件类型为llS再回到/opt/nginx-1.24.0目录中重新编译安装
#查看编译参数选项
ngnix -V 
#重新生成二进制文件
./configure --prefix
#编译安装
make && make install#重启nginx服务,使用curl -I命令检测,查看版本信息
systemctl restart nginx
curl -I 192.168.210.101

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、修改Nginx用户与组

Nginx运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制

Nginx默认使用nobody用户账号与组账号

1、编译安装时指定用户与组

编译安装时--user与--group指定Nginx服务的运行用户与组账号
./config \
--prefix=/usr/local/nginx  \
--user=nginx  \
--group=nginx  \
...

2、修改配置文件指定用户与组

vim nginx.conf
user nginx nginx;//第一个nginx代表用户名,第二个代表组名#重启nginx
systemctl restart nginx
#查看nginx进程的用户
ps aux | grep nginx

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、配置Nginx网页的缓存时间

当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便再以后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度。

一般针对静态网页设置,对动态网页不设置缓存时间

设置方法:修改配置文件,在http段、或者server段或者location段加入特定内容的过期参数

修改Nginx的配置文件,在location段加入expires参数,expires参数用于设置nginx网页缓存时间
server {location ~ \.(png|jpg|jpeg|gif|txt|mp3|mp4)$ {root html/static;expires 1d;//一天}
}
只要访问以png|jpg|jpeg|gif|txt|mp3|mp4格式结尾的路径,就可以被location匹配到,会从html/static目录中获取静态资源,并且让浏览器可以在本地缓存资源一天。nginx -t
systemctl restart nginx在html目录中创建一个static静态资源目录,并在这个目录中存放一些图片内容
error.png 和 game.jpg
cd /usr/local/nginx/html
mkdir static
cd static/

在这里插入图片描述
在这里插入图片描述

在浏览器测试
http://192.168.210.101/game.jpg
http://192.168.210.101/error.png

在这里插入图片描述
在这里插入图片描述

四、实现Nginx的日志切割

随着Nginx运行时间增加,日志也会增加。为了方便掌握Nginx运行状态,需要时刻关注Nginx日志文件

太大的日志文件对监控是一个大灾难,要定期进行日志文件的切割

Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割

通过Linux的计划任务周期性地进行日志切割

1、data的用法

date --help
#命令帮助
date +%F
#完整日期格式
date +%Y%m%d
#年月日
date +%Y/%m/%d
#年/月/日
date +%Y%m01
#当月第一天
date -d "+1 day" +%Y%m%d
#显示明天
date -d "-1 day" +%Y%m%d
date -d "1 day ago" +%Y%m%d
#显示前一天
date -d "$(date +%Y%m01) -3 day" +%Y%m%d
#当月第一天的前三天
date -d "$(date +%Y%m01) -1 day" +%Y%m%d
#上个月的最后一天
date -d "$(date -d "1 mouth" +%Y%m01) -1 day" +%Y%m%d
#当月的最后一天
date -d "-1 day" +%Y%m01
#这个月第一天
date -d "1 mouth" +%Y%m01
#下个月第一天

2、编写脚本进行日志切割的思路

①判断保存日志分割的目录,如果目录不存在就创建目录,如果目录存在就跳过执行下一条命令
②用mv命令将nginx的访问日志移到专门保存日志分割的目录,并且改名添加时间标识
③使用kill -USR1指定nginx的pid号重新生成日志文件
④通过find -mtime+30去找到30天之前修改过的日志文件并删除
#日志切割脚本
vim nginx_log.sh
#!/bin/bash
#this is used for cutting nginx logsLASTDAY=$(date -d "-1 day" +%Y%m%d)
LOGPATH=/var/log/nginx
NGINX_HOME=/usr/local/nginx
PID_PATH=$NGINX_HOME/logs/nginx.pid#判断保存日志的目录是否存在,如果不存在则创建该目录,如果存在则执行下一条命令
[ -d $LOGPAHT ] || mkdir -p $LOGPATH#使用mv命令进行日志分割移动日志文件到保存日志的目录里,并修改文件名添加时间标识
mv $NGINX_HOME/logs/access.log $LOGPATH/access.log-$LASTDAY
mv $NGINX_HOME/logs/error.log $LOGPATH/error.log-$LASTDAY#重新生成新的日志文件,以便nginx写入后续日志
kill -USR1 $(cat $PID_PATH)#查找出30天以前的日志文件并删除,释放磁盘空间
find $LOGPATH -mtime +30 -deletechomd +x nginx_log.sh
llcrontab -e
0 0 * * * /root/nginx_log.sh
crontab -l./nginx_log.sh
cd /var/log/
ls //生成nginx目录
cd nginx/
lscd /usr/local/nginx/logs/
ls
是空的,后续再有日志写入就会写到空的里面
#每个月的最后一天
vim latestday.sh#!/bin/bash
a=2
for i in {02..12}
doecho $(date -d "$(date +2023${i}01) -1 day" +%Y%m%d)
done
echo $(date -d "$(date +20240101) -1 day" +%Y%m%d)sh latestday.sh#不管在哪一年,都能获取到当年月份的最后一天
vim latestday.sh#!/bin/bash
a=2
for i in {02..12}
doecho $(date -d "$(date +%Y${i}01) -1 day" +%Y%m%d)
done
echo $(date -d "$(date -d "1 year" +%Y0101) -1 day" +%Y%m%d)sh latestday.sh

五、连接超时

HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。

什么情况下用长连接,什么情况下不用长连接?

并发少的情况下不用长连接,并发多用长连接

keepalive_timeout
指定KeepAlive的超时时间(timeout)。指定一个长连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。 Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。
第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-Alive 响应头。client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。client_body_timeout
指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。
vim /usr/local/nginx/conf/nginx.conf
http {
...... keepalive_timeout 60 60;//客户端的时间要小于服务端的连接时间,尽量让客户端主动关闭keepalive_requests 100;//长连接最多允许的请求数client_header_timeout 40;//请求头的超时时间client_body_timeout 40;//请求体的超时时间
...... 
}
nginx -t
systemctl restart nginx在浏览器测试
http://192.168.210.101/error.jpg

在这里插入图片描述
在这里插入图片描述

六、更改Nginx运行进程数

在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞。

1、修改配置文件

修改配置文件的worker_processes参数

  • 一般设为CPU的个数或者核数
  • 在高并发情况下可设置为CPU个数或者核数的2倍

增加进程数,可减少系统的开销,提升服务速度

cat /proc/cpuinfo | grep -c "physical id"	#查看cpu核数
也可以把worker_processes设为auto,让nginx自动去识别

在这里插入图片描述

vim /usr/local/nginx/conf/nginx.confworker_processes auto;//设置为auto,让nginx自动去识别systemctl restart nginx使用ps aux查看运行进程数的变化情况
ps aux | grep nginx
#查看nginx主进程中包含几个子进程

在这里插入图片描述
在这里插入图片描述

2、修改进程配置参数

默认情况下,Nginx的多个进程可能跑在一个CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核CPU

vim /usr/local/nginx/conf/nginx.confworker_processes  4;				#修改为核数相同或者2倍
worker_cpu_affinity 01 10 100 1000;			#设置每个进程由不同cpu处理,
worker_rlimit_nofile 65535;         #提升并发量events {use epoll;  #使用epoll io模型worker_connections 65535;   #连接数也为65535
}systemctl restart nginx进程数配为4时0001 0010 0100 1000
#将每个worker子进程与特定CPU物理核心绑定,提升cpu利用率,进而提升性能。避免同一个worker子进程在不同的CPU核心上切换或者多个进程跑在一个CPU上,缓存失效,降低性能。

在这里插入图片描述
在这里插入图片描述

七、配置Nginx实现网页压缩功能

Nginx的nginx_http_gzip_module压缩模块提供对文件内容压缩的功能
允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装
可在配置文件中加入相应的压缩功能参数对压缩性能进行优化

1、配置参数

vim /usr/local/nginx/conf/nginx.conf
http {
...... gzip on;							#取消注释,开启gzip压缩功能gzip_min_length 1k;      		#最小压缩文件大小gzip_buffers 4 64k;      		#压缩缓冲区,大小为4个64k缓冲区gzip_http_version 1.1;   		#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)gzip_comp_level 6;       		#压缩比率gzip_vary on;					#支持前端缓存服务器存储压缩页面gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;		#压缩类型,表示哪些网页文档启用压缩功能
...... 
}

2、实现网页图片的大小压缩

将以上的压缩功能参数加入到主配置文件httpd配置中段

重启服务,查看网页压缩功能开启结果

#实现网页图片的大小压缩
http_image_filter_module是Nginx提供的集成图片处理模块,可以用于实时缩取图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息yum install -y gd-devel
#yum在线源安装gd-devel,http_image_filter_module模块需要依赖gd-devel的支持cd /opt/nginx-1.24.0/nginx -V./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_image_filter_modulemake && make install
vim /usr/local/nginx/conf/nginx.conf
http {...gzip on; gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;#将图片类型文件压缩加入gzip....server {....location ~* \.(jpg|gif|png)$ {image_filter resize 200 200; //设置照片大小}}
}
#按等比例缩小图像的宽或高至指定大小。如果只想设置一个维度,另一维可以指定为:“-"
#(如果长>宽就以长为标准,宽为比例,如果长<宽就以宽为标准,长为比例)
cd /usr/local/nginx/html
先将game.jpg文件传到/usr/local/nginx/html目录下
vim test.html
<img src="game.jpg"/>   #网页中插入图片
</body>
</html>systemctl restart nginx在浏览器测试http://192.168.210.101/test.html

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、配置Nginx实现防盗链

在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失。

1、模拟盗链

192.168.210.101 www.accp.com 源主机
192.168.210.102 www.benet.com 盗链主机在盗链主机编译安装apache服务并开启httpd服务
systemctl start httpd
netstat -lntp | grep httpd用域名去访问图片,在电脑的Windows/System32/drivers/etc路径去修改hosts文件
192.168.210.101 www.accp.com
192.168.210.102 www.benet.com  #修改配置文件
vim /usr/local/httpd/conf/httpd.conf
ServerName www.benet.com:80

在这里插入图片描述

cd /usr/local/httpd/htdocs/
vim index.html
<html>
<body><h1>It is daolian web!</h1>
<img src="http://www.accp.com/game.jpg">
</body></html>systemctl restart httpd在浏览器中测试
http://www.benet.com/index.html

在这里插入图片描述
在这里插入图片描述

2、配置防盗链

~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
valid_referers :设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源(根据Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的),如 http://www.accp.com/game.jpg
我们使用 http://www.accp.com 访问显示的图片,可以理解成 http://www.accp.com/game.jpg 这个请求是从 http://www.accp.com 这个链接过来的。
blocked:允许不是http://开头的,不带协议的请求访问资源; 
*.accp.com:只允许来自指定域名的请求访问资源,如 http://www.accp.comif语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回 403 页面。
把/usr/local/nginx/html/static目录下的error.png移到/usr/local/nginx/html目录下vim /usr/local/nginx/conf/nginx.conf
http {
......server {......location ~* \.(jpg|gif|jepg)$ {valid_referers none blocked *.accp.com accp.com;#*.accp.com accp.com只要不是从这个路径来的请求都认为是盗链if ( $invalid_referer ) {rewrite ^/ http://www.accp.com/error.png;#盗链请求就用rewrite对整个路径进行重写,让盗链请求访问我的http://www.accp.com/error.png这个路径,由于png在正则表达式里面没有匹配,这样的话就会匹配到根路径html目录下,就会读取html下的error.png}}}
}
nginx -t
systemctl restart httpd在浏览器测试http://www.accp.com/index.html

在这里插入图片描述

九、fpm参数优化

Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整
根据服务器的内存与服务负载,调整FPM模块参数

vim /usr/local/php/etc/php-fpm.conf 
--17行--取消注释
pid = run/php-fpm.pid

在这里插入图片描述

vim /usr/local/php/etc/php-fpm.d/www.conf
--96行--
pm = dynamic				#fpm进程启动方式,动态的
--107行--
pm.max_children=20			#fpm进程启动的最大进程数
--112行--
pm.start_servers = 5		#动态方式下启动时默认开启的进程数,在最小和最大之间
--117行--
pm.min_spare_servers = 2	#动态方式下最小空闲进程数
--122行--
pm.max_spare_servers = 8	#动态方式下最大空闲进程数systemctl restart php-fpm.service
ps aux|grep fpm

在这里插入图片描述
在这里插入图片描述

十、系统内核级别的优化

如果发现系统存在大量TIME_WAIT状态的连接,可以通过调整内核参数解决

vim /etc/sysctl.conf 内核配置参数文件
加入以下内容net.ipv4.tcp_syncookies = 1                  开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
net.ipv4.tcp_tw_reuse = 1                    开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_recycle = 1                  开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_fin_timeout = 30                修改系默认的 TIMEOUT 时间(MSL值)
net.ipv4.tcp_max_tw_buckets = 6000           系统同时保持TIME-WAIT的最大数量
net.ipv4.ip_local_port_range = 1024 65535    外向连接的端口范围,默认为32768 60999
net.ipv4.tcp_max_syn_backlog = 65536         系统能接受的tcp半连接的最大队列数,TCP三次握手建立阶段接受SYN请求队列的最大长度
net.core.somaxconn = 65536                   每一个端口最大的 Listen 监听队列的长度(排队等待接收的最大连接数)需要配合Nginx的配置参数一起调整 listen 80 backlog=65536; 
net.ipv4.tcp_keepalive_time = 600            发送keepalive探测包消息的频率,确认客户端是否断网
/etc/security/limits.conf   内核限制文件
* 	soft 	noproc			65535      打开的进程数
* 	hard 	noproc			65535
* 	soft 	nofile			65535      打开的文件数
* 	hard 	nofile			65535
* 	soft 	memlock 		unlimited     不做内存锁定
* 	hard 	memlock 		unlimited

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

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

相关文章

Almost Sorted Array HDU - 5532

Almost Sorted Array HDU - 5532 题意&#xff1a; 如果一个数组的元素“按非递减或非递增顺序排列”&#xff0c;那么称这个数组有序。现在&#xff0c;LYD给了你一个数组a&#xff0c;他让你从中选择并移除仅仅1个元素&#xff0c;请问剩下的元素构成的数组有可能是有序的吗…

CF906D:Power Tower(拓展欧拉定理、暴力)

解析 大降智题。 受相逢是问候的影响&#xff0c;第一眼直接线段树&#xff0c;写完WA完才发现这个玩意没有结合律。 然后开始用 xyz(xy)yz−1x^{y^z}(x^y)^{y^{z-1}}xyz(xy)yz−1 这样的东西嗯做&#xff0c;结果只是在玩泥巴。 lemma&#xff1a;迭代求 φ\varphiφ 的次数是…

CodeForces730E Award Ceremony(拓扑排序+结论)

CF730E. Award Ceremonyproblemsolutioncodeproblem 题目链接 题目大意&#xff1a; 给出 nnn 个队封榜时的榜单 aia_iai​ 和揭榜时的变化情况 did_idi​。 揭榜时&#xff0c;这个队的名次会变化 tit_iti​。 注意在别的队揭榜时&#xff0c;自己队的排名也是动态变化的…

.Netcore 2.0 Ocelot Api网关教程(番外篇)- Ocelot v13.x升级

由于Ocelot系列博客好久没更新&#xff08;差不多有10个月的时间了&#xff09;&#xff0c;在此先说声抱歉&#xff0c;Ocelot系列会继续更新下去。在写上一篇配置管理的时候发现官方文档已经和以前的不一样&#xff0c;而Ocelot也从5.0版本更新到了13.x版本&#xff0c;进行了…

CF765F Souvenirs(暴力、线段树)

解析 比较神奇的一道题。 考虑一个常规套路&#xff1a;把询问离线&#xff0c;移动右端点&#xff0c;维护左端点答案。 考虑暴力维护&#xff0c;对于当前的 aixa_ixai​x&#xff0c;左侧如图所示的这两条线上的点都可以产生新的可能答案。 容易构造使得单次产生的新点是…

Hard Disk Drive HDU - 4788

Hard Disk Drive HDU - 4788 题意&#xff1a; 通常制造商认为1“kilo”等于1000&#xff0c;但操作系统会认为是1024。 因此&#xff0c;当你购买了一个100MB的硬盘&#xff0c;电脑却只显示大约有95MB&#xff0c;这缺失了大约5MB。 对于硬盘的大小&#xff0c;有多种单位描…

货币系统(二分)

problem 【题目描述】 你在 NOIP 2018 的赛场上遇到了「货币系统」一题。你没有写出这题&#xff0c;导致网友的国度简化货币系统的任务失败了。网友的国度的货币系统现在十分混乱。 网友的国度现今有两套货币系统「忘忧」和「网游」。为了方便使用&#xff0c;它们有一个共用…

ASP.NET Core 沉思录 - 环境的思考

我的博客换新家啦&#xff0c;新的地址为&#xff1a;https://clrdaily.com :-D今天我们来一起思考一下如何在不同的环境应用不同的配置。这里的配置不仅仅指 IConfiguration 还包含 IWebHostBuilder 的创建过程和 Startup 的初始化过程。0 太长不读环境造成的差异在架构中基本…

区域赛铜牌专题(一)

区域赛铜牌专题 题号题目知识点HDU 5532Almost Sorted Array贪心,LISHDU 5533Dancing Stars on MeHDU 5536Chip FactoryHDU 5538House BuildingHDU 5510BazingaHDU 5512PagodasHDU 4788Hard Disk DriveHDU 4821String计蒜客 42405TriangleHDU 4810Wall PaintingHDU 4771Steali…

P3581 [POI2015] CZA(状压)

解析 不能在一条思路上死磕&#xff01; 首先这题真正考的其实就是 p3p3p3。 乍一看题意&#xff1a;给出一张特殊图&#xff0c;求哈密顿回路方案数。 然后发现这个图性质不咋地。 然后就不会了。 … 正解根本和哈密顿回路毛关系也没有&#xff01; 考虑从1-n依次插入。 注…

[Wf2011]Chips Challenge(最小费用最大流)

[Wf2011]Chips Challengeproblemsolutioncodeproblem BZOJ2673 solution . 首先得知道这是网络流&#xff0c;但真的看不出来啊&#xff01;&#xff01;我真的郁闷啊(&#xffe3;﹏&#xffe3;&#xff1b;) 在知道做法是网络流后&#xff0c;初读题&#xff0c;肯定会…

深度:从 Office 365 新图标来看微软背后的设计新理念

开始表演请关注我的公众号“寒树Office”来获取一些新鲜而有趣的新闻与知识&#xff0c;最近又有两家俱乐部上线了&#xff08;东莞与长沙&#xff09;&#xff0c;俱乐部的活动告一段落&#xff0c;接下来的日子里我将持续与大家分享 Office 365 的精彩内容&#xff0c;这次很…

BZOJ4294 : [PA2015]Fibonacci(dfs、暴力、数位dp)

解析 新定义数位dp了属于是。 结论&#xff1a;斐波拉契在模 10m10^m10m 的意义下循环节为 6*10^m。 但这个不一定是最小循环节&#xff0c;我自己做的时候打表得出来的循环节更小。 考虑从低到高枚举周期中的位置&#xff0c;暴力check合法进行剪枝。 跑的飞快&#xff0c;O…

Chip Factory HDU - 5536

Chip Factory HDU - 5536 题意&#xff1a; 给你n个数&#xff0c;让你从中选出i&#xff0c;j&#xff0c;k三个下标&#xff0c;求最大的 &#xff08;a[i]a[j]&#xff09;^ a[k] 题解&#xff1a; 这种查找最大异或一般有两个方向&#xff0c;一个是有公式推导规律可循…

AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

AtCoder Regular Contest 061 E - Snuke’s Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流&#xff0c;所以一读这题后&#xff0c;我就想到了最小费用流。 首先的问题就是建边问题。 不同线路到达同一个点从而引发后面的费用是相互独立的&#xff0c;不能由…

NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

前言当一个APM或一个日志中心实际部署在生产环境中时&#xff0c;是有点力不从心的。比如如下场景分析的问题&#xff1a;从APM上说&#xff0c;知道某个节点出现异常&#xff0c;或延迟过过高&#xff0c;却不能及时知道日志反馈情况&#xff0c;总不可能去相应的节点上一个一…

HDU5519:Kykneion asma(容斥)

计数的核心是双射。 解析 这也叫数位dp呗… 首先&#xff0c;这个题目的形式很容易令人想到硬币购物&#xff0c;考虑用容斥解决&#xff0c;暴力枚举强制超额的数的集合然后分别计算贡献。 然而&#xff0c;暴力dp计算贡献的复杂度是 O(n2)O(n^2)O(n2) 的。 考虑换一种统计…

Dancing Stars on Me HDU - 5533

Dancing Stars on Me HDU - 5533 题意&#xff1a; LYD又来了&#xff0c;这次他碰到了一个小问题&#xff0c;给定n个点&#xff0c;点的坐标为均为整数&#xff0c;问这些点能否组成正多边形&#xff1f; 题解&#xff1a; 如果是正多边形&#xff0c;那中心的坐标就是所…

[HDU 3625] Examining the Rooms(第一类斯特林数)

Examining the Roomsproblemsolutioncodeproblem hdu 3625 solution 之前考试有一道题&#xff1a;最多砸开 kkk 扇门&#xff0c;采取最有操作&#xff0c;求把 nnn 个门都打开的方案数。 本题稍稍多了一个不能砸开第一扇门的限制&#xff0c;以及求的是概率。 概率好说&…

P5801 [SEERC2019]Game on a Tree(博弈论)

解析 一直在路径可逆上做功夫&#xff0c;跑偏了。 题目可以转化为一个模型&#xff1a;给出一张无向图&#xff0c;每次可以移动到未移动过的点上&#xff0c;不能移动者判负。 这个的做法就是判断是否完美匹配&#xff0c;完美匹配则后手必胜&#xff0c;否则先手必胜。 …