目录
1. 文件上传下载流程
2. Nginx和fastDFS的整合
3. 数据库表
3.1 数据库操
3.2 数据库建表
1. 文件上传下载流程
fileID 需要是一个哈希来判定。
2. 文件下载流程
3. 优化
1. 客户端发送请求使用的协议 : httpfastDFS 能不能解析 http 协议nginx能解析 http 协议在 nginx 中安装 fastDFS 的插件2. 客户端怎么知道文件就存储在对应的那个存储节点上 ?上传的时候将 fileID 和存储节点 IP 地址都进行存储
2. Nginx和fastDFS的整合
1. 在存储节点上安装Nginx, 将软件安装包拷贝到fastDFS存储节点对应的主机上
# 1. 找 fastDFS 的存储节点# 2. 在存储节点对应的主机上安装 Nginx, 安装的时候需要一并将插件装上# - ( 余庆提供插件的代码 + nginx 的源代码 ) * 交叉编译 = Nginx
2. 在存储节点对应的主机上安装Nginx, 作为web服务器
- fastdfs-nginx-module_v1.16.tar.gz 解压缩# 1. 进入 nginx的源码安装目录 /home/lixiaoxiang/packages/nginx-1.10.1# 2. 检测环境 , 生成 makefile./configure --add-module = fastdfs 插件的源码目录 /srcmakesudo make install
make过程中的错误
# 1. fatal error: fdfs_define.h: No such file or directory# 2. fatal error: common_define.h: No such file or directorydefault: buildclean:rm -rf Makefile objsbuild:$(MAKE) -f objs/Makefileinstall:$(MAKE) -f objs/Makefile installmodules:$(MAKE) -f objs/Makefile modulesupgrade:/usr/local/nginx/sbin/nginx -tkill -USR2 `cat /usr/local/nginx/logs/nginx.pid`sleep 1test -f /usr/local/nginx/logs/nginx.pid.oldbinkill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`# 解决方案 - 修改 objs/MakefileALL_INCS = -I src/core \-I src/event \-I src/event/modules \-I src/os/unix \-I /usr/local/include/fastdfs \-I /usr/local/include/fastcommon/ \-I objs \-I src/http \-I src/http/modules\-I /usr/include/fastdfs/
3. 安装成功, 启动Nginx, 发现没有 worker进程
lixiaoxiang@ubuntu:/usr/local/nginx/sbin $ ps aux|grep nginxroot 65111 0 .0 0 .0 39200 696 ?Ss 10 :32 0 :00 nginx: master process./nginxrobin 65114 0 .0 0 .0 16272 928 pts/9 S + 10 :32 0 :00 grep --color = autonginx
找nginx的logs日志
# ERROR - file: shared_func.c, line: 968, file /etc/fdfs/mod_fastdfs.conf not exist# 从哪儿找 -> fastDFS 插件目录中找robin@OS:~/package/nginx/fastdfs-nginx-module/src $ tree.├── common.c├── common.h├── config├── mod_fastdfs.conf -> cp /etc/fdfs└── ngx_http_fastdfs_module.c0 directories, 5 files
需要修改mod_fdfs.conf (etc/fdfs)文件, 参数当前存储节点的storage.conf进行修改
# 存储 log 日志的目录base_path=/home/robin/fastdfs/storage# 连接 tracker 地址信息tracker_server = 192 .168.91.130:22122# 存储节点绑定的端口storage_server_port = 23000# 当前存储节点所属的组group_name = group1# 客户端下载文件的时候 , 这个下载的 url 中是不是包含组的名字// 上传的 fileID: group1/M00/00/00/wKj3h1vJRPeAA9KEAAAIZMjR0rI076.cpp// 完整的 url: http://192.168.1.100/group1/M00/00/00/wKj3h1vJRPeAA9KEAAAIZMjR0rI076.cppurl_have_group_name = true# 存储节点上存储路径的个数store_path_count = 1# 存储路径的详细信息store_path0=/home/robin/fastdfs/storage
# ERROR - file: ini_file_reader.c, line: 631, include file "http.conf" not exists,line: "#include http.conf"从 /etc/fdfs 下找的时候不存在- 从 fastDFS 源码安装目录找 /conf- sudo cp http.conf /etc/fdfs#lixiaoxiang@ubuntu:~/packages/fastdfs-5.10/conf$ sudo cp http.conf /etc/fdfs/
# ERROR - file: shared_func.c, line: 968, file /etc/fdfs/mime.types not exist- 从 nginx 的源码安装包中找 /conf- sudo cp mime.types /etc/fdfs#lixiaoxiang@ubuntu:~/packages/nginx-1.10.1/conf$ sudo cp mime.types /etc/fdfs/
5. 通过浏览器请求服务器下载文件: 404 Not Found
http://192.168.1.100/group1/M00/00/00/wKj3h1vJRPeAA9KEAAAIZMjR0rI076.jpg# 错误信息open() "/usr/local/nginx/zyFile2/group1/M00/00/00/wKj3h1vJSOqAM6RHAAvqH_kipG8229.jpg"failed (2: No such file or directory), client: 192.168.247.1, server: localhost,request: "GET /group1/M00/00/00/wKj3h1vJSOqAM6RHAAvqH_kipG8229.jpg HTTP/1.1", host:"192.168.247.135"服务器在查找资源时候 , 找的位置不对 , 需要给服务器指定一个正确的位置 , 如何指定 ?
- 资源在哪 ? ====> 在存储节点的存储目录中 store_path0- 如何告诉服务器资源在这 ? =====> 在服务器端添加 location 处理locatioin /group1/M00/00/00/wKj3h1vJSOqAM6RHAAvqH_kipG8229.jpglocation /group1/M00/00/00/location /group1/M00/location /group1/M00/{# 告诉服务器资源的位置root /home/robin/fastdfs/storage/data;#关键字ngx_fastdfs_module;}
项目遇到的问题:
一直无法加载到图片,最后发现mod_fdfs.conf 里面store_path0=/home/robin/fastdfs/storage 路径协程了 fastfds 错误,导致加载不出来。花了一个小时,最后想起来看日志信息。发现里面的路径不对,修改了 了路径就可以了
3. 数据库表
3.1 数据库操
1. 创建一个名称为cloud_disk的数据库
CREATE DATABASE cloud_disk;
drop database cloud_disk;
use cloud_disk;
3.2 数据库建表
1. 用户信息表 -- user
CREATE TABLE user (id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT ,name VARCHAR ( 128 ) NOT NULL ,nickname VARCHAR ( 128 ) NOT NULL ,password VARCHAR ( 128 ) NOT NULL ,phone VARCHAR ( 15 ) NOT NULL ,createtime VARCHAR ( 128 ),email VARCHAR ( 100 ),CONSTRAINT uq_nickname UNIQUE (nickname),CONSTRAINT uq_name UNIQUE (NAME));
2. 文件信息表 - user_file_list
CREATE TABLE user_file_list (user VARCHAR ( 128 ) NOT NULL ,md5 VARCHAR ( 200 ) NOT NULL ,createtime VARCHAR ( 128 ),filename VARCHAR ( 128 ),shared_status INT ,pv INT);
CREATE TABLE user_file_list (user VARCHAR ( 128 ) NOT NULL ,md5 VARCHAR ( 200 ) NOT NULL ,createtime VARCHAR ( 128 ),filename VARCHAR ( 128 ),shared_status INT ,pv INT);
CREATE TABLE user_file_count (user VARCHAR ( 128 ) NOT NULL PRIMARY KEY ,count INT);
5. 共享文件列表 - share_file_list
CREATE TABLE share_file_list (user VARCHAR ( 128 ) NOT NULL ,md5 VARCHAR ( 200 ) NOT NULL ,createtime VARCHAR ( 128 ),filename VARCHAR ( 128 ),pv INT);
# 分析出客户端请求对应的指令 -- /testlocation / test{# 转发出去fastcgi_pass 地址 : 端口 ;include fastcgi.conf;}
fastcgi如何接收数据
# 启动 , 通过 spawn-fcgi 启动spawn-fcgi -a IP -p port -f ./fcgi# 编写 fastCGI 程序的时候- 接收数据 : 调用读终端的函数就是接收数据- 发送数据 : 调用写终端的函数就是发送数据
// 编写登录的 fastCgI 程序int main (){while ( FCGI_Accept () >= 0 ){// 1. 接收登录信息 -> 环境变量中// post -> 读数据块的长度 CONTENT-LENGTH// get -> 从请求行的第二部分读 QUEERY_STRING// 2. 处理数据// 3. 回发结果 -> 格式假设是 jsonprintf ( "Content-type: application/json" );printf ( "{\"status\":\"OK\"}" )}}