目录
- 服务器部分本来是管服务器的人装的,现在没有这部分的人所以自己就尝试这装一下。所有的过程都是按照网上的步骤一步一步来的,如果你安装过程中出现了一些问题。可能本文无法帮助到您。但是笔者出现的问题肯定会在文章介绍出来。
- 本文显示安装的http版本,后面在介绍http转型为https。笔者写的时候并不会安装,然后成功后又想弄成https但是博客改动起来好麻烦,按照前面说的,服务器也不是本职工作。整了一天才弄好。难死了就也懒得改动了。且好多博客都是安装的http的,其实我的https转型部分也有一些参考价值
阿里云——CentOS 7.7 64位
直接选择最新的下载就行,本文使用的版本号在【】内已经标明。
Common核心包【1.0.58】:https://github.com/happyfish100/libfastcommon/tags
FastDFS软件包【6.08】:https://github.com/happyfish100/fastdfs/tags
fastdfs-nginx重定向包【1.22】:https://github.com/happyfish100/fastdfs-nginx-module/tags
Nginx重定向工具【1.22.0】:http://nginx.org/en/download.html
#安装GCC-c++ yum -y install gcc-c++ #安装libevent库 yum -y install libevent #通过Xftp将文件上传到服务器上 我的位置是/usr/local/fastdfs
这个必须先安装,不然FastDFS安装会报路径不存在
#解压 tar -zxvf libfastcommon-1.0.58.tar.gz #进入解压文件 路径请根据自己的来 cd /usr/local/fastdfs/libfastcommon-1.0.58/ #编译与安装 ./make.sh ./make.sh install #安装号后就会提示你已经将一个叫libfastcommon.so文件创建在 /usr/lib64下【如图1】 #现在需要将这个文件放置在Liunx的标准路径下 /usr/lib # ---------------------------注意--------------------------- # 新版本创建的时候不仅会在/usr/lib64创建 也会在/usr/lib创建。所以无需辅助。如果需要复制运行以下代码 # cp /usr/lib64/libfastcommon.so /usr/lib
图1 安装libfastcommon的参数
#解压 tar -zxvf fastdfs-6.08.tar.gz #进入解压文件 路径请根据自己的来 cd /usr/local/fastdfs/fastdfs-6.08/ #编译与安装 【图2】 ./make.sh ./make.sh install # 此时查看 /etc/fdfs/文件夹出现了很多配置文件,但是对应原始的文件夹下缺少了一部分。 # 如果你需要nginx服务需要进行全部辅助过来。 # 我这里需要安装nginx所以选择全部拷贝 cp /usr/local/fastdfs/fastdfs-6.08/conf/* /etc/fdfs/ # 问我覆盖全部选覆盖 \> cp: overwrite ‘/etc/fdfs/client.conf’? y \> cp: overwrite ‘/etc/fdfs/storage.conf’? y \> cp: overwrite ‘/etc/fdfs/storage_ids.conf’? y \> cp: overwrite ‘/etc/fdfs/tracker.conf’? y # 创建一个存储路径 这个路径随意,用于存储。配置的时候需要用到这个路径。注意了 mkdir -p /home/fastDFS_data/tracker/ # 修改配置文件【修改内容查看图3】 vim /etc/fdfs/tracker.conf # 启动start 重启restart 关闭stop。修改末尾即可 fdfs_trackerd /etc/fdfs/tracker.conf start # 建议不是老油条暂时不要设置开机自启 小心开不了机。这里我也不尝试就不粘贴指令了
图2 安装FastDFS参数
图3 FastDFS需要修改的参数
笔者使用的是阿里云服务器,这一步请根据实际情况设置
笔者喜欢开启防火墙,如果平时测试都是关闭防火墙的这一步可以直接忽略
# 开启防护墙 systemctl start firewalld # 放开端口 firewall-cmd --zone=public --add-port=22122/tcp --permanent firewall-cmd --zone=public --add-port=23000/tcp --permanent # 重启防火墙 systemctl restart firewalld
# 创建一个存储路径 这个路径随意,用于存储。配置的时候需要用到这个路径。注意了 mkdir -p /home/fastDFS_data/storage # 修改配置文件【修改内容查看图4】 vim /etc/fdfs/storage.conf # 启动服务 fdfs_storaged /etc/fdfs/storage.conf start
图4 Storage需要修改的参数
这一步执行完毕后需要去你说设置的Storage目录下面查看是否创建对应的目录。如果失败可以看看日志。
# 将libfdfsclient.so拷贝到/usr/lib # 这一步对于没有的人用的,我这个版本已经创建好了 cp /usr/local/fastdfs/fastdfs-6.08/client/libfdfsclient.so /usr/lib # 创建一个存储路径 这个路径随意,用于存储。配置的时候需要用到这个路径。注意了 mkdir -p /home/fastDFS_data/client # 修改配置文件【修改内容查看图5】 vim /etc/fdfs/client.conf
图5 Client需要修改的参数
查看进程是否开启
netstat -unltp|grep fdfs
上传一个文件
fdfs_test /etc/fdfs/client.conf upload /home/img/123.jpg # 如果成功会跳出一大堆,其中重要的是能够出现以下内容 \> example file url: ~H~ttp://马赛克/group1/M00/00/00/ag5p7mLbzt-AV2bbAADg_skRKOk283_big.jpg # 最后需要确认下文件是否上传 cd /home/fastDFS_data/storage/data/00/00/ ll # ok我们看到我们上传的文件已经保存在当中了
至此安装fastDFS全部过程已经结束。如果你想修改端口22122与23000 都是可以通过tracker配置文件和storage配置文件进行修改的不是固定的。
Web服务使用的是Http或Https协议,这个协议fastDFS识别不了。需要专门有个东西来作为解释器来帮他翻译字节码文件。FastDFS作者提供了一个解释器为fastDFS-nginx。所以需要安装nginx
#安装PCRE、zlib、openssl #yum install -y pcre pcre-devel;yum install -y zlib zlib-devel;yum install -y openssl openssl-devel; yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel
# 解压文件 tar -zxvf fastdfs-nginx-module-1.22.tar.gz # 修改配置文件 vim /usr/local/fastdfs/fastdfs-nginx-module-1.22/src/config #修改内容为 将/usr/local/xxx ==> /usr/xxx # vim=> 表示当前属于vim语法 vim=>:%s/local\///g vim=>:wq
# 将配置文件拷贝到之前的配置文件目录 cp /usr/local/fastdfs/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf / etc/fdfs/ # 修改配置文件 vim /etc/fdfs/mod_fastdfs.conf
# 解压nginx tar -zxvf nginx-1.22.0.tar.gz # 进入niginx文件夹 cd /usr/local/fastdfs/nginx-1.22.0/ # 输入配置命令 这里一定要注意格式建议先准备个记事本编辑好然后复制粘贴进去 #./configure --add-module=[你的fastdfs-nginx的src的绝对路径] ./configure --add-module=/usr/local/fastdfs/fastdfs-nginx-module-1.22/src # 等待一堆not found # 编译 make # 出现以下内容安装成功 # 评论区说这里容易出错,解释说换成1.16版本以下就能成功 # 但是建议先找出错原因是在不行再换 > make[1]: Leaving directory '/usr/local/fastdfs/nginx-1.22.0' # 安装 make install # 进入安装目录 cd /usr/local/nginx/conf # 修改配置文件 配置文件见下方 vim nginx.conf
# 在原有的server里面随便找个空单,直接添加下面这句话就行了 server { # 如果访问路径为/group1/M00就将他直接转发给fastdfs-nginx处理而不是服务器处理 location ~/group1/M00{ ngx_fastdfs_module; } }
# 启动nginx cd /usr/local/nginx/sbin/ ./nginx # 查看服务是否启动 ps -aux | grep nginx > nginx: master process > nginx: worker process # 访问下之前的路径发现通过外网可以连接到对应的文件
没有出现worker线程或日志打印ERROR - file: ../tracker/fdfs_shared_func.c, line: 474, host "tracker" is invalid, error info: Unknown host
解决方法:
将传输的协议设置为加密协议
firewall-cmd --zone=public --add-port=443/tcp --permanent systemctl restart firewalld
# 首先准备好证书,笔者是阿里云的证书,直接下载nginx即可 # 进入nginx的conf目录,创建cert文件夹。然后将下载好的证书上传上去 cd /usr/local/nginx/conf/ mkdir cert # 解压文件 # 如果没有unzip先安装 yum install unzip unzip 马赛克_nginx.zip # 编辑nginx文件 配置内容如下 vim /usr/local/nginx/conf/nginx.conf
# ————————————————————————————此教程来源于阿里云官方教程———————————————————————————— # ————————————————————————————这些可以直接复制过去然后根据备注修改———————————————————————————— #以下属性中,以ssl开头的属性表示与证书配置有关。 server { #配置HTTPS的默认访问端口为443。 #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。 #【需要修改】如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。 listen 443 ssl; #【需要修改】需要将yourdomain替换成证书绑定的域名。 server_name yourdomain; root html; index index.html index.htm; # 【需要修改】 注意cert-file-name修改成你的证书的完整名称 我的是 数字_域名_nginx ssl_certificate cert/cert-file-name.pem; ssl_certificate_key cert/cert-file-name.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #表示使用的加密套件的类型。 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。 ssl_prefer_server_ciphers on; location / { root html; #Web网站程序存放目录。 index index.html index.htm; } # 这里是你的fastFDS服务 # 如果访问路径为/group1/M00就将他直接转发给fastdfs-nginx处理而不是服务器处理 location ~/group1/M00/{ ngx_fastdfs_module; } # 这一坨我建议带上 这样可以重定向到一个默认的页面 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # ————————————————————————————可选项———————————————————————————— # 如果您希望所有的HTTP访问自动跳转到HTTPS页面,则可以在需要跳转的HTTP站点下添加以下rewrite语句 # nginx自带一个80 我的建议是直接覆盖全部只留下这些 server { listen 80; # 【需要修改】需要将yourdomain替换成证书绑定的域名。 server_name yourdomain; rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。 location / { index index.html index.htm; } }
如果重启Nginx服务时收到报错,您可以使用以下方法进行排查:
类似问题有很多可能,几乎都是格式不正确。根据提示改就行``
之后就是重新编译安装的过程
# 第一步一定是查看nginx是否启动,并直接杀死nginx线程。这里不关闭后面可能会出现成功了但是没完成 # 成功的特殊壮举。因为已经配置了上面部分,自带的关闭会报错还是使用kill方便 # 根据work与master的端口号进行kill。 ps -aux|grep nginx # 杀死进程后进入你的nginx路径中 cd /usr/local/fastdfs/nginx-1.22.0/ # 重新编译与安装 # 注意--add-module=后面的路径要和你fastdfs-nginx位置相同 # 注意--prefix=/usr/local/nginx 不是--prefix=/usr/local/nginx/ 看的那篇文章坑死人了 ./configure --prefix=/usr/local/nginx --add-module=/usr/local/fastdfs/fastdfs-nginx-module-1.22/src --with-http_ssl_module make make install # 进入nginx安装后的目录 cd /usr/local/nginx/sbin/ # 启动nginx ./nginx # 返回进程号 查看是否正常启动。如果不是两个进程查看上面http部分安装的可能问题。但是 # 一路看下来应该不会再出错了 > nginx: master process > nginx: worker process # 最后再浏览器上访问 https://域名 出现以下图完美成功
# 进入配置文件目录 cd /etc/fdfs/ # 修改 将http.server_port设置为443 这里不再阐述怎么修改 #重启服务 fdfs_trackerd /etc/fdfs/tracker.conf restart;fdfs_storaged /etc/fdfs/storage restart # 查看是否开启 netstat -unltp|grep fdfs # 看见两个都是开启的,尝试下上传文件 fdfs_test /etc/fdfs/client.conf upload /home/img/123.jpg # 上传成功,配置没有问题。尝试访问返回的图片,将开头改成https://域名//group1.... # 完美显示
到这里你已经完美实现了搭建FastDFS服务。芜湖!!!!!!!!!!
开个玩笑,之前以为服务有问题删除了准备重装,谁知道是自己搞错了。写都写了懒得删了
# 停止服务 service fdfs_trackerd stop;service fdfs_storaged stop; # 查看pid ps -ef | grep fdfs # 杀死进程 xxxx是你查询的结果 kill xxxx # 删除本地存储的配置和日志路径 这个是你配置文件里面的路径。 # 注意删除的范围 rm -rf /home/fastDFS_data/* # 剩下就是疯狂删除 # 删除默认的安装目录 即你的解压的文件在哪里。 rm -rf /etc/fdfs # 剩下的几乎大家都是一样的,应该都没有动过。可以直接运行。直接删除全部 rm -rf /usr/bin/fdfs_*;rm -rf /usr/bin/stop.sh/rm -rf /usr/bin/restart.sh;rm -rf /usr/include/fastdfs;rm -rf /usr/include/fastcommon;rm -rf /usr/lib64/libfdfsclient*;rm -rf /usr/lib/libfdfsclient*;
来到熟悉的代码环节,首先是依赖的注入。
官方的那个导不进去 另一个又各种安全漏洞。所以最后还是选这个
<!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java --> <dependency> <groupId>net.oschina.zcx7878</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.27.0.0</version> </dependency>
首先需要准备一个配置文件。取名为xxxx.conf
即可。我这里取名为fdfs.conf
。配置的内容如下
# 超时时间 connect_timeout = 10 network_timeout = 30 # 编码字符集 charset = UTF-8 # tracker 服务器的 IP 和端口 tracker_server = 你的tracker地址:22122
配置号后将改文件放置在你的resources
文件夹下即可
之后就是直接粘贴上我的工具包。直接通过调用方法使用即可
/** * 该类用于FastDFS服务的操作工具类 * @author musiro * @version 0.1 * @date 2022/7/24 */ @Slf4j public final class FastDFSUtil { private static final StorageClient CLIENT; /** * 禁止实例化 */ private FastDFSUtil() {} static { try { ClientGlobal.init("fdfs.conf"); TrackerClient trackerClient = new TrackerClient(ClientGlobal.g_tracker_group); TrackerServer trackerServer = trackerClient.getConnection(); StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer); CLIENT = new StorageClient(trackerServer, storeStorage); } catch (IOException | MyException e) { throw new RuntimeException(e); } } /** * 获取客户端信息 * @return 客户端信息 */ private static StorageClient getClientInfo(){ return CLIENT; } /** * 上传文件[无法分段上传] * @param fileName 文件名--不需要带后缀 * @param ext 文件后缀 * @param bytes 二进制文件 * @return 参数 * <ul> * <li>结果[0]: 组名 例如:group1</li> * <li>结果[1]: 保存服务器的位置 例如:M01/00/00/rBNTRGGKX7aEG67qAAAAAIpTlYQ431.jpg</li> * </ul> * @throws InterruptedException * @throws MyException * @throws IOException */ public static String[] upload(String fileName,String ext,byte[] bytes) throws MyException, IOException { //获取连接 StorageClient connection = getClientInfo(); //设置文件介绍 NameValuePair[] pair = new NameValuePair[3]; pair[0] = new NameValuePair("fileName",fileName); pair[1] = new NameValuePair("fileExt",ext); pair[2] = new NameValuePair("fileSize",String.valueOf(bytes.length)); //上传文件 String[] strings = connection.upload_file(bytes, ext, pair); //返回具体需要的参数 return strings; } /** * 此方法只适用于本地测试使用,Springboot方法可以使用另一个方法 * @param path 图片路径 * @param ext 文件 * @param fileName 文件名称 * @return * <ul> * <li>结果[0]: 组名 例如:group1</li> * <li>结果[1]: 保存服务器的位置 例如:M01/00/00/rBNTRGGKX7aEG67qAAAAAIpTlYQ431.jpg</li> * </ul> * @throws MyException * @throws IOException */ public static String[] upload(String path,String ext,String fileName) throws MyException, IOException { //获取连接 StorageClient connection = getClientInfo(); //设置文件介绍 NameValuePair[] pair = new NameValuePair[3]; pair[0] = new NameValuePair("fileName",fileName); pair[1] = new NameValuePair("fileExt",ext); pair[2] = new NameValuePair("fileSize",Long.toBinaryString(new File(path).length())); //上传文件 String[] strings = connection.upload_file(path, ext, pair); //返回具体需要的参数 return strings; } /** * 文件下载 * @param groupName 组名 例如:group1 * @param path 完整路径 例如:M01/00/00/rBNTRGGKX7aEG67qAAAAAIpTlYQ431.jpg * @return 文件流 * @throws InterruptedException * @throws MyException * @throws IOException */ public static byte[] download(String groupName,String path) throws InterruptedException, MyException, IOException { //获取连接 StorageClient connection = getClientInfo(); //下载文件 byte[] res = connection.download_file(groupName,path); //返回文件流 return res; } /** * 删除文件 * @param groupName 组名 例如:group1 * @param path 完整路径 例如:M01/00/00/rBNTRGGKX7aEG67qAAAAAIpTlYQ431.jpg * @throws InterruptedException * @throws MyException * @throws IOException */ public static void delete(String groupName,String path) throws MyException, IOException { //获取连接 StorageClient connection = getClientInfo(); //下载文件 connection.delete_file(groupName,path); } }