FastDFS安装并整合Openresty

news2025/1/19 2:38:34

FastDFS安装

  • 一、环境--centos7
  • 二、FastDFS--tracker安装
    • 2.1.下载
    • 2.2.FastDFS安装环境
    • 2.3.安装FastDFS依赖libevent库
    • 2.4.安装libfastcommon
    • 2.5.安装 libserverframe 网络框架
    • 2.6.tracker编译安装
    • 2.7.文件安装位置介绍
    • 2.8.错误处理
    • 2.9.配置FastDFS跟踪器(Tracker)
    • 2.10.启动
    • 2.11.将Tracker设置成系统服务
      • 2.11.1.创建Tracker服务文件
      • 2.11.2.重新加载服务配置文件使之生效
      • 2.11.3.服务操作命令
  • 三、FastDFS--storage安装
    • 3.1.安装libevent
    • 3.2.安装libfastcommon
    • 3.3.storage编译安装
    • 3.4.配置 FastDFS 存储 (Storage)
    • 3.5.启动
    • 3.6.将fdfs_storaged设置成系统服务
      • 3.6.1.创建fdfs_storaged服务文件
      • 3.6.2.重新加载服务配置文件使之生效
      • 3.6.3.服务操作命令
    • 3.7.查看Storage和Tracker是否在通信
    • 3.8.Storage 目录
  • 四、上传图片测试:通过fdfs_test程序
  • 五、FastDFS 和nginx整合
    • 5.1.nginx代理
    • 5.2.在Storage上安装openresty
      • 5.2.1.fastdfs-nginx-module
      • 5.2.2.openresty安装
      • 5.2.3.编辑nginx配置文件
    • 5.3.访问测试
    • 5.4.测试上传图片并访问【success】
  • endl

一、环境–centos7

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

二、FastDFS–tracker安装

分别在192.168.229.141和192.168.229.142上安装tracker
注:初次安装可只安装一台tracker方便调试

2.1.下载

tracker和storage使用相同的安装包,下载地址:https://github.com/happyfish100/FastDFS

在这里插入图片描述

2.2.FastDFS安装环境

FastDFS是C语言开发,建议在linux上运行,本教程使用Centos7.9作为安装环境。

安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc

yum install gcc-c++

2.3.安装FastDFS依赖libevent库

yum -y install libevent

2.4.安装libfastcommon

libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。

下载地址:https://github.com/happyfish100/libfastcommon
在这里插入图片描述

将libfastcommon-1.0.72.tar.gz拷贝至/usr/local/下

cd /usr/local

tar -zxvf libfastcommon-1.0.72.tar.gz

cd libfastcommon-1.0.72

./make.sh

./make.sh install

cd /usr/lib

在这里插入图片描述

安装完成之后查看相关文件,默认情况下:
头文件安装在/usr/include/fastcommon目录下
动态库安装在/usr/lib64//usr/lib/目录下

2.5.安装 libserverframe 网络框架

安装包下载地址:https://github.com/happyfish100/libserverframe
在这里插入图片描述

cd /usr/local

tar -zxvf libserverframe-1.2.2.tar.gz

cd libserverframe-1.2.2

./make.sh 

./make.sh install

2.6.tracker编译安装

将fastdfs-6.11.0.tar.gz拷贝至/usr/local/下

cd /usr/local

tar -zxvf fastdfs-6.11.0.tar.gz

cd fastdfs-6.11.0

./make.sh

./make.sh install

在这里插入图片描述

安装成功将安装目录下的conf下的文件拷贝到/etc/fdfs/下

