Linux NGINX 优化与防盗链

news2024/11/18 5:40:10

 ----------------隐藏版本号-------------------

可以使用 Fiddler 工具抓取数据包,查看 Nginx版本,
也可以在 CentOS 中使用命令 curl -I http://192.168.80.101 显示响应报文首部信息。
curl -I http://192.168.80.101

方法一:修改配置文件方式

修改nginx配置,关闭版本号显示

vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;                                #添加,关闭版本号
    ......
}

 重启服务,查看版本信息 

systemctl restart nginx
curl -I http://192.168.80.101

 

方法二:修改源码文件,重新编译安装

修改源码内版本号

vim /opt/nginx-1.22.0/src/core/nginx.h

#define NGINX_VERSION "1.1.1"                     #修改版本号
#define NGINX_VER "IIS" NGINX_VERSION             #修改服务器类型

 配置软件

cd /opt/nginx-1.22.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

 编译安装

make && make install

 安装完成后修改nginx配置文件,打开服务器标识

vim /usr/local/nginx/conf/nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens on;     #打开服务器标识
    ......
}

重启服务,查看版本信息 

systemctl restart nginx
curl -I http://192.168.80.101


----------------修改用户与组-------------------

vim /usr/local/nginx/conf/nginx.conf

第一行
user nginx nginx;
#取消注释,修改用户nginx ,组nginx

重启服务,查看进程信息 

systemctl restart nginx
ps aux | grep nginx


主进程nginx由root创建(管理work进程,读取配置文件),子进程work由nginx创建(接收用户请求)

 
----------------缓存时间-------------------

当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度
一般针对静态网页设置,对动态网页不设置缓存时间

vim /usr/local/nginx/conf/nginx.conf

http { #设置在http块中范围最大,缓存设置对所有页面生效
......
    server { #设置在server块中只对该虚拟主机(server)下页面生效
    ...... 
        location / { #设置在location块中只对该页面生效
            root html;
            index index.html index.htm;
        }
        
        location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {      #加入新的 location,以图片作为缓存对象
            root html;        #指定缓存文件位置,相对路径/html文件夹中
            expires 1d;       #指定缓存时间,1d 1天     1h 1小时
        }
......
    }
}

如果只有静态页面,直接http或server块中设置。

如果有动态页面也有静态页面,expires只能加在location中,用条件匹配相关的静态页面进行缓存

重启服务

systemctl restart nginx

 准备网页文件

vim /usr/local/nginx/html/index.html

<html>
  <body>
        <h1>this is a nginx web</h1>
        <img src=1.gif />
  </body>
</html>

浏览器访问 192.168.80.101 

在Linux系统中,打开火狐浏览器,右击点查看元素
选择 网络 ---> 选择 HTML、WS、其他 
访问 http://192.168.80.101/1.gif,双击200响应消息查看响应头中包含 Cahce-Control:max-age=86400 表示缓存时间是 86400 秒。也就是缓存一天的时间,一天之内浏览器访问这个页面,都是用缓存中的数据,而不需要向 Nginx 服务器重新发出请求,减少了服务器的使用带宽。

 

----------------日志切割-------------------

NGINX不具备日志分隔功能,但可以通过NGINX信号控制功能配合脚本,写入计划任务 实现日志的自动切割

编写日志分隔脚本(每一次计划任务执行脚本,都移走日志文件并重命名,然后kill -usr1生成新日志,删除30天以上日志)

vim /opt/fenge.sh

#!/bin/bash
# Filename: fenge.sh
lastday=$(date -d "-1 day" "+%Y%m%d")      #显示前一天的时间
logs_path="/var/log/nginx"                 #指定存放日志目录
pid_path="/usr/local/nginx/logs/nginx.pid" #进程文件路径。用于获取进程号
nginx_home="/usr/local/nginx"              #nginx的工作目录

[ -d $logs_path ] || mkdir -p $logs_path         #若目录不存在 创建日志文件目录 也可以if来写
mv $nginx_home/logs/access.log $logs_path/xue.com-access.log-$lastday
mv $nginx_home/logs/error.log $logs_path/xue.com-error.log-$lastday
#将日志文件/usr/local/nginx/logs/access.log,error.log移走并根据date重命名
kill -USR1 $(cat $pid_path)                       #kill -USR1 pid,重建新日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;     #查找30天之前的文件,rm删除
#find $logs_path -mtime +30 | xargs rm -rf        #查找30天之前的文件,rm删除

 脚本加权限

