我是靠谱客的博主 爱笑哈密瓜,最近开发中收集的这篇文章主要介绍记一次配置FastDFS的各种踩坑过程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

记一次配置FastDFS的各种踩坑过程

    • 1. 编译fastDFS中的 undefined reference to ''g_exe_name
    • 2. 将fastDFS与整合nginx,但是无法访问上传的资源,日志中有显示"Permission denied"
    • 3. FdfsConnectException: 无法获取服务器连接资源,can't create connection to /ip:22122 with root cause part1
            • 3.1 第三方云服务的安全组
    • 4. FdfsUnavailableException: 无法获取服务端连接资源:找不到可用的tracker
    • 5. Nginx 重启后[emerg] open() "/var/run/nginx/nginx.pid" failed的错误
    • 6. FdfsConnectException: 无法获取服务器连接资源,can't create connection to /ip:22122 with root cause part2
            • 6. 1服务的请求和读取超时时间
    • 7. 总结




在网上学了一门课,里面用到了fastDFS,虽然不太会分布式,但是觉得照着课程配置一下应该没有问题,抱着试试的心态学了一下,结果即使有教程,即使是只用一台机器依然疯狂踩坑,,,


1. 编译fastDFS中的 undefined reference to ''g_exe_name

刚一下来安装包,编译的时候就出现了问题,undefined reference to ''g_exe_name。
经过查找作者有在issue里解答过,这是因为之前编译失败后,必须要使用make clean 清理环境。

https://github.com/happyfish100/fastdfs/issues/133


2. 将fastDFS与整合nginx,但是无法访问上传的资源,日志中有显示"Permission denied"

安装fastDFS之后,按照网课老师的教程也很顺利的通过fastdfs_test做了upload的测试。同时也安装了nginx,并且很自然的可以访问普通配置的nginx。

但是再添加fastdfs-nginx-module之后,有一次荣幸踩坑了。经过几个小时的查找资料以及查看nginx的error log之后才解决。首先是配置nginx 的log,之后在log中发现:

[2020-10-18 03:29:24] ERROR - file: ../storage/trunk_mgr/trunk_shared.c, line: 181, "Permission denied" can't be accessed, error info: /home/ec2-user/FastDFS/fastdfs-log-files/tmp

开始的时候,我就想到了是permission的问题,但是把相关的folder都改成777也不好使。结果最后老老实实照着网课老师的配置路径完全一样的写了一遍,结果就好了,,,这是因为我配置mod_fastdfs.conf的时候配置的log路径是/home/ec2-user/FastDFS/fastdfs-log-files/tmp,而这个路径似乎不能通过网络访问,而老师配置的是/usr/local/fastdfs/tmp,所以可以访问,这时之后还需要再学习的关于linux的文件系统访问权限的东西,算是狠狠的摔了一跤。

这里说的配置就是各种fastdfs中各种conf文件保存log的参数,比如mod_fastdfs.conf中

base_path=/usr/local/fastdfs/tmp
......
store_path0=/usr/local/fastdfs/storage

以及tracker.conf和storage.conf的base_path和store_path0参数,这些路径必须是可以通过外部网络访问的。

在找资料的过程中,总结各种大佬强调的问题:1. 就是一个是tracker_server,storage_path必须要一致。2. 就是如果你使用第三方云,那么tracker_server的ip一定要是公网,而不是内部ip。3. 就是mod_fastdfs.conf一定要存在在对应的路径上,并且配置正确,否则nginx是无法整合fastDFS的。

不过很可惜这些坑我都没踩,最后是因为linux基础知识薄弱踩了别的坑,,,



3. FdfsConnectException: 无法获取服务器连接资源,can’t create connection to /ip:22122 with root cause part1

接下来当然是在spring boot的应用中调用好不容易搭建好的fastDFS服务器,然而又踩坑了。

首先出现的错误是:

