云盘环境搭建及配置

这里的云盘项目,用到了fastdfs、nginx、fastcgi、mysql、redis等组件。这里先讲解环境搭建和配置的相关操作。

准备工作

先安装一些依赖工具。

apt-get install gcc
apt-get install g++
apt-get install build-essential
apt-get install libtool

注意sudo权限问题,后面不再提示。

nginx安装

依赖库安装

安装nginx之前,需要先安装几个库。
pcre库

wget https://sourceforge.net/projects/pcre/files/pcre/8.44/pcre-8.44.tar.gz
tar -zxvf pcre-8.44.tar.gz
cd pcre-8.44/
./configure
make
make install

zlib库

wget https://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
./configure
make
make install

openssl开发库

wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar -zxvf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g/
./config
make
make install

nginx安装与配置

wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar -zxvf nginx-1.16.1.tar.gz
cd nginx-1.16.1/
./configure
make
make install

默认情况下,Nginx被安装在⽬录/usr/local/nginx中。其中,nginx的配置⽂件存放于conf/nginx.conf,bin⽂件是位于sbin⽬录下的nginx⽂件。启动时输入sudo /usr/local/nginx/sbin/nginx,这时,会⾃动读取配置⽂件/usr/local/nginx/conf/nginx.conf
通过ps anop | grep nginx查看nginx进程信息。
打开浏览器访问此机器的IP,如果浏览器出现 Welcome to nginx! 则表示 nginx 已经安装并运⾏成功。
此外,还可以通过指定配置文件启动nginx。

sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

还可以测试配置信息

/usr/local/nginx/sbin/nginx -t

fastdfs安装

libfastcommon安装

安装fastdfs前,需要安装fastdfs所依赖的libfastcommon库。

git clone https://github.com/happyfish100/libfastcommon.git
cd libfastcommon
git checkout V1.0.50
./make.sh
./make.sh install

fastdfs安装与配置

先是安装

git clone https://github.com/happyfish100/fastdfs.git
cd fastdfs
git checkout V6.07
./make.sh && ./make.sh install

创建tracker 的存储⽇志和数据的根⽬录

mkdir -p /home/fastdfs/tracker
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
# 配置 tracker.conf
vim tracker.conf

在tracker.conf配置文件中主要修改base_path

# 启⽤配置⽂件(默认为 false,表示启⽤配置⽂件)
disabled=false
# Tracker 服务端⼝(默认为 22122)
port=22122
# 存储⽇志和数据的根⽬录
base_path=/home/fastdfs/tracker

接下来,配置storage

# 创建 Storage 的存储⽇志和数据的根⽬录
mkdir -p /home/fastdfs/storage
cd /etc/fdfs
cp storage.conf.sample storage.conf
# 配置 storage.conf
vim storage.conf

在storage.conf中主要修改base_path、store_path0、tracker_server

# 启⽤配置⽂件(默认为 false,表示启⽤配置⽂件)
disabled=false
# Storage 服务端⼝(默认为 23000)
port=23000
# 数据和⽇志⽂件存储根⽬录
base_path=/home/fastdfs/storage
# 存储路径,访问时路径为 M00
# store_path1 则为 M01,以此递增到 M99(如果配置了多个存储⽬录的话,这⾥只指定 1 个)
store_path0=/home/fastdfs/storage
# Tracker 服务器 IP 地址和端⼝,单机搭建时也不要写 127.0.0.1
# tracker_server 可以多次出现,如果有多个,则配置多个
tracker_server=120.27.131.197:22122
# 设置 HTTP 访问⽂件的端⼝。这个配置已经不⽤配置了,配置了也没什么⽤
# 这也是为何 Storage 服务器需要 Nginx 来提供 HTTP 访问的原因
http.server_port=8888

配置好后,启动tracker和storage 服务

# 启动 Tracker 服务
# 其它操作则把 start 改为 stop、restart、reload、status 即可。Storage服务相同
/etc/init.d/fdfs_trackerd start
# 启动 Storage 服务
/etc/init.d/fdfs_storaged start
# 可以通过 fdfs_monitor 查看集群的情况
# 查看 Storage 是否已经注册到 Tracker 服务器中
# 当查看到ACTIVE 表示成功
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

fdfs_trackerd的实际执⾏程序为/usr/bin/fdfs_trackerd,配置⽂件为/etc/fdfs/tracker.conf,这样后续我们也可以单台机器通过修改端⼝的⽅式去启动多个tracker。

上传与下载文件

