项目 - 云盘项目-整体流程

项目架构:

client(客户端)---nginx(负载均衡、反向代理)---nginx(web服务器、文件上传下载业务逻辑、fastCGI编程)---mysql(存储用户信息)+redis(缓存)+fastFDS(开源文件系统、存储到硬盘)

 

fastFDS框架:client(上传下载者)---tracker(管理者)---storage(存储节点)

fastFDS集群:client(大量访问)、tracker(防止单点故障)、storage(稳定性:同组备份、扩展性:不同组扩容)

//

Redis使用:

 数据结构:

  string字符串(最基本数据类型)

  list列表(类似数组)

  set集合(会自行排序、去重)

  sortedset有序集合(按设定权重自动排序,去重)

  hash哈希(键值对,存有多个字段的对象)。

 对key(类似表名)操作:

  keys(配合通配符使用):列出当前数据库中的key

  type / rename:看key的数据类型 / 重命名key

  del / exists:删除 / 查看是否存在

  expire / ttl / persist:设定生存时间 / 查看剩余时间 / 去除生存时间。

 其他功能:发布/订阅,事务(隔离,原子操作)。

 持久化配置:

  快照(rdb文件):将内存里面的数据以二进制形式拷贝到硬盘上;

  追加文件(AOF):存储不是二进制数据而是对redis的操作指令。

 编程操作数据库流程(编程需要进行封装):

  初始化+连接 redisConnect

  执行命令  redisCommand

  查看返回值 redisReply

  清理指针  freeReplyObject、清理句柄  redisFree。

