这里的云盘项目,用到了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/Makefile
中ALL_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的版本,相对稳定一些。
对于一些开源组件,如果对代码不熟悉或是组件不出名,最好就不要使用,因为这些组件可能会存在一些问题,且维护较为困难。这也是选择组件时,选择社区活跃的组件的原因。