chmod +x /opt/fenge.sh
/opt/fenge.sh #执行测试

显示日志 

ls /var/log/nginx                     #yum安装nginx日志目录
ls /usr/local/nginx/logs/access.log   #源码安装nginx日志目录

启用定时任务 定时日志分隔

crontab -e
0 1 * * * /opt/fenge.sh
#每天1点执行

--------------------------------------------------小知识--------------------------------------------------
在linux操作系统中,每个文件都有很多的时间参数,其中有三个比较主要,分别是ctime,atime,mtime

ctime(status time):
当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,更像是change time,
只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话是不会更新这个时间。

atime(accesstime):
当使用这个文件的时候就会更新这个时间。

mtime(modification time):
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别。
----------------------------------------------------------------------------------------------------------

----------------连接超时-------------------

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

vim /usr/local/nginx/conf/nginx.conf

http {
...... 
    keepalive_timeout 60 55;
    keepalive_requests 10000;
    client_header_timeout 80;
    client_body_timeout 80;
...... 
}

重启服务 

systemctl restart nginx

----------------------------------------------------------------------------------------------------------
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)。
----------------------------------------------------------------------------------------------------------

由于服务器发送关闭连接请求后在完全关闭前还需要等待TIME_WAIT的2MSL(一般4分钟)

如果是高并发大负载的情况下,保持4分钟连接再关闭就会浪费很多资源,于是就有了keepalive_timeout 60 60;第二段的Keep-Alive浏览器主动关闭连接时间设置,由浏览器主动关闭连接,浏览器进入TIME_WAIT等待2MSL,不浪费服务器资源。

高并发下TIME WAIT特别多怎么办?(面试题)

设置长链接keepalive_timeout 60 55;(第二段浏览器主动断开时间小于前面服务器断开时间,让浏览器主动断开)

浏览器访问,查看响应透keep—alive信息 

 

 ----------------更改进程数-------------------

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

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

查看CPU核数,进程数量,以便参考调整

cat /proc/cpuinfo | grep -c "physical id"    #查看cpu核数
ps aux | grep nginx                          #查看nginx主进程中包含几个子进程

更改工作进程数量 

vim /usr/local/nginx/conf/nginx.conf
worker_processes  2;                #修改为核数相同或者2倍
worker_cpu_affinity 01 10;          #设置每个进程由不同cpu处理,有多少CPU写多少位。进程数配为4时0001 0010 0100 1000
#将每个worker子进程与特定CPU物理核心绑定,提升cpu利用率,进而提升性能。避免同一个worker子进程在不同的CPU核心上切换或者多个进程跑在一个CPU上,缓存失效,降低性能。

重启服务

systemctl restart nginx

---------- 设置并发(进程连接数,进程打开文件数,系统限制打开文件数)----------

进程连接数 ^ 进程打开文件数修改

vim /usr/local/nginx/conf/nginx.conf
       worker_rlimit_nofile 60000; #设置所有worker进程最大可以打开的文件数,默认为1024
       worker_connections  60000;  #每个进程处理 60000 个连接 与上一步全局配置设置的最大文件数相同

虽然在nginx配置中可以直接更改worker_rlimit_nofile 60000,但是系统可能不支持。

使用 ulimit -a 命令查看系统可打开最大文件数,ulimit -n临时修改,/etc/security/limits.conf永久修改。

ulimit -a

临时修改
ulimit -n 60000
永久修改 重启生效
vim /etc/security/limits.conf

*                soft    nofile          65535
*                hard    nofile          65535
#任意用户      软/硬限制  一个进程可打开最大文件数65535      

 ----------------配置网页压缩------------------- 

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

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;               #压缩比率 9最大1最小
   gzip_vary on;                    #让前端缓存服务器支持存储GZIP压缩的页面
   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 on;
gzip_min_length 1k;
gzip_buffers 4 64k;
gzip_http_version 1.1;
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;

 先将1.gif文件传到/usr/local/nginx/html目录下