Nginx使用:(用作:http服务器,email服务器,反向代理,负载均衡)

 常用命令:帮助nginx -h;向nginx发送某个信号nginx -s signal;测试配置文件nginx -t;指定配置文件 -c

 nginx服务中master/worker机制:master进程做管理,worker进程干活(处理外部请求)

 nginx部署静态站点:修改localtion,网站访问地址对应服务器上文件的路径 = root + location

 虚拟主机:nginx支持部署多个站点,同时部署多个站点(法1 通过不同端口,法2 同一端口不同http请求头)

  域名和IP:ipv4为点分十进制表示法表示4个字节的ip地址(一个域名对一个ip,一个ip可被多个域名绑定

  通过域名寻找IP:法1 找本机的/etc/hosts文件添加【ip   域名】,法2 找DNS添加【ip   域名】

 反向代理:外网机子通过代理访问内网某台机子(正向代理:概念相反)

  配置:需要另外一台装有nginx服务器,使用【location下的属性proxy_pass】

 负载均衡:建立在反向代理基础上,nginx要创建一个服务器组,使用http模块下【upstream 模块】

  配置:创建upstream模块(上游服务器组名),在location中配置【proxy_pass   ip:port】

  权重:分配服务器被访问的概率【proxy_pass   ip:port weight=xxx】

  备用:如果用于服务的机器挂掉后,就再指定另一台服务器作为备用【proxy_pass   ip:port backup】

 静态页面和动态页面:判断条件是否使用网页编程技术,nginx只支持静态页面,提供接口支持动态页面

Http协议:

 超文本传输协议,特点是明文,设计之初看文档,添加安全传输层解决传输安全问题,使用协议https-http over ssl

 协议内容:

  请求方式:请求行(请求方法[8种,常用2种]   请求资源路径   http协议版本号)

       请求头(都是键值对key:value   都是客户端或者说是浏览器支持的属性)

       空行:\r\n(换行   换言之,只要遇到两个"\r\n" ,就代表请求头的结束)

       请求数据:POST/PUT才会带请求数据,GET/DELTE方法不允许携带数据

  响应方式:状态行(http协议版本号   状态码   状态码意义)

       响应头(都是键值对key:value   都是服务器的属性)

       空行:\r\n

       响应数据:服务器发给浏览器的数据内容

 http传参:常用2种方法 GET[常用做查询,而不是传输数据 ]和 POST[可传递任何数据]

  GET方法:不允许有请求数据,故可放参数地方为请求行[格式 请求地址?key=value&...]

 http提交数据的形式Content-Type:

  text/plain:内容形式一行一个key=value

  application/x-www-form-urlencoded:内容形式/格式与get方法提交参数类似,key=value&key=value...

  application/json:内容形式json(html不支持json提交)

  text/xml:内容形式xml标记语言,优势是数据表达形式更加丰富,但是耗性能

  multipart/form-data:内容形式为多部份数据(数据以boudary字符串进行分割)

CGI(common gateway interface 通用网关接口):

 原始:Web服务器和CGI程序是父子进程关系,每次有请求fork一个子进程进行处理(nginx不支持CGI)

 改进:FastCGI是对CGI的升级,其一开始就运行在内存(其与Web服务器不是父子进程关系)

  spawn-fcgi:是fastCGI进程管理器(和fastCGI是父子进程关系)

  其中nginx与spawn通信使用socket,spawn与fastCGI是父子进程通信使用管道重定向

 部署一个fastCGI程序:

  spawn&fastCGI要启动:spawn-fcgi -f [指定fastCGI程序] -a [指定地址] -p [端口]

  nginx要配置:添加location模块并使用属性【fastcgi_pass ip:port】【include fastcgi.conf】

 如果指定fastCGI程序是fastCGI下example下echo,则再访问web服务器就可以看到FastCGI echo页面信息

  详细解析看我另一篇博文:https://www.cnblogs.com/citrus/p/11977710.html

 编程需要考虑的问题:

  1、http请求行、请求头、请求数据怎么获取(分别通过环境变量、环境变量、程序的标准输入获取

  2、如何响应数据给客户端(通过标准输出发送给客户端)

//

开始编程:

 部署站点:新增/usr/local/ngin/conf/nginx.conf   server指定资源路径

 检查端口是否可用:执行firewall-cmd加--query-port=80/tcp;--permanent --add-port=3389/tcp;--reload。

 部署fastcgi程序:将需要处理的请求定位到fastcgi程序中

 上传文件编程思路(改写echo.c):

  1、客户端请求(上传文件)到web服务器

  2、web服务器配合fastCGI将文件保存到本地

  3、将保存到本地的文件保存到fastFDS上

 下载文件编程思路:

  1、客户端请求(下载文件)到web服务器

  2、web服务器响应fastFDS上对应文件的地址

  3、客户端通过http访问下载地址

 数据库设计:

  实体对象关系:

    1:1关系:合成一张表

    1:N关系:两张表,较多实体表中添加id指向较少实体表

    N:N关系:三张表,抽取其中一张表来表示两者之间的关系

  本项目抽实体:用户(用户名、密码、昵称、电话号码、电子邮箱);文件(id、md5、size、createtime)

  功能需求:注册;登陆;文件操作(上传,下载,查看,删除,共享)

 服务端项目框架分析:cgi生成目录、cgi源码目录,公共工具源码目录,头文件目录,配置文件目录,makefile,部署脚本

 服务启动脚本逻辑:conf文件部署,fastFDS重启,fastCGI重启,nginx重启,redis重启

//

环境搭建:

CentOS、

0、安装 Gcc:

  yum -y install gcc gcc-c++ kernel-devel    //安装gcc、c++编译器以及内核文件

  https://www.cnblogs.com/xiyushimei/p/8550930.html

0、安装 配置 Mysql:

  https://www.cnblogs.com/h-gallop/p/11645965.html

  https://blog.csdn.net/xiaolong_4_2/article/details/81664582

0、安装 配置 启动 FastFDS:

  源码下载:github阿里开源项目

  源码安装:先安装libfastcommom,再安装fastFDS

  配置文件位置 /etc/fdfs/ :配置tracker.conf,storage.conf,client.conf

  启动顺序:先启动fdfs_trackerd /etc/fdfs/tracker.conf start,再启动storage,最后测试一下

  客户端常用命令:upload上传,download下载,delete删除,info查看文件信息,monitor查看tracker信息

  注意:项目中tracker和storage需部署在不同服务器上,自己捣鼓可以部署在同台服务器上

 0、安装  配置 启动 Redis:

  源码下载并安装:make编译,make install安装

  配置redis.conf:【bind---ip】【port---端口】【protected---远程保护】【damonize---是否守护进程】

     【tcp-backlog---tcp连接个数】【timeout---客户端超时连接】【databases---数据库个数】

  启动服务:redis-server(没有指定配置文件就使用默认配置)

  编程所需库:源码自带hiredis,需编译安装hiredis,包含头文件和库文件即可

 0、安装 配置 Nginx:

  源码下载:下载依赖(pcre库、zlib库、openssl库),下载nginx,并全部解压

  源码安装:找到nginx目录下nginx/configure,配置库路径,编译,安装

  启动服务:创建 /usr/local/nginx/sbin/nginx 软连接到 /user/local/bin,启动nginx

  开启访问端口:防火墙的原因https://blog.csdn.net/qq_40543961/article/details/79654230

  配置nginx.conf:配置文件有特定语法,其中模块区分【http 配置http服务器】【mail 配置email服务器】;

    user【master进程和worker进程用户都改为root】,worker_processes【配置worker进程数】,

    error_log【配置错误日志】,event【模块 优化性能】,http【模块 默认使用数据类型 访问日志】,

    server【模块/对外提供站点配置 [listen监听ip:port] [server_name 服务器域名] [charset 字符集]

    [location 模块/定位目录/除去ip和port后的路径   属性:root资源定位目录,index资源目录下的文件]】

0、整合 Nginx 的模块-ngx_fastfds_module:

  使用fastDFS-module整合到nginx上(该模块适用于storage服务器,可以直接拿到fastDFS文件下载路径)

  源码下载fastdfs-nginx-module,解压

  配置./configure --with-pcre=pcre库 --with-zlib=zlib库 --with-openssl=openssl库  --add-module=fastdfs模块/src

  安装:make && make install(这里是重新编译了nginx)

  启动nginx发现没有worker进程,nginx没有正常工作,查看nginx下logs错误日志,查看原因:

    缺少mod_fastdfs.conf文件:去fastdfs-nginx-module/src目录下找

    缺少http.conf、mime.types文件:fastDFS源码/conf目录下找

    配置文件配置项无效:修改mod_fastdfs.conf配置文件---要和storage.conf一致(此时nginx可以正常启动)

  nginx.conf中配置fastDFS-module属性的location模块(参考fastdfs-nginx-module安装说明step5)

  再次启动nginx会打印ngx_http_fastdfs_set pid=80257,则表明可以通过http直接访问fastFDS下载文件 整合完成

  测试:可以使用fdfs_upload_file /etc/fdfs/client.conf上传文件得到文件id,再到浏览器去下载

  原理:ngx_fastfds_module模块让tracker与storage协同工作,文件有就直接返回,没有就代理到其他storage上

    通过配置response_mod的proxy代理到其他storage服务器

    或 通过配置redirect发送http头,让客户端重定向跳转到其他服务器上

0、安装 Spawn-fcgi  FastCGI:

  源码下载:源码指的就是Github下载,下载spawn-fcgi,下载fastCGI,并全部解压

  安装:先fastCGI,执行./autogen.sh(需安装auto工具autoconf2.69、antomake1.13.4、libtool2.4.2)

    会报缺少文件夹错误(创建空文件夹即可),再执行./configure,再执行make,再执行make install;

    后spawn-fcgi,操作同上(如果碰到镜像文件找不到可以执行 yum update)。

//

todo:mysql配置账号密码;框架代码已上传到vm

//

你可能感兴趣的:(项目 - 云盘项目-整体流程)