# 修改 Tracker 服务器客户端配置⽂件
vim /etc/fdfs/client.conf

主要修改client.conf中的base_path和tracker_server

# 存储⽇志⽂件的基本路径
base_path=/home/fastdfs/tracker
# Tracker 服务器 IP 地址与端⼝号
tracker_server=120.27.131.197:22122

上传文件

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/test.txt

当返回⽂件 ID 号,如group1/M00/00/00/eBuDxWCb2qmAQ89yAAAAKeR1iIo162.txt则表示上传成功。
下载和删除也是类似,注意要写文件的路径和ID号

# 下载到本地,文件名是文件的ID号,不再是之前上传时的文件名
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/eBuDxWCb2qmAQ89yAAAAKeR1iIo162.txt

fdfs_delete_file /etc/fdfs/

client.conf group1/M00/00/00/eBuDxWCb2qmAQ89yAAAAKeR1iIo162.txt

fastdfs-nginx-module安装

接下来我们还会安装fastdfs与nginx交互的模块。⽬的如下:
storage 安装 nginx,为了提供 http 的访问和下载服务,同时解决 group 中 Storage 服务器的同步延迟问题。
tracker 安装nginx,主要是为了提供 http访问的反向代理、负载均衡以及缓存服务。

# 下载模块包
git clone https://github.com/happyfish100/fastdfs-nginx-module.git
cd fastdfs-nginx-module
git checkout V1.22

给nginx添加fastdfs模块

# 进⼊到nginx源码⽬录
cd nginx-1.16.1
# 等号后面是是刚才下载的的fastdfs_nginx_module模块的绝对路径,就是在编译nginx时候,连同这个模块⼀起编译。
./configure --add-module=/root/0voice/cloud-drive/fastdfs-nginx-module/src

给 nginx ⽬录下的 objs/Makefile ⽂件中增加头⽂件⽬录
./objs/MakefileALL_INCS项添加

-I /usr/include/fastdfs \
-I /usr/include/fastcommon \

然后,重新编译及安装nginx

make
make install

配置fastdfs-nginx-module文件
切换到fastdfs-nginx-module/src路径,将./mod_fastdfs.conf 拷⻉到/etc/fdfs/

 cp mod_fastdfs.conf /etc/fdfs/

然后,还需要对这个配置文件进行修改,主要修改tracker_server、url_have_group_name、store_path0。

# Tracker 服务器IP和端⼝修改
tracker_server=120.27.131.197:22122
# url 中是否包含 group 名称,改为 true,包含 group
url_have_group_name = true
# 配置 Storage 信息,修改 store_path0 的信息
store_path0=/home/fastdfs/storage
# 其它的⼀般默认即可,例如
base_path=/tmp
group_name=group1
storage_server_port=23000
store_path_count=1

复制fastdfs的部分配置⽂件到/etc/fdfs

# 在fastdfs源码目录下
cp conf/http.conf /etc/fdfs/
cp conf/mime.types /etc/fdfs/

此外,还要再配置nginx

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

配置为⽀持 group0-group9,以及 M00-M99,以便于以后扩容

location ~/group([0-9])/M([0-9])([0-9]) {
    ngx_fastdfs_module;
}

加在与其他location同样的位置即可。
之后重启nginx,然后就可以上传一个文件,然后用ip+port/location的方式访问进行测试。
注意如果有多个storage,每个storage都需要配置nginx模块,否则http下载不了。
至此,fastdfs单机环境搭建完毕。

单机环境搭建时的坑

先介绍一下个人在这个阶段踩过的坑。

版本问题

这是最主要的问题,后面在项目架设的时候还要再讨论这个问题。
这里主要是几个从git上下载源码的组件,要注意版本问题,可以先用git tag查看不同的版本信息,使用git checkout选择好相应的版本,因为一旦版本选择的不一样,在后期编译以及配置的时候会与文中所讲的操作不一样,如果所选版本比文中版本低,还有可能产生错误。

nginx启动异常的问题

在添加fastdfs-nginx-module模块并重新编译nginx后,启动nginx,出现worker进程起不来的情况,此时查看nginx进程信息,worker进程变成了master进程。这是因为启动nginx时,fastdfs没有启动,需要先启动tracker和storage,再启动nginx。

fastcgi安装

编译安装spawn-fcgi

wget http://download.lighttpd.net/spawn-fcgi/releases-1.6.x/spawnfcgi-1.6.4.tar.gz
tar -zxvf spawn-fcgi-1.6.4.tar.gz
cd spawn-fcgi-1.6.4/
./configure
make
make install