cd /usr/local/nginx/html

更改网页文件

vim index.html

...... 
<img src="1.gif"/>          #网页中插入图片
</body>
</html>

 重启服务

systemctl restart nginx

在Linux系统中,打开火狐浏览器,右击点查看元素
选择 网络 ---> 选择 HTML、WS、其他 
访问 http://192.168.80.101 ,双击200响应消息查看响应头中包含 Content-Encoding: gzip


----------------配置防盗链-------------------

vim /usr/local/nginx/conf/nginx.conf

http {
......
    server {
    ......
    location ~* \.(jpg|gif|swf)$ {
            valid_referers none blocked *.xue.com xue.com;
            if ( $invalid_referer ) {
                    rewrite ^/ http://www.xue.com/error.png;
                    #return 403;
            }
    }

    ......
    }
}


----------------------------------------------------------------------------------------------------------
~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
valid_referers :设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源(根据Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的),如 http://www.xue.com/1.gif
我们使用 http://www.xue.com 访问显示的图片,可以理解成 http://www.xue.com/1.gif 这个请求是从 http://www.xue.com 这个链接过来的。
blocked:允许不是http://开头的,不带协议的请求访问资源; 
*.xue.com:只允许来自指定域名的请求访问资源,如 http://www.xue.com

if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回 403 页面。

网页准备

Web源主机(192.168.80.101)配置


将1.gif、error.png文件传到/usr/local/nginx/html目录下

cd /usr/local/nginx/html

编辑页面文件,包含需要显示的图片

vim index.html
...... 
<img src="1.gif"/>
</body>
</html>

写入host文件 临时域名解析

echo "192.168.80.101 www.xue.com" >> /etc/hosts
echo "192.168.80.102 www.benet.com" >> /etc/hosts

盗链网站主机(192.168.80.102)

编辑网页文件,引用源站图片

cd /usr/local/nginx/html

vim index.html

<html>
<body>
THIS IS DAOLIAN
<img src="http://www.xue.com/1.gif"/>
</body>
</html>

写入host文件 临时域名解析

echo "192.168.80.101 www.xue.com" >> /etc/hosts 
echo "192.168.80.102 www.benet.com" >> /etc/hosts 

在盗图网站主机上进行浏览器验证
        http://www.benet.com

----------------fpm参数优化-------------------

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

编辑 php-fpm.conf 文件,设置pid路径,方便管理

设置pid路径,默认在安装目录中的var/run/php-fpm.pid,开启后可以通过pid文件快速获得服务的PID号管理进程,精确获取进程pid

        为第三步做准备        

        kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

vim /usr/local/php/etc/php-fpm.conf

pid = run/php-fpm.pid

编辑www.conf文件,设置PHP进程配置

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    #动态方式下最大空闲进程数

重启php-fpm 

kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`            #重启php-fpm
netstat -anpt | grep 9000
ps -elf | grep php-fpm

nginx 优化总结(你做过那些优化?【面试题】)

应用程序级别的优化

隐藏版本号server_tokens off;
设置运行用户/组user   用户组  组名;
页面缓存时间expires 时间;
连接保持超时keepalive_timeout  服务器超时时间  [客户端超时时间]; (修改后面比前面小避免大量TIME_WAIT)
设置工作进程数worker_processes  auto;        或者同CPU数量       worker_cpu_affinity 绑核
设置并发worker_rlimit_nofile / worker_connections (并且还要在系统调优中设置打开最大文件数)
网页压缩gzip on
防盗链rewrite 
IO模型 IO多路复用events { use epoll; }
日志分割脚本

系统内核级别的优化

  • 修改内核打开文件数
ulimit -n    
/etc/security/limits.conf  
*                soft    nofile          65535            打开文件数
*                hard    nofile          65535
*                soft    nproc           65535            打开进程数
*                hard    nproc           65535
*                soft    memlock         unlimited        内存锁定不限制
*                hard    memlock         unlimited
  • 修改系统网络连接配置避免大量的断开连接时TIME_WAIT 
/etc/sysctl.conf
net.ipv4.tcp_syncookies =1            开启SYNCookies
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        修改系统默认的fin TIMEOUT 时间

net.ipv4.ip_local_port_range = 1024 65535   外向连接的端口范围
net.ipv4.tcp max tw buckets= 5000           系统同时保持TIME WAIT最大数量         
net.ipv4.tcp_max_syn_backlog = 8192         SYN队列长度
net.ipv4.tcp_keepalive_time = 1200          发送keepalive探测包消息的频度

你用过那些nginx模块?(面试题)

cd /opt/nginx-1.22.0/auto/
cat options | grep YES
查看nginx模块

http_gzip_static_module网页压缩模块
stub_status_module状态统计模块
rewrite_moduleURL重写模块
auth_basic_module用户认证模块
fastcgi_modulefastcgi转发php-fpm模块
ssl_modulehttps 安全加密认证模块
proxy_module请求转发模块
upstream_*_module反向代理负载均衡模块
stream_*_module四层反向代理模块
limit_conn_module限制最大连接数模块
limit_reg_module限制最大访问频率模块

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

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

相关文章

java工程师技术成长之路

1、新手阶段&#xff0c;全面、扎实地掌握语言的基本要素是你的当务之急。当然&#xff0c;除了语言&#xff0c;你还需要了解与编程相关的其他周边知识。 2、工作了几年&#xff0c;整天忙于业务代码&#xff0c;初级工程师很容易困惑下一步的方向在哪里&#xff0c;并且相当多…

KVM 虚拟化

1.1 前言 1.1.1 什么是虚拟化&#xff1f; 在计算机技术中&#xff0c;虚拟化&#xff08;技术&#xff09;或虚拟技术&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff08;CPU、内存、磁盘空间、网络…

当你怀疑电脑的时候,就是该换个方法的时候了

做软件开发的朋友们&#xff0c;干的时间长了&#xff0c;相信都会有过类似的体验&#xff1a;一个问题查了很久很久&#xff0c;代码检查了很多遍很多遍&#xff0c;到最后都要怀疑电脑了&#xff0c;突然发现是一个特别隐蔽的错误导致的&#xff0c;而这种错误通常不涉及逻辑…

2021第十二届蓝桥杯Python组国赛【真题+解析+代码】

&#x1f381;2021第十二届蓝桥杯python组国赛真题 &#x1f680; 真题练习&#xff0c;冲刺国赛 &#x1f680; 2021第十二届蓝桥杯python组国赛真题解析代码 博观而约取&#xff0c;厚积而薄发 &#x1f3c6;国赛真题目录 文章目录 &#x1f381;2021第十二届蓝桥杯python组国…

chatgpt赋能python:Python创建一个3x3的数组

Python创建一个3x3的数组 如果您是一名Python的爱好者或是初学者&#xff0c;在处理数据的时候一定会遇到需要创建数组的情况。在本篇文章中&#xff0c;我们将会介绍如何使用Python创建一个3x3的数组。在这个过程中&#xff0c;我们将从定义数组开始&#xff0c;到最后输出结…

【Python】函数 ⑥ ( 变量作用域 | 局部变量 | 全局变量 | global 关键字 | 代码示例 )

文章目录 一、变量作用域1、局部变量2、全局变量3、代码示例 - 函数体内修改全局变量失败4、代码示例 - 函数体内修改全局变量 一、变量作用域 Python 变量 作用域 是 变量的 使用范围 , 变量 在哪些 代码区域中可以被访问 , 在哪些代码块中不能被访问 ; 变量主要分为两类 : 局…

国产化麒麟系统在window系统上用hyper-v搭建虚拟机环境QT安装文件传输步骤

1 麒麟系统国产化hyper-v虚拟机环境经验 1.1 简介 随着国际环境的变化&#xff0c;软硬件国产化是现在迫切的需求&#xff0c;只有实现了自主研发&#xff0c;才能自立自强&#xff0c;才能实现民族伟大复兴&#xff0c;才能实现祖国的繁荣昌盛。为了实现这一目标&am…

AI可能造成人类灭绝,真的还是炒作?

5月30日&#xff0c;一封由非营利组织人工智能安全中心&#xff08;Center for AI Safety&#xff09;发布的简短声明轰动了AI界&#xff0c;导致人工智能的地位可能会被动摇。 我们在该组织的官网上找到了这份声明。声明中仅有22个单词&#xff0c;却饱含了专家对AI的“控诉”…

JavaEE-JVM的学习

目录 JVM执行流程JVM内存区域划分程序计时器栈堆方法区 JVM类加载机制1)Loading环节2)Linking环节2.1) Verification2.2)Preparation2.3)Resolution 3)Initializing JVM典型面试题JVM的垃圾回收机制(GC)分代回收 JVM执行流程 程序在执行之前先要把java代码转换成字节码&#xf…

盘点一个Python自动化办公需求,实现数据自动填充(下篇)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 七月七日长生殿&#xff0c;夜半无人私语时。 大家好&#xff0c;我是皮皮。 一、前言 前几天遇到了一个小需求&#xff0c;粉丝自己在实际工作中的需求…

回顾 | Semantic Kernel:面向 AI 编程(二) - Prompt Skill

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

子集II--(回溯+去重)

1题目 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,2…

基于最大似然反射率的异构激光雷达强度标定方案(开源)

文章&#xff1a;Maximum Likelihood Remission Calibration for Groups of Heterogeneous Laser Scanners 作者&#xff1a;Bastian Steder Michael Ruhnke Rainer Kummerle Wolfram Burgard 编辑&#xff1a;点云PCL 代码&#xff1a;https://github.com/soytony/IntensityCa…

vue 更新数组的方法

在 vue中&#xff0c;我们可以通过给数组添加索引来更新数组的值&#xff0c;比如我们需要在一个新的页面中添加一个新的元素&#xff0c;那么我们就可以通过给这个数组添加索引来实现。那么有朋友就会问了&#xff0c;为什么不直接在 vue中直接添加一个新的元素呢&#xff1f;…

chatgpt赋能python:Python列表排列顺序详解

Python列表排列顺序详解 作为一门功能丰富的高级编程语言&#xff0c;Python在不同类型的开发任务中广泛应用。其中&#xff0c;列表是一种常见的数据类型&#xff0c;用于存储多个元素。Python列表可以包含任何类型的数据&#xff0c;包括数字、字符串和其他列表等&#xff0…

干洗店软件,洗衣洗鞋线上下单小程序开发

干洗店软件洗衣洗鞋线上下单小程序&#xff1b; 可以实现客户自助办理&#xff0c;也可以和公众号、小程序等结合起来。干洗店软件可以实现客户管理&#xff0c;如积分管理&#xff0c;产品设置等功能。 线上下单&#xff0c;上门取货&#xff0c;订单拍照&#xff0c;订阅提示…

开发者实战 | 分割一切?Segment Anything 量化加速实战

点击蓝字 关注我们,让开发变得更有趣 作者 | 杨亦诚 排版 | 李擎 分割一切&#xff1f; Segment Anything 量化加速实战 前言 “分割一切,大家一起失业&#xff01;”——近期&#xff0c;这样一句话在社交媒体上大火&#xff01;这讲的就是 Segment Anything Model&#xff08…

chatgpt赋能python:Python创建一个Person类

Python 创建一个 Person 类 Python 是一种高级编程语言&#xff0c;因为它易于学习和使用&#xff0c;并且可以用于多种用途。使用 Python&#xff0c;您可以轻松创建各种程序&#xff0c;从简单的脚本到完整的应用程序。Python 的一个重要特点是它的面向对象编程能力&#xf…

「VS」Visual Studio 字符集

✨博客主页&#xff1a;何曾参静谧的博客 &#x1f4cc;文章专栏&#xff1a;「VS」Visual Studio 当我们在使用 Visual Studio 编写程序时&#xff0c;经常会遇到字符集的问题。在 Visual Studio 中&#xff0c;字符集选项有两个选项&#xff1a;Unicode 字符集和多字节字符集…

期刊和会议如何查询、期刊级别分类和顶会概念一文精析

期刊和会议查询、期刊级别分类和顶会概念分析 一、如何查询期刊和会议1.中文期刊-用知网出版物检索2.外文期刊-一般用letpub3.会议查询 二、国内期刊的正刊三、国内核心期刊四、国际核心期刊五、ESCI、SCI和SCIE的区别六、国际会议核心七、普刊八、顶刊九、水刊十、预警期刊 了…