cp /usr/local/fastdfs-6.11.0/conf/* /etc/fdfs/

在这里插入图片描述

2.7.文件安装位置介绍

安装之后,工具安装在/usr/bin/目录下:

fdfs_delete_file:删除文件
fdfs_download_file:下载文件
fdfs_upload_file:上传文件
fdfs_trackerd:启动tracker服务
fdfs_storaged:启动storage服务
fdfs_file_info:用来检查一个文件的信息,参数传递一个FastDFS文件
[root@localhost fastdfs-6.11.0]# ls /usr/bin/fdfs_*
/usr/bin/fdfs_appender_test  	 /usr/bin/fdfs_crc32          /usr/bin/fdfs_file_info            
/usr/bin/fdfs_storaged  		/usr/bin/fdfs_trackerd
/usr/bin/fdfs_appender_test1  	/usr/bin/fdfs_delete_file    /usr/bin/fdfs_monitor              
/usr/bin/fdfs_test      		/usr/bin/fdfs_upload_appender
/usr/bin/fdfs_append_file     	/usr/bin/fdfs_download_file  /usr/bin/fdfs_regenerate_filename  
/usr/bin/fdfs_test1     		/usr/bin/fdfs_upload_file
配置文件默认安装在/etc/fdfs/目录下:
client.conf.sample:客户端默认配置文件
storage.conf.sample:storage服务默认配置文件
storage_ids.conf.sample:
tracker.conf.sample:tracker服务默认配置文件
[root@localhost fastdfs-6.11.0]# ls /etc/fdfs
anti-steal.jpg  client.conf  http.conf  mime.types  storage.conf  storage_ids.conf  tracker.conf

动态库文件分别安装在/usr/lib/目录和/usr/lib64/目录下

在这里插入图片描述

2.8.错误处理

[root@localhost fastdfs-6.11.0]# ./make.sh
gcc -Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -g -O1 -DDEBUG_FLAG -c -o ../common/fdfs_global.o ../common/fdfs_global.c  -I../common -I/usr/local/include
In file included from ../common/fdfs_global.c:21:0:
../common/fdfs_global.h:17:26: 致命错误:sf/sf_global.h:没有那个文件或目录
 #include "sf/sf_global.h"
                          ^
编译中断。
make: *** [../common/fdfs_global.o] 错误 1
gcc -Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -g -O1 -DDEBUG_FLAG -c -o ../common/fdfs_global.o ../common/fdfs_global.c  -I. -Itrunk_mgr -I../common -I../tracker -I../client -Ifdht_client -I/usr/include/fastcommon
In file included from ../common/fdfs_global.c:21:0:
../common/fdfs_global.h:17:26: 致命错误:sf/sf_global.h:没有那个文件或目录
 #include "sf/sf_global.h"
                          ^
编译中断。
make: *** [../common/fdfs_global.o] 错误 1
gcc -Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -g -O1 -DDEBUG_FLAG -c -o ../common/fdfs_global.o ../common/fdfs_global.c  -I../common -I../tracker -I/usr/include/fastcommon
In file included from ../common/fdfs_global.c:21:0:
../common/fdfs_global.h:17:26: 致命错误:sf/sf_global.h:没有那个文件或目录
 #include "sf/sf_global.h"
                          ^
编译中断。
make: *** [../common/fdfs_global.o] 错误 1

在这里插入图片描述

原因:在安装较新版得 fastdfs 时,从github 下载得安装包缺少文件,缺少了 libserverframe 网络框架

解决方法:`安装 libserverframe 网络框架``

安装包下载地址:https://github.com/happyfish100/libserverframe
在这里插入图片描述

cd /usr/local

tar -zxvf libserverframe-1.2.2.tar.gz

cd libserverframe-1.2.2

./make.sh 

./make.sh install

安装完成后重新编译 fastdfs

2.9.配置FastDFS跟踪器(Tracker)

FastDFS 配置文件详解:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1941456&extra=page%3D1%26filter%3Ddigest%26digest%3D1

cd /etc/fdfs

# 备份tracker配置文件
cp tracker.conf tracker.conf.bak

vi tracker.conf

修改文件

# 配置文件是否不生效,false 为生效
disabled=false

# 提供服务的端口
port=22122

# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)
#base_path = /opt/fastdfs
#base_path=/home/fastdfs/Tracker
base_path = /home/fastdfs

# HTTP 服务端口 默认8080 ,建议修改 防止冲突
#http.server_port = 8080
http.server_port = 80
# 创建tracker基础数据目录,即base_path对应的目录
mkdir -p /home/fastdfs
# 检查端口号是否被占用
netstat -apn | grep 22122

# 防火墙中打开跟踪端口(默认的22122)
firewall-cmd --zone=public --add-port=22122/tcp --permanent

# 配置立即生效
firewall-cmd --reload

# 查询开放端口
firewall-cmd --list-ports

2.10.启动

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop

初次成功启动,会在 /home/fastdfs/ (配置的base_path)下创建 data、logs 两个目录

[root@localhost fdfs]# ls /home/fastdfs/
data  logs
${base_path}
|__data
| |__storage_groups.dat:存储分组信息
| |__storage_servers.dat:存储服务器列表
|__logs
| |__trackerd.log: tracker server 日志文件
# 检查是否启动
ps aux | grep fdfs*

2.11.将Tracker设置成系统服务

2.11.1.创建Tracker服务文件

vim /usr/lib/systemd/system/tracker.service
[Unit]
Description=Tracker Server
After=network.target

[Service]
Type=forking
# 配置成自己的路径
ExecStart=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
ExecStop=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
Restart=always

[Install]
WantedBy=multi-user.target
  • Description:服务描述
  • After:指定服务依赖的其他服务启动之后再启动
  • Type:指定服务的类型,这里设置为forking,表示服务以fork方式启动
  • ExecStart:指定服务的启动命令
  • ExecStop:指定服务的停止命令
  • Restart:指定服务在退出后是否自动重启
  • WantedBy:指定服务的启动级别

2.11.2.重新加载服务配置文件使之生效

# 重新加载服务配置文件
systemctl daemon-reload

2.11.3.服务操作命令

#启动
systemctl start tracker

#停止
systemctl stop tracker

#重新启动
systemctl restart tracker

#查看服务当前状态
systemctl status tracker

#设置开机自启动
systemctl enable tracker

#停止开机自启动
systemctl disable tracker
# 检查是否启动
ps aux | grep fdfs*

在这里插入图片描述

三、FastDFS–storage安装

分别在192.168.229.143、192.168.229.144、192.168.229.145、192.168.229.146上安装storage

注:初次安装可只安装一台storage方便调试。

3.1.安装libevent

同上

3.2.安装libfastcommon

同上

3.3.storage编译安装

同tracker编译安装

3.4.配置 FastDFS 存储 (Storage)

cd /etc/fdfs

# 备份storage配置文件
cp storage.conf storage.conf.bak

vi storage.conf
# 配置文件是否不生效,false 为生效
disabled=false 

# 指定此 storage server 所在 组()
group_name = group1

# storage server 服务端口
port=23000

# 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)
heart_beat_interval=30

# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)
#base_path = /opt/fastdfs
#base_path=/home/fastdfs/Storage
base_path = /home/fastdfs

# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。
store_path_count=1

# 逐一配置 store_path_count 个路径,索引号基于 0。
#store_path0 = /opt/fastdfs
store_path0 = /home/fastdfs/fdfs_storage
#store_path1 = /opt/fastdfs2
#如果有多个挂载磁盘则定义多个store_path,如下
#store_path1=.....
#store_path2=......

# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。 
# 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。
subdir_count_per_path=256

#tracker_server = 192.168.209.121:22122
#tracker_server = 192.168.209.122:22122
#配置tracker服务器:IP
tracker_server = 192.168.229.141:22122
#如果有多个则配置多个tracker
#tracker_server = 192.168.229.142:22122

# 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。
sync_start_time=00:00
sync_end_time=23:59

# 访问端口 默认80 建议修改 防止冲突
#http.server_port = 8888
#配置http端口
http.server_port = 80

创建Storage基础数据目录,对应base_path目录

# 对应base_path
mkdir -p /home/fastdfs
# 这是配置的store_path0路径,有多个要创建多个
mkdir -p /home/fastdfs/fdfs_storage
# 检查端口号是否被占用
netstat -apn | grep 23000

# 防火墙中打开存储器端口(默认的 23000) 
firewall-cmd --zone=public --add-port=23000/tcp --permanent

# 配置立即生效
firewall-cmd --reload

# 查询开放端口
firewall-cmd --list-ports

3.5.启动

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop
# 检查是否启动
ps aux | grep fdfs*

3.6.将fdfs_storaged设置成系统服务

3.6.1.创建fdfs_storaged服务文件

vim /usr/lib/systemd/system/storage.service
[Unit]
Description=Storage Server
After=network.target

[Service]
Type=forking
# 配置成自己的路径
ExecStart=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
ExecStop=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop
Restart=always

[Install]
WantedBy=multi-user.target
  • Description:服务描述
  • After:指定服务依赖的其他服务启动之后再启动
  • Type:指定服务的类型,这里设置为forking,表示服务以fork方式启动
  • ExecStart:指定服务的启动命令
  • ExecStop:指定服务的停止命令
  • Restart:指定服务在退出后是否自动重启
  • WantedBy:指定服务的启动级别

3.6.2.重新加载服务配置文件使之生效

# 重新加载服务配置文件
systemctl daemon-reload

3.6.3.服务操作命令

#启动
systemctl start storage

#停止
systemctl stop storage

#重新启动
systemctl restart storage

#查看服务当前状态
systemctl status storage

#设置开机自启动
systemctl enable storage

#停止开机自启动
systemctl disable storage
# 检查是否启动
ps aux | grep fdfs*

在这里插入图片描述

3.7.查看Storage和Tracker是否在通信

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

在这里插入图片描述

3.8.Storage 目录

同Tracker一样,Storage 启动成功后,在base_path 下创建了data、logs目录,记录着 Storage Server 的信息
在 store_path0/data 目录下,创建了N*N个子目录:

[root@localhost fdfs]# ls /home/fastdfs/fdfs_storage/data/
00  07  0E  15  1C  23  2A  31  38  3F  46  4D  54  5B  62  69  70  77  7E  85  8C  93  9A  A1  A8  AF  
B6  BD  C4  CB  D2  D9  E0  E7  EE  F5  FC  01  08  0F  16  1D  24  2B  32  39  40  47  4E  55  5C  63  
6A  71  78  7F  86  8D  94  9B  A2  A9  B0  B7  BE  C5  CC  D3  DA  E1  E8  EF  F6  FD  02  09  10  17  
1E  25  2C  33  3A  41  48  4F  56  5D  64  6B  72  79  80  87  8E  95  9C  A3  AA  B1  B8  BF  C6  CD  
D4  DB  E2  E9  F0  F7  FE  03  0A  11  18  1F  26  2D  34  3B  42  49  50  57  5E  65  6C  73  7A  81  
88  8F  96  9D  A4  AB  B2  B9  C0  C7  CE  D5  DC  E3  EA  F1  F8  FF  04  0B  12  19  20  27  2E  35  
3C  43  4A  51  58  5F  66  6D  74  7B  82  89  90  97  9E  A5  AC  B3  BA  C1  C8  CF  D6  DD  E4  EB  
F2  F9  05  0C  13  1A  21  28  2F  36  3D  44  4B  52  59  60  67  6E  75  7C  83  8A  91  98  9F  A6  
AD  B4  BB  C2  C9  D0  D7  DE  E5  EC  F3  FA  06  0D  14  1B  22  29  30  37  3E  45  4C  53  5A  61  
68  6F  76  7D  84  8B  92  99  A0  A7  AE  B5  BC  C3  CA  D1  D8  DF  E6  ED  F4  FB

四、上传图片测试:通过fdfs_test程序

FastDFS安装成功可通过/usr/bin/fdfs_test测试上传、下载等操作。

修改/etc/fdfs/client.conf

/etc/fdfs/client.conf

tracker_server根据自己部署虚拟机的情况配置

#Client 的数据和日志目录
#base_path=/home/fastdfs/client
base_path=/home/fastdfs
tracker_server=192.168.229.141:22122
#tracker_server=192.168.229.142:22122

使用格式:

/usr/bin/fdfs_test 客户端配置文件地址  upload  上传文件

比如将/etc/fdfs/anti-steal.jpg下的图片上传到FastDFS中:

/usr/bin/fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/anti-steal.jpg

打印如下日志:

[root@localhost fdfs]# vi client.conf 
[root@localhost fdfs]# 
[root@localhost fdfs]# /usr/bin/fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/anti-steal.jpg
This is FastDFS client test program v6.11.0

Copyright (C) 2008, Happy Fish / YuQing

FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.fastken.com/ 
for more detail.

[2024-02-09 18:33:56] DEBUG - base_path=/home/fastdfs, connect_timeout=5, network_timeout=60, tracker_server_count=1, 
anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, 
use_storage_id=0, connect_first_by=tracker, storage server id count: 0, multi storage ips: 0

tracker_query_storage_store_list_without_group: 
        server 1. group_name=, ip_addr=192.168.229.141, port=23000

group_name=group1, ip_addr=192.168.229.141, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKjljWXF_5WALK3dAABdreSfEnY041.jpg
source ip address: 192.168.229.141
file timestamp=2024-02-09 18:33:57
file size=23981
file crc32=3835630198
example file url: http://192.168.229.141/group1/M00/00/00/wKjljWXF_5WALK3dAABdreSfEnY041.jpg
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKjljWXF_5WALK3dAABdreSfEnY041_big.jpg
source ip address: 192.168.229.141
file timestamp=2024-02-09 18:33:57
file size=23981
file crc32=3835630198
example file url: http://192.168.229.141/group1/M00/00/00/wKjljWXF_5WALK3dAABdreSfEnY041_big.jpg

http://192.168.229.141/group1/M00/00/00/wKjljWXF_5WALK3dAABdreSfEnY041_big.jpg就是文件的下载路径

对应storage服务器上的

/home/fastdfs/fdfs_storage/data/00/00/wKjljWXF_5WALK3dAABdreSfEnY041_big.jpg文件

由于现在还没有和nginx整合无法使用http下载

五、FastDFS 和nginx整合

5.1.nginx代理

nginx代理storage上的nginx,并进行负载均衡

nginx的安装细节参考nginx文档,这里使用单机nginx,也可以使用两台nginx组成高可用或者采用lvs+nginx访问Storage上的nginx

创建nginx-fdfs.conf配置文件:

#storage群group1组
upstream storage_server_group1{
    	server 192.168.229.143:80 weight=10;
		server 192.168.229.144:80 weight=10;
    }
#storage群group2组
upstream storage_server_group2{
    	server 192.168.229.145:80 weight=10;
		server 192.168.229.146:80 weight=10;
    }

server {
	listen 80;
	server_name location;
	
	location /group1{
		proxy_redirect off;
		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://storage_server_group1;
	}
	location /group2{
		proxy_redirect off;
		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://storage_server_group2;
	}
}

5.2.在Storage上安装openresty

5.2.1.fastdfs-nginx-module

下载地址:https://github.com/happyfish100/fastdfs-nginx-module

将fastdfs-nginx-module-1.24.tar.gz传至/openresty/core/moudle/下

cd /openresty/core/moudle

tar -zxvf fastdfs-nginx-module-1.24.tar.gz

mv fastdfs-nginx-module-1.24 fastdfs-nginx-module

cd fastdfs-nginx-module/src
#修改config文件将/usr/local/路径改为/usr/
cd fastdfs-nginx-module/src

vi config

在这里插入图片描述

#将fastdfs-nginx-module/src下的mod_fastdfs.conf拷贝至/etc/fdfs/下
cp mod_fastdfs.conf /etc/fdfs/

修改mod_fastdfs.conf的内容:

vi /etc/fdfs/mod_fastdfs.conf

base_path=/home/fastdfs
tracker_server=192.168.229.141:22122
#tracker_server=192.168.229.142:22122

#url中包含group名称
url_have_group_name=true

#指定文件存储路径,Storage配置的store_path0路径,必须和storage.conf中的一致
store_path0=/home/fastdfs/fdfs_storage
find / -name libfdfsclient.so

#将libfdfsclient.so拷贝至/usr/lib下
cp /usr/lib64/libfdfsclient.so /usr/lib/

5.2.2.openresty安装

openresty安装:https://blog.csdn.net/qq_45740503/article/details/135887895

添加fastdfs-nginx-module模块

./configure --add-module=/openresty/core/moudle/fastdfs-nginx-module/src

make && make install

nginx -V

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

5.2.3.编辑nginx配置文件

新建nginx配置文件nginx-fdfs.conf
直接编辑nginx.conf

vi /usr/local/openresty/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  192.168.229.141;

        #在80端口下添加fastdfs-nginx-module模块
		location ~/group([0-9])/M00 {
			root /home/fastdfs/fdfs_storage/data;
    		ngx_fastdfs_module;
		}
}

说明:

server_name指定本机ip

location /group1/M00/:

group1为nginx 服务fastdfs的分组名称,
M00是fastdfs自动生成编号,对应store_path0=/home/fastdfs/fdfs_storage,
如果fastdfs定义store_path1,这里就是M01

listen 80端口值是要与 /etc/fdfs/storage.conf 中的 http.server_port=80相对应。
如果改成其它端口,则需要统一,同时在防火墙中打开该端口。

5.3.访问测试

通过java客户端上传文件,使用浏览器http访问文件,这里访问上传图片测试的文件:

访问storage:

http://192.168.229.143/group1/M00/00/00/wKjljWXF_5WALK3dAABdreSfEnY041_big.jpg
如果配置了多个ip地址改为192.168.229.144也行,因为同一个分组的storage文件互相同步。

访问tracker:

http://192.168.229.141/group1/M00/00/00/wKjljWXF_5WALK3dAABdreSfEnY041.jpg
如果配置了多个ip地址改为192.168.229.142也行

使用域名访问 (推荐):

nginx对外由vip提供服务,使用域名访问如下:
比如vip对应的域名为img.test.com:
http://img.test.com/group1/M00/00/00/wKjljWXF_5WALK3dAABdreSfEnY041_big.jpg

5.4.测试上传图片并访问【success】

/usr/bin/fdfs_test 客户端配置文件地址  upload  上传文件
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/22.png

在这里插入图片描述

http://192.168.229.141/group1/M00/00/00/wKjljWXGIWKATkMkAAVtZBzi-RU560.png
http://192.168.229.141/group1/M00/00/00/wKjljWXGIWKATkMkAAVtZBzi-RU560_big.png

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

endl

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

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

相关文章

【JAVA WEB】 css背景属性 圆角矩形的绘制

目录 背景属性设置 圆角矩形 背景属性设置 背景颜色,在style中 background-color:颜色; 背景图片 background-image:url(……) 背景图片的平铺方式 background-repeat: 平铺方式 repeat 平铺(默认)no-repeat 不平铺repeat-x 水平平铺repea…

设计模式3-责任链模式

责任链模式是一种行为设计模式,它允许你创建一个对象链。请求沿着这条链传递,直到有一个对象处理它为止。这种模式通常用于需要以某种方式动态地决定处理请求的顺序或方式的情况。 类图: 从图中可见最大的特点是AbstractHandler它自己聚合了自…

探索Xposed框架:个性定制你的Android体验

探索Xposed框架:个性定制你的Android体验 1. 引言 在当今移动设备市场中,Android系统作为最受欢迎的操作系统之一,其开放性和可定制性备受用户青睐。用户希望能够根据个人喜好和需求对其设备进行定制,以获得更符合自己习惯的使用…

svg 进阶

svg 进阶 svg 应用场景 绘制 icon绘制动画 svg viewport 和 viewBox viewport 是 svg 图像的可见区域 viewBox 是用于在画布上绘制 svg 图形的坐标系统 在一下案例中 svg中 width“500” height“200” 就是可视区域 比如你的svg是100X100但是你的可视区域只有20X20 那么他…

c语言中的模拟多态性

在C语言中模拟多态性 多态性是面向对象编程中的一个核心概念,它允许我们通过一个共同的接口来操作不同的数据类型。虽然C语言是一种过程式语言,本身不直接支持面向对象的特性,如继承、封装和多态,但我们可以通过一些技巧来模拟这些…

mac docker 宿主机和容器间网络打通

动因 是这样,笔者最近满怀欣喜入手Docker,看着各种文章命令都是不断点头称道:“嗯嗯,不错不错”,在接下来终于准备大干一场的时候碰壁了,主要情况是说在Mac中跑了第一把的时候发现碰到,虚拟机和宿主机居然…

arkTS开发鸿蒙OS应用(登录页面实现,连接数据库)

前言 喜欢的朋友可在抖音、小红书、微信公众号、哔哩哔哩搜索“淼学派对”。知乎搜索“编程淼”。 前端架构 Toubu.ets import router from ohos.router Component export struct Header{build(){// 标题部分Row({space:5}){Image($r(app.media.fanhui)).width(20).onClic…

HiveSQL——用户中两人一定认识的组合数

注:参考文章: SQL之用户中两人一定认识的组合数--HQL面试题36【快手数仓面试题】_sql面试题-快手-CSDN博客文章浏览阅读1.2k次,点赞3次,收藏12次。目录0 需求分析1 数据准备2 数据分析3 小结0 需求分析设表名:table0现…

深度分析一款新型Linux勒索病毒

前言 DarkRadiation勒索病毒是一款全新的Linux平台下的勒索病毒,2021年5月29日首次在某平台上发布了此勒索病毒的相关的信息,6月中旬趋势科技针对这个新型的勒索病毒进行了相关的分析和报道。 DarkRadiation勒索病毒采用Bash脚本语言编写实现&#xff0…

渗透测试练习题解析 2(CTF web)

题目均来自 BUUCTF 1、[极客大挑战 2019]Upload 1 考点:文件上传漏洞 进入靶场 一看就知道是考察文件上传漏洞,看源码有没有敏感信息 没有什么敏感信息,那我们试着按要求传一张图片看看结果,但是传了 png、jpg 类型的图片后发现上…

那些 C语言指针 你不知道的小秘密 (4)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能…

蓝桥杯每日一练(python)B组

###来源于dotcpp的蓝桥杯真题 题目 2735: 蓝桥杯2022年第十三届决赛真题-取模&#xff08;Python组&#xff09; 给定 n, m &#xff0c;问是否存在两个不同的数 x, y 使得 1 ≤ x < y ≤ m 且 n mod x n mod y 。 输入格式&#xff1a; 输入包含多组独立的询问。 第一…

Linux开发工具的使用 (gcc/g++ | gdb)

目录 一、gcc/g 1.关于gcc/g 2.gcc如何使用 gcc选项&#xff1a; 预处理&#xff1a; 编译: 汇编: 连接: 函数库是什么&#xff1a; 函数库分为动态库和静态库两种 二、调试器gdb 1.关于gdb 2. gdb的使用 gdb选项&#xff1a; Linux是一个广泛用于开发的操作系统&…

uni-app x,一个纯原生的Android App开发工具

uni-app x&#xff0c;下一代uni-app&#xff0c;一个神奇的产品。 用vue语法、uni的组件、api&#xff0c;以及uts语言&#xff0c;编译出了kotlin的app。不再使用js引擎和webview。纯纯的kotlin原生app。 uni-app x&#xff0c;让“跨平台开发性能不如原生”的这条曾广为流…

【集合系列】TreeMap 集合

TreeMap 集合 1. 概述2. 方法3. 遍历方式4. 排序方式5. 代码示例16. 代码示例27. 代码示例38. 注意事项9. 源码分析 其他集合类 父类 Map 集合类的遍历方式 TreeSet 集合 具体信息请查看 API 帮助文档 1. 概述 TreeMap 是 Java 中的一个集合类&#xff0c;它实现了 SortedMap…

【网工】华为设备命令学习(服务器发布)

本次实验主要是内网静态nat配置没&#xff0c;对外地址可以理解为一台内网的服务器&#xff0c;外网设备可以ping通内网的服务器设备&#xff0c;但是ping不通内网的IP。 除了AR1设备配置有区别&#xff0c;其他设备都是基础IP的配置。 [Huawei]int g0/0/0 [Huawei-GigabitEt…

5.1 灯光色彩与视觉

5.1 灯光色彩与视觉 视觉成像 灯光与物体的反应:吸收,反射和折射 色彩:光照到物体上,物体吸收其他光源色,只反射该颜色光,所以物体 表面呈现该颜色 视觉:该颜色光进入人眼刺激感光细胞,并在视网膜上形成影像. ABSORBTION 一、基础灯光 1.环境光&#xff08;Ambient Light…

Python小白:Python 编辑器那么多种,到底怎么选!!

前言 我在刚刚接触编程的时候很纠结于这个问题&#xff0c;因为我想找一个功能强大&#xff0c;免费&#xff0c;可多平台&#xff0c;支持多种语言的编辑器&#xff0c;所以我特意花费了一些时间对 Python 的编辑器进行了调研&#xff0c;我最终选择了 VScode 作为我的首选编…

GEE详细教程之:将Landsat8与Landsat9影像合成一个影像

1.前言 因项目需求&#xff0c;需要获取一个研究区的Landsat8影像&#xff0c;但Landsat8重复周期长&#xff0c;加之天气的影响&#xff0c;很难获取影像质量较好的影像。Landsat4/5/7的波段顺序与landsat8不同&#xff0c;除此之外&#xff0c;landsat7影像还需要工具进行条带…

《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)

文章目录 6.1 设置和管理复制6.1.1 基础知识6.1.2 重点案例&#xff1a;使用 Python 设置 MySQL 主从复制6.1.3 拓展案例 1&#xff1a;自动故障转移6.1.4 拓展案例 2&#xff1a;设置双主复制 6.2 复制的类型和策略6.2.1 基础知识6.2.2 重点案例&#xff1a;使用 Python 设置半…