如果遇到以下错误

./autogen.sh: x: autoreconf: not found
因为没有安装automake⼯具,ubuntu⽤下⾯的命令安装即可

apt-get install autoconf automake libtool

编译安装fcgi

wget https://fossies.org/linux/www/old/fcgi-2.4.0.tar.gz --no-check-certificate
tar -zxvf fcgi-2.4.1-SNAP-0910052249.tar.gz
cd fcgi-2.4.1-SNAP-0910052249/
./configure
make
make install

给一段代码测试一下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "fcgi_stdio.h"
int main(int argc, char *argv[])
{
    int count = 0;
    //阻塞等待并监听某个端⼝,等待Nginx将数据发过来
    while (FCGI_Accept() >= 0)
    {
        //如果想得到数据,需要从stdin去读,实际上从Nginx上去读
        //如果想上传数据,需要往stdout写,实际上是给Nginx写数据
        printf("Content-type: text/html\r\n");
        printf("\r\n");
        printf("<title>Fast CGI Hello!</title>");
        printf("<h1>Fast CGI Hello!</h1>");
        //SERVER_NAME:得到server的host名称
        printf("Request number %d running on host <i>%s</i>\n",
        ++count, getenv("SERVER_NAME"));
    }
    return 0;
}

注意编译时带上相应库

gcc fcgi.c -o test -lfcgi

还可以在nginx中进行测试。在nginx.conf中加上

location /test {
    fastcgi_pass 127.0.0.1:8001;
    fastcgi_index test;
    include fastcgi.conf;
}

再重新加载nginx

/usr/local/nginx/sbin/nginx -s reload

可以在浏览器中ip:8001/test测试。

mysql安装

# 安装Mysql Server
apt-get install mysql-server
# 安装Mysql Client
apt-get install mysql-client
# 安装libmysqlclient
apt-get install libmysqlclient-dev

设置密码

如果安装mysql-server时没有提示设置root用户密码,得⼿动设置密码,否则数据库安全性不能保证。

use mysql;
update user set authentication_string=PASSWORD("123456") where user='root';
update user set plugin="mysql_native_password";
flush privileges;
quit;

注意8.0版本以后以上sql语句不再适用。需要使用

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

修改密码完成后,启动mysql,登录mysql进行测试

mysql -u root -p

输入密码,如果正常登录,则mysql安装成功。

创建用户并授权

为了确保安全性,我们不应该使用root用户进行操作,而应该另外创建一个用户再给其授予相应权限。

CREATE USER username@host IDENTIFIED BY password;

username:将创建的⽤户名
host:指定该⽤户在哪个主机上可以登陆,如果是本地⽤户可⽤localhost,如果想让该⽤户可以从任意远程主机登陆,可以使⽤通配符%,表示任意主机都可以
password:该⽤户的登陆密码,密码可以为空,如果为空则该⽤户可以不需要密码登陆服务器
范例CREATE USER 'darren'@'%' IDENTIFIED BY '123456';
接下来是授权

GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

privileges:⽤户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限,使⽤ALL
databasename:数据库名
tablename:表名,如果要授予该⽤户对所有数据库和表的相应操作权限则可⽤表示,如.*
设置darren⽤户拥有0voice_cloud_disk数据库所有权限
范例

GRANT ALL PRIVILEGES ON 0voice_cloud_disk.* TO 'darren'@'%';
FLUSH PRIVILEGES;

设置远程连接

如果需要其他机器连接本机的mysql,需要如下设置
修改配置文件

vi /etc/mysql/mysql.conf.d/mysqld.cnf

注释blind-address

#bind-address=127.0.0.1(默认是没有注释的)

然后还需要修改表中的远程连接,update修改user表中连接⽤户的字段值为’%’,此处以root⽤户为例。

update user set host='%' where user='root';

redis安装

#下载
wget http://download.redis.io/releases/redis-6.2.3.tar.gz
#解压
tar xzf redis-6.2.3.tar.gz
#进⼊redis-6.2.3⽬录并⽣成编译
cd redis-6.2.3/
make
make install

也可以使用apt-get install方式安装。

编译安装hiredis

cd redis-6.2.3/deps
make
make install

安装完成后,启动redis

redis-server

也可以查看redis版本信息

redis-server -v

后台启动redis

上面这种启动⽅式需要⼀直打开窗⼝,不能进⾏其他操作,不太⽅便。当然,也可以按ctrl+c来关闭窗⼝。下面介绍后台启动操作步骤
在/etc⽬录创建redis⽬录

