前段時間看到了張雲龍的文章 一個程序員的成長之路 - 剖析別人,總結本身,裏面有這麼一段話html
棧外技術,是指棧內技術的上下游,領域外的相關專業知識,包括但不限於服務端技術、運維、CDN、測試,甚至 UI 設計、產品設計等等,擴展你棧內技術的周圍領域,充分理解你的工做在整個技術研發體系中處於怎樣的環節。工做之餘多投入一份精力,把其餘棧外技術不斷歸入到你的知識體系中來,創建棧外能力。前端想要作的深刻,每每會涉及到緩存、模板渲染、用戶體驗等知識,沒有至關的棧外技術積累,你很難爲本身的團隊爭取到足夠的話語權。前端
想一想本身在公司的時候,基本都是寫業務,作前端相關的工做,但對於其餘方面是涉獵比較少,或者基本沒有的。又再想一想以前面試的時候,面試官也會問一些棧外問題,好比說大家公司的代碼是如何發佈部署的,這時候的我是一臉懵逼的。這就使得我想要懂得如何部署代碼,如下是折騰的過程,記錄一下。node
雲服務器的購買,能夠選擇阿里雲和騰訊雲,我以前並無仔細地去比價二者的價格如何,想着就是用來玩玩如何部署的,也就沒有多在乎這些,畢竟也不是長期購買,花不了幾個錢,就選了騰訊雲。至於選購什麼配置的服務器,就看我的了。買完以後,還要作一些認證等,須要等待一兩天的時間。對了,我還買了一個域名,可是後來發現備案的手續挺麻煩的,想着以後用 ip 地址也能夠訪問,就沒有去管了。linux
有了服務器後,你須要登陸。那要怎麼登陸呢,這裏介紹一個簡單的方法。nginx
首先,你須要確認本身是否已經擁有祕鑰。默認狀況下,用戶的 SSH 祕鑰存儲在~/.ssh 目錄下。進入該目錄並列出其中內容,即可以快速確認本身是否已擁有祕鑰:git
# 本地 $ cd ~/.ssh $ ls config id_rsa id_rsa.pub known_hosts 複製代碼
咱們須要尋找一對以 id_dsa 或 id_rsa 命名的文件,其中一個帶有 .pub 擴展名。.pub 文件是你的公鑰,另 一個則是私鑰。若是找不到這樣的文件或者根本沒有 .ssh 目錄, 你能夠經過運行 ssh-keygen 程序來建立它們。程序員
# 本地 $ ssh-keygen Generating public/private rsa key pair. # 輸入 enter 鍵 Enter file in which to save the key (/Users/laohan/.ssh/id_rsa): Created directory '/Users/laohan/.ssh'. # 兩次輸入密碼 Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/laohan/.ssh/id_rsa. Your public key has been saved in /Users/laohan/.ssh/id_rsa.pub. The key fingerprint is: SHA256:XhI9aeGsVJklGyUTvNu+6ABzOZdZL2+y5aMOVQa+ZvI laohan@bogon The key's randomart image is: +---[RSA 2048]----+ | .O*+ | | =+X . | | o O.o o | | . =.= = | | o S *o* . | | = =.*.o | | o ..E + | | . o.*. | | .o.=o.. | +----[SHA256]-----+ 複製代碼
首先 ssh-keygen 會確認密鑰的存儲位置(默認是 .ssh/id_rsa),而後它會讓你重複一個密碼兩次,若是不想在使用公鑰的時候輸入密碼,能夠留空。github
公鑰看起來是這樣的:web
$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDc4xbJxlMTgiE13I1RL6IsG44+3CQc8Ft03eZnYfNrPVeQIf9r9kTuArSiUnY+BHXn3mrQ5i+5AGi+alys94Pum2dZ68QtlY1QdEl4iN3LFXUkbJc+M0rllaDGH5JNtfk5imVqDo8Tn7aJsFd4IXbwrl3Euf+ccOb+s92RHwzbSRx37tP9pLF9ujfL0UXfg3+DmRJMJT7iN3OiJxfuF5k8KSySEz+YbhQoNeySuvVPeRHG/U6xOGcpzNjQIPApGsuFdLT5R/5x15W7SrC//XWuIQMmlVTW2X0YH+5NjT0nlLVWxS4drtRCS66JXtRceVqs5H5InbsLfALfTPyIkZ4t laohan@bogon 複製代碼
具體能夠參考這裏 Generating a new SSH key and adding it to the ssh-agent面試
$ cd $ mkdir .ssh && chmod 700 .ssh $ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys 複製代碼
接下來,把開發者的 SSH 公鑰添加到這個用戶的 authorized_keys 文件中。
$ vim .ssh/authorized_keys # 把以前生成是 SSH 公鑰添加到文件尾部 複製代碼
如今已經能夠經過 ssh 無密碼的方式登陸雲服務器了
ssh root@IP # IP 爲 雲服務器的 IP 地址 複製代碼
如上,是否是感受很方便。但是這種方式,你仍是須要知道雲服務器的 ip 地址,那有沒有更省腦的方式呢?
有的,在~/.ssh 下的 config 文件中添加如下代碼便可
Host hostname # hostname 爲你想要設置的別名 HostName IP # IP 爲雲服務器的 IP 地址 User root IdentitiesOnly yes 複製代碼
以後,就能夠經過以下的方式登陸到雲服務器了
ssh hostname # hostname 爲你剛纔設置的名稱 複製代碼
我的理解,雲服務器也就是一臺機器,你的代碼在本身的電腦怎麼跑,到了雲服務器仍是怎麼跑,只是運行的環境不同了,須要作一些配置。
如今,咱們已經有了雲服務器了,接下來就是如何把咱們能在本地跑起來的代碼部署在服務器上。
我採用的方式比較簡單,就是直接在把我本地的代碼 push 到 github 上面,而後在服務器那裏用 git clone,把代碼下載到本地。github 地址 koa-demo。又或者你能夠把代碼在本地打包後,利用 scp 遠程複製。
nginx,是運維同窗常常打交道的。你可能聽過反向代理、負載均衡等名詞,這都是跟 nginx 有關的。
個人服務器是 centos 系統的,因此安裝的方式以下
yum install -y nginx
複製代碼
至於其餘系統的安裝方式,自行查找了。
對於 nginx 來講,主要就是 nginx.cof 這份配置文件,位於/etc/nginx 路徑下,下面就進行修改
cd /etc/nginx vi nginx.conf 複製代碼
修改後的內容以下
注意:確保紅色圈中的 1 部分沒有被註釋,圈中的 2 部分註釋。這樣作的目的是爲了若是以後須要添加多個 server 的話,都在 nginx.conf 文件改,就不容易維護了。 接下來,添加咱們此次須要的跟 nginx 相關的文件
cd /etc/nginx/conf.d touch koa-demo.conf vi koa-demo.conf 複製代碼
而後,把如下內容 copy 到 koa-demo.con 中並保存
upstream koa-demo {
server 127.0.0.1:3000;
}
server {
listen 80;
location / {
proxy_pass http://koa-demo;
}
}
複製代碼
以後,使用下面的命令
nginx -t
# 用來測試你的配置文件是否 ok
nginx -s reload
# 從新加載配置文件
複製代碼
沒意外的話,這個時候在瀏覽器中輸入你的雲服務器 ip 地址,就能夠看到效果了。 等等,你說你的瀏覽器沒反應。不要慌,這是由於你的代碼還沒運行呢
# 個人代碼克隆在這裏,你的路徑可能跟個人不一樣 cd /opt/koa-demo npm start 複製代碼
這時候再刷新頁面,ok 了,大功告成。
接着,你可能就想給本身加個雞腿慶祝一下,而後就退出了雲服務器,跑去吃飯了。吃完飯回來,再次刷新瀏覽器,我了個去,怎麼又沒內容了。 爲何會這樣呢?
這是由於你打開的方式不對,也就是啓動代碼的方式不對,你能夠看看 packagek.json 的內容,npm start 其實就是執行 node index.js 。當你這邊退出了,這個進程也就結束了,想一想在你的本地是否是也這樣,你在你的終端運行,打開瀏覽器是沒有問題的,退出終端,再刷新頁面,就出問題了。
那這個問題要如何解決呢?呃,若是你以前有接觸過 node,那應該就聽過 pm2 這個詞了。是的,沒錯,接下來咱們就用這個 pm2 解決咱們的問題。
如何學習 pm2 呢,最快的方式就去看它的 官網 咯,裏面的文檔仍是寫的很不錯的,一個 Quick Start 直接入門。
這裏就很少介紹了,看文檔會更快了解。 那接下來怎麼跑呢,你能夠看到 package.json 裏面的 script 還有個命令,就是 pm2,這個就是我以前已經添加好了,用 pm2 來啓動程序的命令。具體以下:
# 先登陸到雲服務器 ssh hostname # 進入代碼目錄 cd /opt/koa-demo # run npm run pm2 複製代碼
這個時候,即便你退出了,再次刷新頁面,也不會有問題了。
docker,你應該聽過這個名詞吧,沒聽過說明你有點跟不上時代阿。 若是沒有了解過 docker,能夠參考阮一峯老師的 Docker 入門教程。
接下來,就試一試如何利用 docker 部署咱們的 nodejs 應用。
首先,咱們須要在咱們的 koa-demo 中添加 Dockerfile 和.dockerignore。我已經在代碼中添加好了,你能夠直接簡單地複製到你的項目中。至於其中的那些命令表明什麼意思,就很少解釋了。你看完阮老師的那篇文章,多少有點了解了。或者你能夠 docker COMMAND -h 獲取各個命令的使用。
首先,咱們須要在雲主機上安裝 docker,能夠參考 docker 官網 About Docker CE, 裏面有關於各個系統的安裝說明,很詳細了。
進入到咱們的代碼目錄,利用 docker build 命令,編譯出咱們須要的鏡像文件,而後用 docker run,運行容器
cd /opt/koa-demo docker build -t koa-demo . docker run -d -p 7000:3000 koa-demo 複製代碼
這裏,我用本地的 7000 端口映射容器的 3000 端口。
這個時候,你可使用一下命令,看是否正確運行
curl -i localhost:7000 # 應該會返回以下結果 HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Content-Length: 30 Date: Mon, 02 Jul 2018 12:12:26 GMT Connection: keep-alive It's success, congratulation! 複製代碼
如今,咱們的容器已經跑起來了,你能夠想試試直接在瀏覽器輸入 ip:port 這樣的形式是否能夠訪問,等你輸入以後,你會發現是沒有反應的。
爲何呢,不要急,咱們尚未添加 nginx 配置呢。
cd /etc/nginx/conf.d vi docker-demo.conf # 寫入如下內容 upstream docker-demo { server 127.0.0.1:7000; } server { listen 7000; location / { proxy_pass http://docker-demo; } } 複製代碼
記得用 nginx -t 來測試你的 conf 是否 ok, 而後 nginx -s reload 從新加載一下。
這個時候,你就能夠用 IP:Port(這裏的 Port 是上面的 listen 的端口) 的形式訪問了。
假如,你這個時候仍是無法訪問的話,有多是你的安全組設置的問題,設置一下便可。
以上就是一個小白的辛酸部署路,路程艱辛,但學到了很多東西,收穫不少。
歡迎一塊兒討論,github地址 從零開始學習部署
誰說前端不須要懂-Nginx 反向代理與負載均衡 Dockerizing a Node.js web app Get Docker CE for CentOS Docker — 從入門到實踐