項目架構:
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、
1、安裝 Gcc:
yum -y install gcc gcc-c++ kernel-devel //安裝gcc、c++編譯器以及內核文件
https://www.cnblogs.com/xiyushimei/p/8550930.html
2、安裝 配置 Mysql:
https://www.cnblogs.com/h-gallop/p/11645965.html
https://blog.csdn.net/xiaolong_4_2/article/details/81664582
3、安裝 配置 啟動 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需部署在不同服務器上,自己搗鼓可以部署在同台服務器上
4、安裝 配置 啟動 Redis:
源碼下載並安裝:make編譯,make install安裝
配置redis.conf:【bind---ip】【port---端口】【protected---遠程保護】【damonize---是否守護進程】
【tcp-backlog---tcp連接個數】【timeout---客戶端超時連接】【databases---數據庫個數】
啟動服務:redis-server(沒有指定配置文件就使用默認配置)
編程所需庫:源碼自帶hiredis,需編譯安裝hiredis,包含頭文件和庫文件即可
5、安裝 配置 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資源目錄下的文件]】
6、整合 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頭,讓客戶端重定向跳轉到其他服務器上
7、安裝 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
//