mdkir /etc/redis

将编译⽬录(redis-6.2.3)下的redis.conf拷⻉到/etc/redis⽬录

cp redis.conf /etc/redis/6379.conf

修改/etc/redis/6379.conf⽂件将
daemonize no改为daemonize yes
再指定6379.conf⽂件启动

redis-server /etc/redis/6379.conf

通过ps命令查看redis的进程信息来查看是否启动成功。

Redis启动/关闭/重启

# 启动
redis-server /etc/redis/6379.conf
# 关闭
redis-cli shutdown
# 重启
redis-server restart

客户端连接

./redis-cli -h 127.0.0.1 -p 6379

至此,所有需要用到的组件已经准备完毕,下面开始真正部署云盘。

云盘部署

配置redis

注意绑定ip地址这一项,如果绑定的是127.0.0.1,那么客户端在连接的时候,就只能使用这个ip地址进行连接,换成本机自己的ip地址都不行,哪怕是本机连本机。

服务端部署

配置一个json文件

{
    "redis":
    {
        "ip": "127.0.0.1",
        "port": "6379"
    },

    "mysql":
    {
        "ip": "127.0.0.1",
        "port": "3306",
        "database": "0voice_cloud_disk",
        "user": "root",
        "password": "123456"
    },

    "dfs_path":
    {
        "client": "/etc/fdfs/client.conf"
    },

    "web_server":
    {
        "ip": "120.27.131.197",
        "port": "80"
    },

    "storage_web_server":
    {
        "ip": "120.27.131.197",
        "port": "80"
    }
}

这也可以看出客户端和服务端交互的协议。注意在开发过程中,客户端与服务端交互的协议,一般是由服务端开发人员提供的。
给项目中的sh文件添加执行权限,可以⽤⼀条命令执⾏

chmod a+x *.sh

配置fastcgi程序

这⾥其实是修改nginx.conf

location /login{
    fastcgi_pass 127.0.0.1:10000;
    include fastcgi.conf;
}

location /reg{
    fastcgi_pass 127.0.0.1:10001;
    include fastcgi.conf;
}

location /upload{
    fastcgi_pass 127.0.0.1:10002;
    include fastcgi.conf;
}

location /md5{
    fastcgi_pass 127.0.0.1:10003;
    include fastcgi.conf;
}

location /myfiles{
    fastcgi_pass 127.0.0.1:10004;
    include fastcgi.conf;
}

location /dealfile{
    fastcgi_pass 127.0.0.1:10005;
    include fastcgi.conf;
}

location /sharefiles{
    fastcgi_pass 127.0.0.1:10006;
    include fastcgi.conf;
}

location /dealsharefile{
    fastcgi_pass 127.0.0.1:10007;
    include fastcgi.conf;
}

配置完成后不要忘了重新启动一下nginx

/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

编译服务端程序

make clean
ldconfig
make

编译成功后就可以通过start.sh启动服务端了。

创建mysql库表

最后,将需要进行的数据库表相关创建操作完成。

source /home/milo/project/0voice_cloud_disk.sql #导⼊数据库,具体看⾃⼰存放的路径

至此,该项目全部搭建完成。

踩坑2

这一阶段,踩过的坑,一是刚才提到的redis地址的问题,另外还是版本问题。这里主要是mysql和redis版本,如果版本不一样,部分C接口会有变化,导致在测试时返回错误值,使得客户端在测试时返回错误信息。比如,redis版本不一致,注册账号成功,登录却失败,而且客户端收到的信息是用户名密码错误,实际上是版本不同导致token产生函数出错。

注意事项

这里再简单介绍一下值得注意的事。

store_path

可以发现,上传文件后,返回的文件路径包含M00,这个相当于软链接,指向store_path0的地址。fastdfs配置软链接的目的是为了集群中能配置多个盘。如果配置了多个store_path,那么就会有M01……
这里还要注意一下,如果配置了多个storage,每个storage都需要配置相同数量的store_path,否则storage与tracker的连接会被拒绝,导致无法正常提供上传下载服务。

版本选择

之前在踩坑中说了版本不一致的问题,这里再提示一下,对于上面用到的组件,最好是选择商用版本或是打了tag的版本,相对稳定一些。
对于一些开源组件,如果对代码不熟悉或是组件不出名,最好就不要使用,因为这些组件可能会存在一些问题,且维护较为困难。这也是选择组件时,选择社区活跃的组件的原因。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值