本文不講解各種技術的詳細使用,只把整個node初步部署的過程寫出來,最終目的是能確保nodejs成功在云主機跑起來,并能通過自己的IP地址或域名訪問得到。長話短說,首先來看看需要做的整個流程:
- 購買服務器
- 購買域名
- DNSPod域名解析
- 本地連接主機服務器
- 安裝nodejs運行環境
- 安裝pm2進程管理工具
- Nginx反向代理與負載均衡配置
上面幾個過程,在一些有部署經驗的人看來很簡單,但對于一個初出茅廬的新手來說,碰到的坑還是不少的,雖然可以百度可以谷歌,但網上資源多如繁星,要想快速正確篩選到正確答案,需要付出不少的精力和時間,更糟糕的情況是有些過于陳舊的答案,一旦放到項目使用,因為版本不相同,導致整個項目運行錯亂,這時候需要從更加深入的環節才能解決處理,這對一名剛涉及部署上線的人來說是非常辛苦的。下面重回正題,就上面的各個環節更加詳細地談談。
購買服務器
服務器商有很多選擇,目前國內最多人使用的是阿里云,我買的是騰訊云。其實服務器都是差不多的,根據性價比買即可。個人購買出了系統選擇其他一般按默認選擇即可。系統選擇linux的CentOS系統,Ubuntu也是linux系統,但CentOS更新,在安裝軟件時候比Ubuntu更加便捷。
選好配置后購買付款即可。
購買域名
騰訊是新網,阿里是萬網,根據性價比買即可。
DNSPod域名解析
購買了服務器和域名之后,需要把服務器IP地址綁定到域名方可根據域名運行項目,否則只能通過IP地址來訪問。
域名解析有兩種方式,一是在當前的購買域名的平臺解析,二是使用其他服務商解析,例如我選擇的DNSPod。
1.購買域名的平臺解析
在個人域名控制臺打開,點擊解析選項。
進入解析版面后點擊添加選項,可以下面的彈出框,只需要把記錄類型選為A,主機記錄填www,記錄值填自己IP地址,其他的默認即可。
2.DNSPod平臺解析
打開DNSPod官網,注冊登陸。
- 進入域名解析控制臺
- 點擊域名選項進入主機記錄界面
- 點擊添加記錄,同樣只需要把記錄類型選為A,主機記錄填www,記錄值填自己IP地址,其他的默認即可。
注意:
自己當前的www.XXX.com是一級域名,可以用這個域名解析多個子域名,也就是二級域名——www.xxx.XXX.com。二級域名是免費無需再購買的。解析方法只需把主機記錄值改成二級域名名即可,如下:
本地登陸主機服務器
Mac使用iTerm登陸,
- 打開iTerm登陸輸入:
ssh -t root@公網ip地址 -p 22
- 然后在提示會讓輸入密碼,輸入登陸即可。
也可以設置無需輸入密碼登陸
- 打開finder,按command + shift + g 鍵搜~/.ssh文件
- 編輯下面內容至文件whatevername,保存在.ssh目錄
set user <用戶名>
set host <ip地址>
set password <密碼>
set timeout -1
spawn ssh $user@$host
expect "*assword:*"
send "$password\r"
interact
expect eof
- 打開iTerm2的profiles設置,編輯profiles
-
在Genernal->Command下選擇 Command,在輸入框里填入 expect ~/.ssh/whatevername即可完成,以后每次登陸都用whatevername文件自動填寫了信息。
image.png
在window系統下登陸
使用putty登陸:
- 打開Putty客戶端輸入
- Host Name:云服務器的公網IP
- Port:云服務器的端口,必須填22
- Connect type:選擇“SSH”
全部輸入完后,點擊“Open”,創建一個新對話。
在Putty會話窗口中,主機帳號密碼登錄。
安裝nodejs運行環境
yum -y install nodejs
查看版本
node -v
可使用下面命令快速升級到最新版:
- 首先安裝n模塊
npm install -g n
- 升級命令
n stable
這時nodejs已經升到最新版了。
為了測試node.js的運行,先新建個文件跑一跑:
- 隨便找位置建個空目錄:
mkdir -p /data/node
- 打開目錄,并新建并且編輯app.js文件
cd /data/node
vim app.js
- 將以下測試代碼放入:
const http =require('http')
http.createServer(function(req,res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('hello world')
}).listen(8081)
console.log('Server running at http://119.29.72.246:8081/');
- 保存成功后運行:
node app.js
這時成功運行就可以看到打印信息了:
Server running at http://119.29.72.246:8081/
這時根據自己IP地址加端口訪問在瀏覽器訪問即可。
注意:
這時候如果能訪問到'hello world'說明沒問題了,如果長久頁面跳轉不成功,說明端口出了問題,這是服務器的安全組設置所導致的。
- 打開服務器控制臺,打開安全組選項:
- 打開編輯規則:
- 進入添加規則界面可以看到各條規則,我們要訪問哪個端口,必須添加相應的入站規則。(出站規則是本站訪問外網時設置的)
- 添加規則,來源保持和原來一致,tcp對應的就是要訪問的端口號,完成保存。
現在再回到終端運行nodo app.js就可以訪問到8081端口了!
安全組作用和防火墻相似,都是IPTables規則來做包過濾,相當于給主機添加多一重保護,設置了安全組后可以給主機添加多一層防火墻作雙重防護。
安裝pm2進程管理工具
基于node命令運行的項目都是一次性,斷開主機連接后就不運行了,這時候需要安裝用到進程管理工具。相關的工具有pm2,forever,我推薦pm2,更新更強大!
- 安裝pm2:
npm install -g pm2
- 使用pm2:
pm2 start app.js
- 運行pm2 list可以監控進程列表:
pm2 list
pm2的其他命令使用可以參考:
https://www.douban.com/note/314200231/
如果pm2運行剛剛app.js端口有沖突,需要更改端口重新運行或者關掉進程重新運行。Linux查找端口進程和關掉進程的命令:
netstat -apn | grep 端口號
kill -9 進程的pid號
Nginx配置使用
- 安裝Nginx之前需要先安裝一些依賴和lib庫:
yum install gcc-c++
yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
- 直接安裝Nginx:
yum install nginx -y
- 查到版本號即安裝成功:
nginx -v
Nginx配置
剛剛pm2運行的app.js示例是在端口8081下運行的,Nginx的反向代理設置可以把端口號去掉或搭配個人域名使用。
反向代理設置
反向代理需要通過修改Nginx的配置文件來完成,Nginx的默認的配置文件是目錄etc/nginx下的nginx.conf文件。
- 進入etc/nginx文件夾
cd /etc/nginx
- 用編輯方式打開nginx.conf配置文件
vim nginx.conf
- 下拉可以看到核心選賢server:
- 這個server是Nginx的默認配置,我們需要把默認配置的listen改掉,保留其中一個監聽80端口;然后多加一個server選項:
- 在添加server的里寫上配置:
server {
listen 80;
server_name 119.29.72.246;
location / {
proxy_pass http://119.29.72.246:8081;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
}
}
上面配置中,最重要是server_name與proxy_pass選項,proxy_pass對應的是項目運行原本帶有端口的iP 地址,server_name是映射proxy_pass地址的新的地址。至此,Nginx初步配置完成。
- 重啟一下Nginx就可以通過server_name的地址就可以訪問到項目原來帶有端口的地址了。
nginx -s reload
http://119.29.72.246 => http://119.29.72.246:8081;
域名解析成功后,server_name選項可以用域名代替:
server_name xxx.com; //不用帶www
現在可以通過域名訪問到原來的端口號了:
http://www.xxx.com => http://119.29.72.246:8081;
最后的nginx.conf:
到現在Nginx的反向代理已經完成,不過如果想更完善些,還能再調整一下。
nginx.conf文件下有一句代碼:
include /etc/nginx/conf.d/*.conf
這句代碼會把conf.d目錄下所以的conf文件引入,所以我們其實可以把剛新建的server選項單獨寫在這些conf文件里,這種方式對管理復雜項目更加便捷。
- 打開conf.d目錄,新建編輯test.conf
cd conf.d
vim test.conf
- 把剛剛的nginx.conf里新建的server選項剪貼到該目錄下。
負載均衡
所謂負載均衡,就是通過配置多臺服務來對單一路徑進行訪問服務,當有某臺主機發生宕機時候,其他主機能承擔相應任務,繼續提供完整服務。
用剛剛在test.conf做下這個設置,test.conf原文件:
server {
listen 80;
server_name 119.29.72.246;
location / {
proxy_pass http://119.29.72.246:8081;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
}
}
改寫后的最終文件:
upstream roots {
server 119.29.72.246:8081;
}
server {
listen 80;
server_name 119.29.72.246;
location / {
proxy_pass http://roots;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
}
}
可以看到這個變動只是把server的proxy_pass對應的提取出來,然后在upstream里單獨設置。當想設置負載均衡時,只需在upstream里繼續添加主機Ip,如:
upstream roots {
server 119.29.72.246:8081;
server 119.221.72.246:3000;
server 119.221.12.246:3000;
...
}
這樣就可以設置多臺主機為119.29.72.246這個訪問提供服務了。
更多干貨請訪問https://github.com/osjj/。