项目架构:
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
//