1. 安装fastDFS
- 安装libevent
ubuntu下
1
| sudo apt-get install libevent-dev
|
centos下
- 如果没有gcc(gcc -v没有打印版本)那么要安装gcc
1 2
| sudo apt install gcc sudo apt install build-essential
|
centos使用yum install
- 如果没有unzip要安装unzip
ubuntu下
centos下
1
| yum install -y unzip zip
|
- 安装libfastcommon-master
1 2 3 4
| unzip libfastcommon-master.zip cd libfastcommon-master ./make.sh ./make.sh install
|
- 回到压缩包的目录,开始安装fastdfs
1 2 3 4
| tar -zxvf FastDFS_v5.08.tar.gz cd FastDFS ./make.sh ./make.sh install
|
- 检验是否安装成功
输入下面命令有fdfs_trackerd
和fdfs_storaged
两条记录显示就成功
1
| ll /etc/init.d/ | grep fdfs
|
查看是否有3个模板
tarcker.conf.sample
是tracker的配置文件模板
storage.conf.sample
是storage的配置文件模板
client.conf.sample
是客户端的配置文件模板
- 配置并启动
先看tracker,storage同理
1 2
| cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf vim /etc/fdfs/tracker.conf
|
修改base_path为你想要存放的路径(我这里是/home/wjw/fastdfs/tracker)
1
| base_path=/home/wjw/fastdfs/tracker
|
自己建立好这个文件夹
storage同理
1 2
| cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf vim /etc/fdfs/storage.conf
|
修改的内容如下
1 2 3 4 5
| base_path=/home/wjw/fastdfs/storage # 数据和日志文件存储根目录
store_path0=/home/wjw/fastdfs/storage # 第一个存储目录
tracker_server=192.168.72.128:22122 # tracker服务器IP和端口
|
自己建立好这个文件夹
开启服务
ubuntu
1 2
| fdfs_trackerd /etc/fdfs/tracker.conf start fdfs_storaged /etc/fdfs/storage.conf start
|
centos
1 2
| service fdfs_trackerd start service fdfs_storaged start
|
- 如果开启服务报错可以试试先关闭防火墙再开启服务
ubuntu
centos
- 检查是否启动成功:
- 设置服务开机自启动:
ubuntu比较复杂,尤其是对于安装了图形桌面版,一登陆默认是非root
下面给出最标准的解决方案
1
| vi /lib/systemd/system/rc.local.service
|
修改结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [Unit] Description=/etc/rc.local Compatibility Documentation=man:systemd-rc-local-generator(8) ConditionFileIsExecutable=/etc/rc.local After=network.target
[Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 RemainAfterExit=yes GuessMainPID=no
#自己添加这一段 [Install] WantedBy=multi-user.target Alias=rc-local.service
|
退出vi后执行
1
| ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/rc.local.service
|
编辑这个(可能原来是空的,没关系)
大胆复制粘贴
1 2 3 4
| #!/bin/bash fdfs_trackerd /etc/fdfs/tracker.conf start fdfs_storaged /etc/fdfs/storage.conf start exit 0
|
编辑完成退出vi后添加权限
1
| sudo chmod +x /etc/rc.local
|
可以了
centos比较简单
1 2
| chkconfig fdfs_trackerd on chkconfig fdfs_storaged on
|
2. 安装fastdfs-nginx模块
- 解压之前从网盘下载的这个文件,进入,编辑配置文件
1 2 3
| tar -zxvf fastdfs-nginx-module_v1.16.tar.gz cd fastdfs-nginx-module/src/ vim config
|
- 使用替换命令(不需要进入插入模式,直接复制粘贴回车一气呵成)
- 设置关联,把当前文件夹下的mod_fastdfs.conf文件复制到/etc/fdfs/
1
| cp mod_fastdfs.conf /etc/fdfs/
|
1
| vi /etc/fdfs/mod_fastdfs.conf
|
修改结果
1 2 3 4 5 6 7
| connect_timeout=20 # 客户端访问文件连接超时时长(单位:秒)
tracker_server=192.168.72.128:22122 # tracker服务IP和端口
url_have_group_name=true # 访问链接前缀加上组名
store_path0=/home/wjw/fastdfs/storage # 文件存储路径
|
回到网盘下载好那几个压缩包的目录(只能这么描述了,你们放在哪里自己清楚),进入FastDFS文件夹的conf文件夹
1 2
| cd FastFDS/conf/ cp http.conf mime.types /etc/fdfs/
|
3. 安装nginx并绑定fastdfs的nginx模块
我这里已经安装过nginx了,如果没有的话我建议手动下载gzip安装而不是apt安装,因为后期要添加模块的话只能修改完模块后重新make,而apt安装就不可以做到(像我一样apt安装的就很麻烦,不仅目录乱而且还是要下载gz包添加模块)
我随便找个教程吧(百度第一个,我没试过)
https://blog.csdn.net/qq_23832313/article/details/83578836
而我的目录非常混乱,当事人非常后悔:
- /usr/bin 启动文件
- /opt/nginx 配置文件
- /usr/local 安装文件(原始的配置文件,不要动它)
使用命令可以查看是否安装好nginx
不管是否已经安装好,想添加模块都需要在下载好的nginx目录下执行要添加的模块,然后重新make(add-module后面是第二步解压好的fastdfs-nginx-module那个路径),大家要注意改成自己的目录
1
| ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/home/wjw/Desktop/fastfds/fastdfs-nginx-module/src/
|
备份
1
| mv /usr/bin/nginx /usr/bin/nginx-bak
|
替换原本的nginx启动文件,注意改成自己的目录
修改配置文件,注意改成自己的目录
1
| vim /opt/nginx/conf/nginx.conf
|
将原来的监听80端口改成如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| server { listen 80; server_name image.upload.com;
location ~/group([0-9])/ { ngx_fastdfs_module; }
location / { root html; index index.html index.htm; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
|
启动,进入/usr/bin目录,注意改成自己的目录,执行
通过命令看是否启动成功
设置开机启动,网上的很多ubuntu设置开机启动都是有问题的
先看centos操作
一个空文件?没关系 复制以下内容,注意一下nginx=”/usr/bin/nginx”和NGINX_CONF_FILE=”/opt/nginx/conf/nginx.conf”这两句要对应自己的目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: NGINX is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid
# Source function library. . /etc/rc.d/init.d/functions
# Source networking configuration. . /etc/sysconfig/network
# Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/bin/nginx" prog=$(basename $nginx)
NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() { # make required directories user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` if [ -n "$user" ]; then if [ -z "`grep $user /etc/passwd`" ]; then useradd -M -s /bin/nologin $user fi options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done fi }
start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval }
stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval }
restart() { configtest || return $? stop sleep 1 start }
reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo }
force_reload() { restart }
configtest() { $nginx -t -c $NGINX_CONF_FILE }
rh_status() { status $prog }
rh_status_q() { rh_status >/dev/null 2>&1 }
case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
|
修改权限
1 2
| # 修改权限 chmod 777 /etc/init.d/nginx
|
设置开机启动
1 2
| chkconfig --add /etc/init.d/nginx chkconfig nginx on
|
再看ubuntu操作
网上很多方法比如安装什么sysv,我亲测无效,然后看到这篇博客
https://www.cnblogs.com/hellxz/p/9441949.html
亲测有效,不过原博客似乎漏了修改权限的操作
1
| sudo vim /etc/init.d/nginx.sh
|
空文件?没关系,复制下面这段,/usr/bin/nginx改成自己的启动文件下的nginx,/opt/nginx/conf/nginx.conf改成自己的配置文件下的nginx.conf,然后修改成自己的登录密码
1 2 3 4 5 6
| #!/bin/bash #auto run nginx when system startup sudo -S /usr/bin/nginx -c /opt/nginx/conf/nginx.conf << EOF 登录密码 EOF exit 0
|
修改权限(原文忘了这点,要加上)
1
| chmod 777 /etc/init.d/nginx.sh
|
添加开机重启
1
| sudo update-rc.d nginx.sh defaults
|
4. java端需要进行的操作
- 依赖
1 2 3 4 5
| <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.2</version> </dependency>
|
- 配置类
1 2 3 4 5 6 7
| @Configuration @Import(FdfsClientConfig.class) // 解决jmx重复注册bean的问题 @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) public class FastClientImporter { }
|
- yml
1 2 3 4 5 6 7 8
| fdfs: so-timeout: 1501 connect-timeout: 601 thumb-image: width: 60 height: 60 tracker-list: - 192.168.72.128:22122
|
- 测试类
在G盘根目录下准备一张测试用图1.jpg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| @SpringBootTest @RunWith(SpringRunner.class) public class FastDFSTest {
@Autowired private FastFileStorageClient storageClient;
@Autowired private ThumbImageConfig thumbImageConfig;
@Test public void testUpload() throws FileNotFoundException { File file = new File("G:\\1.jpg"); StorePath storePath = this.storageClient.uploadFile( new FileInputStream(file), file.length(), "jpg", null); System.out.println(storePath.getFullPath()); System.out.println(storePath.getPath()); }
@Test public void testUploadAndCreateThumb() throws FileNotFoundException { File file = new File("G:\\1.jpg"); StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage( new FileInputStream(file), file.length(), "png", null); System.out.println(storePath.getFullPath()); System.out.println(storePath.getPath()); String path = thumbImageConfig.getThumbImagePath(storePath.getPath()); System.out.println(path); } }
|
我们可以看到getFullPath()打印了组信息,这时候服务器上已经有了上传的图片
浏览器可以通过http://192.168.72.128/group1/M00/00/00/wKhIgF78pUCAPLLYAACFQPZnSLk185.jpg访问到服务器的图片,也就是服务器ip+getFullPath()打印的信息
如果是前端传入的图片,那么应该是MultipartFile file这个类型的
也是一样调用uploadImageAndCrtThumbImage方法,获得相同的参数即可(getInputStream可以获得流,getOriginalFilename经过切割可以获得后缀名,具体操作如下)
1 2
| String originalFilename = file.getOriginalFilename(); StorePath path = this.storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), StringUtils.substringAfterLast(originalFilename, "."), null);
|