2020-10-18 15:57:35.631 [http-nio-8004-exec-4] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.github.tobato.fastdfs.exception.FdfsConnectException: 无法获取服务端连接资源:can't create connection to/3.15.159.229:22122] with root cause
3.1 第三方云服务的安全组

在github的issue里还是可以找到一些关于无法获取连接资源的问题的,总结起来就是ip要是公共的,不管你是本地,是第三方云还是docker,都必须是public ip。当然,这很明显不是我踩坑的地方。

在看到一个这个sdk的作者在issue里面说到你至少要ping通你的ip。
https://github.com/tobato/FastDFS_Client/issues/37

这点启发了我,虽然我的ec2实例的端口都是打开的,但是经过测试发现并不能ping通,这里体现了我这种尝试转行的同学网络基础为零,,,

还好这种经典问题,StackOverflow肯定有答案,https://stackoverflow.com/questions/21981796/cannot-ping-aws-ec2-instance。大意就是你需要打开,ICMP的echo request,同时你自己的机器也要打开对应的ICMP。

调整之后终于ping通了,但是又出现了一个新的问题,而且这个无法连接资源的问题实际上并没有解决。



4. FdfsUnavailableException: 无法获取服务端连接资源:找不到可用的tracker

2020-10-18 16:43:44.349 [http-nio-8004-exec-5] ERROR c.g.t.f.d.conn.FdfsConnectionManager - Unable to borrow buffer from pool
com.github.tobato.fastdfs.exception.FdfsUnavailableException: 无法获取服务端连接资源:找不到可用的tracker /3.15.159.229:22122

这其实是另一个问题,但是再遇到这个问题的时候前面的问题实际上还没最终解决,,,

对于这个问题,我查阅的issue和别人的回答都是说防火墙的问题,在学习了防火墙,并reboot实例之后,这个问题就没有了。附上几个链接。

https://blog.csdn.net/tphou/article/details/79433536

https://blog.csdn.net/baidu_36124158/article/details/90603496?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param


5. Nginx 重启后[emerg] open() “/var/run/nginx/nginx.pid” failed的错误

这个问题的资料很多,最简单的方法主要就是需要手动添加/var/run/nginx就可以了。

sudo mkdir -p /var/run/niginx



6. FdfsConnectException: 无法获取服务器连接资源,can’t create connection to /ip:22122 with root cause part2

经过了一两个小时解决了前面两个问题之后,老问题又出现了,依然无法获取服务器连接资源,这个时候我已经搞了五个小时以上了,,,在有教程的情况下,仍然连最简单的单体服务器都配不明白。。。

6. 1服务的请求和读取超时时间

最后终于在看log的时候突发奇想。

2020-10-18 15:57:35.631 [http-nio-8004-exec-4] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.github.tobato.fastdfs.exception.FdfsConnectException: 无法获取服务端连接资源:can't create connection to/3.15.159.229:22122] with root cause
java.net.SocketTimeoutException: connect timed out

这个timed out的意思会不会只是留给app访问服务器的时间不够呢?查看application.yml之后发现果然timed out的时间很短,只有30 ms 。。。这对于不是本地的资源来说时间有可能太短了。

fdfs:
  connect-timeout: 3000  
  so-timeout: 3000        
  tracker-list: 3.15.159.229:22:122   

修改到3000之后,终于可以成功运行了。所以log里面的每一个字都很重要啊,,,如果不看下面这一行字,恐怕这辈子我这个app也没办法成功访问这个服务器了。


7. 总结

一门网课就暴露出了太多基础的问题,老师配置服务器的这不到一个小时,我却花了接近十个小时的时间去调试,确实很搞心态。另外这次经历暴露了太多linux,网路方面欠缺的知识,而且这只是fastDFS单机的配置,要学的东西真的太多了。

最后

以上就是爱笑哈密瓜为你收集整理的记一次配置FastDFS的各种踩坑过程的全部内容,希望文章能够帮你解决记一次配置FastDFS的各种踩坑过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部