全棧最後一公里
來自專欄 程序媛的前半生
超勵志原話[手寫] — from @Scott老師
剛剛我們一口氣看了四五個項目,相信大家一定是急不可待了。
想要快快來學習一下,好在公司裡面一展拳腳,徹底打通自己全棧之路的任通六脈,解鎖我們開發應用和網站的新知識,那還得從整個故事框架開始。
我們分析一下整個的部署流程,之後同學們在看課程的時候,就能做到心中有數了,故事還得從左下角的角落開始。
一把椅子一把桌子,一台電腦,可能還有一罐紅牛和一包紙巾,我們就開始了白天到黑夜,黑夜到白天的編程之旅,代碼寫得死去活來,Bug調得痛不欲生,總算在七七四十九天之後,我們在這台電腦上,藉助NodeJS開發出一個「靜態網站「、一個「電影網站」、一個「給狗狗配音的手機App」、一個「裝修房子的微信小程序」、還有一個「可以回復分享和看電影的微信公眾號」。
然而這些應用都是跑在本地電腦上,誰也看不到,誰也用不了。左思右想,還是得把這些辛辛苦苦自己生出來的孩子放到網上給別人看啊,好歹也是自己的一次創業經歷。
於是,我們開始邁出了第一步~
那就是先為這五個應用購買一個域名,雖然買5個也行,但是看看北京的房價,還是只買一個吧,一個域名也可以分出5個二級域名來用的,創業總是要省著點。購買域名之後,我們需要給這個域名備案,畢竟還是得接受國家監管的嘛!不備案不是中國人,哼╭(╯^╰)╮
接下來,我們就要來邁出第二步~
把買產品的錢去買一台伺服器,有了這個伺服器,我們總算是給這些孩子提供一個家了。但是現在家徒四壁,啥都沒有,我們的5個孩子嗷嗷待哺,別說嬰兒車、安全座椅、連奶都沒有。
所以,我們開始邁出第三步~
從我們開始的小角落,通過ssh通道,連接上我們的伺服器,設置用戶的許可權,安裝MongoDB資料庫,搭建NodeJS環境,配置Nginx前置服務。
- 為了讓孩子們不受到傷害,我們還得給伺服器加裝IPtables、Fail2Ban這些安全防護措施;
- 為了讓大家不要來看我們熊孩子的時候泄露個人信息,或者傷害到伺服器的數據,我們還得配置SSL證書,所有人都要頂著安全帽,戴著白口罩來咱們家;
- 為了我們自己不會輕易地給孩子喂錯奶,換錯紙尿布,我們還得對我們本地的伺服器ssh通道進行加固防護,只有自己才有許可權去照顧孩子。
這個網上的家算是搭好了,算不上精裝修,不過足夠住了。
當然孩子們現在都在我們本地電腦上,離新家還有兩萬五千公里,ssh通道也太小,如果老是接送來接送去的,也實在是麻煩,而且還不夠安全。
因此,我們邁出第四步,給孩子們找一個寄養的家~
什麼寄養的家?不就是一個託兒所嘛!好吧,我承認是一個非常安全的託兒所,我們找到一個提供git倉庫的託兒所,從我們本地電腦把5個孩子一個一個扔過去,把孩子存在那兒,如果有需要讓它們去伺服器裡面的時候,我們就直接通知伺服器到託兒所去接孩子們,我們就再也不用從本地一個位元組一個位元組的傳送它們了。
然後問題馬上就來了,用什麼工具接孩子呢?沒有駕駛員怎麼辦呢?怎麼才能通知駕駛員去伺服器裡面接孩子呢?想一想,都頭疼。
最後,我們邁出了第五步~
在本地和伺服器上都安裝git軟體,都安裝pm2。對,這個pm2不是北京天上那個pm2。我們通過git把孩子傳送到私有倉庫,讓伺服器通過git來下載孩子,至於pm2就是駕駛員兼職保姆,其實就是個老司機。
我們本地通知伺服器上的pm2,讓它去私有倉庫託兒所,用git把孩子運到新家後,pm2會去協調Node進程,讓孩子們各自發揮自己的聰明才智,跟外面的朋友進行各種互動,可是孩子們太自私,都想搶佔80埠。
沒法子,我們被逼邁出了第六步,開始分家~
我們按照老大、老二、老三的順序分別給他們分配3000埠、3001、3002、3003、3004埠,然後讓Nginx來當伺服器的大門總管,由它一個人持有80埠,所有想要進門訪問的客人都得經過Nginx這關,它來識別訪客。
- 如果訪客是來看老二的,我們就把訪客轉發到3001埠;
- 如果訪客是來看小程序的,我們就把訪客轉發到3003埠;
- 如果訪客是來給狗狗配音的,它也得首先通過域名,而且是通過HTTPS的協議找到我們伺服器的80埠,伺服器的大門總管Nginx一眼便識破了它的真正目的,先通過SSL證書與它進行握手交流,溝通認證之後,便會把訪客的請求轉交給後台的3002埠,有NodeJS來全部接手這個請求。
埠總算是分好了,可是問題又來了,訪客都蒙圈了,不知道我們新家在哪裡,這時候,我們才想起了最後一件事,那就是忘了給他們地址了。
於是我們氣喘吁吁地的跑到購買域名的服務商,去把域名的DNS定義修改後,並且進行解析指向,給這5個孩子分別分配了5個二級域名,訪客們就可以通過這5個域名準確的找到孩子們後,發糖吃了。
養一個家不容易,養一個有孩子的家更難,事情到這兒,也遠遠沒有結束,我們還有太多的育兒心得要交流。
我可能是瘋了,怎麼可以把人生第一次Linux送給公司伺服器;
我一定是瘋了,怎麼可以隨意踐踏連對象都不知道是誰的Linux命令;
我已經被逼瘋了,沒錢買域名,沒錢買伺服器,還不願意裝虛擬機,因為沒錢,電腦辣雞!!!
So what ? I dont care ! I really got a fucking success.
Okay,先聲明,我這個是超級忽略了好多超多的步驟,首先我有現成的公司伺服器,其次老師講的那些,說句實話,我真心聽不懂,要被自己蠢哭了,求放過~~~最後我又不是靠後台部署吃飯的,能發布到能讓客戶看到我給他們辛辛苦苦生的孩子,知足了,不強求~~~
以下純粹是Linux,至於Mac哈哈哈哈哈哈哈哈哈過個幾年吧。
第一步:準備各種工具,嚴陣以待
第二步:用SecureCRT搭建伺服器Node生產環境
//對系統進行更新[root@xxx ~]# sudo yum install vim wget curl gitDo you want to continue?[Y/n] Y//選擇nvm工具[root@xxx ~]# wget -q0- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash//nvm安裝完成後,提示重新打開窗口進行操作[root@xxx ~]# nvm --version[root@xxx ~]# 0.33.1 出現版本號即表示安裝成功//安裝nodejs,指定版本6.9.5[root@xxx ~]# nvm install v6.9.5//指定node使用版本[root@xxx ~]# nvm use v6.9.5//默認系統node版本[root@xxx ~]# nvm alias default v6.9.5//查看node版本[root@xxx ~]# node -v[root@xxx ~]# v6.9.5//由於伺服器是國內,眾所周知,可能下載慢,配置簡單參數指定使用國內淘寶鏡像下載[root@xxx ~]# npm --registry=https://registry.npm.taobao.org install -g npm//查看npm版本[root@xxx ~]# npm -v[root@xxx ~]# 6.0.1//增加新的系統文件結構樹,很需要別忘了[root@xxx ~]# echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p//為了保證更快更穩定的速度,採用cnpm來安裝模塊[root@xxx ~]# npm --registry=https://registry.npm.taobao.org install -g cnpm//查看cnpm版本[root@xxx ~]# cnpm -v[root@xxx ~]# cnpm@5.3.0...//node安裝完畢,順手安裝一些常用的全局工具包[root@xxx ~]# npm install pm2 webpack gulp grunt-cli -g
第三步:用SecureCRT對伺服器配置安裝MongoDB
//查看是否存在mongodb配置的yum[root@xxx ~]# cd /etc/yum.repos.d[root@xxx yum.repos.d]# ls//不存在mongodb源,則進行添加並編輯保存[root@xxx yum.repos.d]# touch mongodb-org-3.4.repo[root@xxx yum.repos.d]# vi mongodb-org-3.4.repo//進入vi編輯模式,保存以下到文件中[mongodb-org-3.4]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/gpgcheck=1enabled=1gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc//退出vi編輯模式,運行安裝命令[root@xxx yum.repos.d]# sudo yum install -y mongodb-org//驗證安裝結果[root@xxx ~]# rpm -qa | grep mongodbmongodb-org-3.4.15-1.el6.x86_64mongodb-org-tools-3.4.15-1.el6.x86_64mongodb-org-server-3.4.15-1.el6.x86_64mongodb-org-shell-3.4.15-1.el6.x86_64mongodb-org-mongos-3.4.15-1.el6.x86_64出現以上代表安裝成功//默認下mongo的儲存路徑是/data/db,如果此時系統中沒有這個文件,是不會啟動成功的,所以要手動創建[root@xxx ~]# mkdir -p /data/db
第四步:開啟伺服器視覺編輯器,將項目傳送到上面去
PS:原諒我實在是不會用git,那個什麼什麼本地命令行託管來接送去的,天書啊,要哭了!
第五步:先打開伺服器資料庫
由於我考慮到以後可能運行很多mongodb實例,為了方便自己看得懂,不使用最初創建的/data/db存儲位置,所以自己創建子進程,跟項目存放一起,反正都是我自己看。
/*** mongod --fork --logpath <log_file_path> --dbpath <db_folder_path>* --fork 將mongod作為後台服務啟動,並必須要跟隨 --logpath 指定日誌文件路徑,如果該日誌文件不存在會被自動創建* --dbpath 數據的存儲目錄*///開啟mongo db後台服務,使用--fork參數啟動[root@xxx ~]# mongod --fork --logpath /tentcoo/www2/projects/hmt-mongodb-data/mongodb.log --dbpath /tentcoo/www2/projects/hmt-mongodb-data/dbforked process: 16727child process started successfully, parent exiting創建子進程成功//查看mongodb所有子進程[root@xxx ~]# ps aux | grep mongo一大堆進程列表來襲,跟在root後面的數字代表進程的pid/*** 關閉mongo db服務* 1.使用--shutdown進行關閉,但要指定--dbpath,因為一台機器上可以運行著多個mongodb實例,避免誤殺* mongod --shutdown --dbpath <db_folder_path>* 2.使用 kill 命令,在Linux機器上也可以通過ps aux | grep mongo過濾出mongodb服務並找出對應的進程id後,使用kill命令進行關閉* kill <mongod process ID>* kill -2 <mongod process ID>*/
第六步:使用PM2守護進程
//首先新建一份pm2自動監測重啟的配置文件,放在根目錄下,命名ecosystem.json{ "apps": { "name": "jade-edition-adminManage", //應用名稱 "cwd": "/mnt/www2/projects/jade-edition/adminManage", //當前工作路徑 "script": "app.js", //實際啟動腳本 "min_uptime": "60s", //最小運行時間,這裡設置的是60s即如果應用程序在60s內退出,pm2會認為程序異常退出,此時觸發重啟 "max_restarts": 10, //設置應用程序異常退出重啟的次數,默認15次(從0開始計數) "error_file": "./pm2-error.log", //錯誤日誌路徑 "out_file": "./pm2-out.log", //普通日誌路徑 "pid_file": "./pm2.pid", //自定義應用程序的pid文件 "watch": false //監聽目錄變化自動重啟,默認為true }}//在項目文件夾根目錄下,開啟監測[root@xxx adminManage]# pm2 start ecosystem.json成功開啟,會有一個漂亮的表格,上面寫著online
最後一步:開始訪問我們的孩子了,一起去看看吧
哇O(∩_∩)O哈哈~好愛好愛啊,我居然成功了。
作為敢吃公司螃蟹的第一人,中間好多坑的說,生怕一個命令就把公司的數據都刪了,雖然事先已經有問過度娘哪些不良反應,輕易不碰雷區,不得不說,手還是抖著的。
我對自己能做到這一步,已經很滿意了,很知足了,過多的比如什麼私有倉庫,什麼github,什麼ssl都不是我能吃的菜,而且最近在減肥,等我瘦下來了,心情不錯再來啃啃。
(〃▽〃) (≧?≦)? (^o^)/
推薦閱讀:
※一段代碼,為什麼在linux下可以編譯運行,而在vs2013就不行?
※WSL 使用指南——03 避免的坑
※bash腳本各種記錄
※用R語言修改一個工具包,做並行計算上的優化應該怎麼入手?
※為什麼把部分蘋果設備的系統時間調整為1970.1.1,重啟後就會變磚?