溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

在Ubuntu 14.04上如何設(shè)置生產(chǎn)環(huán)境可用的Node.js

發(fā)布時(shí)間:2021-10-19 09:50:42 來源:億速云 閱讀:106 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關(guān)在Ubuntu 14.04上如何設(shè)置生產(chǎn)環(huán)境可用的Node.js的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

在Ubuntu 14.04上設(shè)置生產(chǎn)環(huán)境可用的Node.js

前言

Node.js是一個(gè)開源的JavaScript運(yùn)行時(shí)環(huán)境,開發(fā)者可以用它方便的構(gòu)建服務(wù)器端應(yīng)用和網(wǎng)絡(luò)應(yīng)用。Node.js可在Linux、OS X、FreeBSD和Windows上運(yùn)行,在其上運(yùn)行的應(yīng)用使用JavaScript編寫。Node.js應(yīng)用可以在命令行運(yùn)行,然而本文的目的在于以服務(wù)的方式運(yùn)行Node.js應(yīng)用,讓這些應(yīng)用可以在系統(tǒng)重啟或遇到錯(cuò)誤時(shí)自動(dòng)重啟,以配合生產(chǎn)環(huán)境的需求。

本文將設(shè)置一個(gè)可用于線上的Node.js環(huán)境,該環(huán)境包含兩臺(tái)Ubuntu 14.04服務(wù)器:一臺(tái)運(yùn)行PM2管理下的Node.js應(yīng)用,另一臺(tái)是踏板服務(wù)器,讓用戶通過Nginx反向代理登陸到應(yīng)用服務(wù)器。

本教程有一個(gè)CentOS版本,可以在這里查閱。

前提條件

本教程中的兩臺(tái)Ubuntu 14.04之間通過私有網(wǎng)絡(luò)連接(在同一數(shù)據(jù)中心內(nèi)),兩臺(tái)服務(wù)器的命名如下:

  • app:安裝了Node.js運(yùn)行時(shí)、Node.js應(yīng)用和PM2的服務(wù)器

  • web:安裝了Nginx(做反向代理)的踏板服務(wù)器。用戶訪問本機(jī)的IP以連接到app服務(wù)器。

你也可以只用單臺(tái)服務(wù)器完成本教程,只需要把教程中涉及app服務(wù)器私有IP的地方都換成本機(jī)IP(127.0.0.1)即可。

整個(gè)部署的圖示如下:

在Ubuntu 14.04上如何設(shè)置生產(chǎn)環(huán)境可用的Node.js

在開始操作之前,你的兩臺(tái)服務(wù)器上都需要設(shè)置好具備sudo權(quán)限的普通非root用戶,我們需要用這個(gè)用戶名登陸到服務(wù)器上。如果你還沒設(shè)置過,可以參閱我們的Ubuntu 14.04初始配置教程。

如果你想通過域名(而不是IP)來訪問web服務(wù)器,則你需要購買一個(gè)域名,然后參閱如下教程完成設(shè)置:

  • How To Set Up a Host Name with DigitalOcean

  • How to Point to DigitalOcean Nameservers From Common Domain Registrars

上述條件達(dá)成后,進(jìn)入下述步驟開始在app服務(wù)器上安裝Node.js。

安裝Node.js

我們將在app服務(wù)器上安裝最新LTS版本的Node.js。

在app服務(wù)器上,運(yùn)行apt-get更新命令:

sudo apt-get update12

然后安裝gitnpm的安裝需要git):

sudo apt-get install git12

到Node.js官網(wǎng)找到Linux軟件包(.tar.xz)的下載連接,右鍵復(fù)制地址。本教程撰文時(shí)的最新LTS版本是4.2.3,如果你希望安裝最新的stable版本,可以到stable版本下載頁面獲取下載地址。

進(jìn)入home目錄,用wget下載Node.js的源代碼:

cd ~

wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz1234

下載完畢之后,解壓縮到node目錄下:

mkdir node

tar xvf node-v*.tar.?z --strip-components=1 -C ./node1234

解壓縮之后,壓縮包就沒用了??梢曰氐絼偛诺哪夸泟h除之前下載的壓縮包:

cd ~

rm -rf node-v*1234

然后,我們要配置npm的全局prefix,用于創(chuàng)建Node軟件包的符號(hào)連接(symbolic link)。我們?cè)谶@里將默認(rèn)目錄設(shè)置為/usr/local

mkdir node/etc

echo 'prefix=/usr/local' > node/etc/npmrc1234

現(xiàn)在,將nodenpm的二進(jìn)制文件移動(dòng)到安裝路徑下(我們的安裝路徑是/opt/node):

sudo mv node /opt/12

然后,將文件的所有者設(shè)置為root

sudo chown -R root: /opt/node12

然后,為nodenpm的二進(jìn)制文件設(shè)置符號(hào)鏈接。我們使用的是/usr/local/bin

sudo ln -s /opt/node/bin/node /usr/local/bin/node

sudo ln -s /opt/node/bin/npm /usr/local/bin/npm1234

最后,確認(rèn)Node是否正確安裝:

node -v12

如此,Node.js運(yùn)行時(shí)的安裝就完成了?,F(xiàn)在開始編寫我們的Node.js應(yīng)用。

創(chuàng)建Node.js應(yīng)用

我們將創(chuàng)建一個(gè)簡(jiǎn)單的“Hello World”應(yīng)用,該應(yīng)用針對(duì)所有的HTTP請(qǐng)求返回“Hello World”。你也可以直接部署你自己的應(yīng)用,只是要確保你的應(yīng)用監(jiān)聽的IP地址和端口是正確的。

我們希望該應(yīng)用響應(yīng)來自反向代理服務(wù)器“web”的請(qǐng)求,因此需要在app服務(wù)器配置私有網(wǎng)絡(luò)的服務(wù)器間通訊。你需要知道app服務(wù)器的私有網(wǎng)絡(luò)地址。

對(duì)于DigitalOcean的用戶而言,你的droplet的私有IP可以在Metadata服務(wù)中查詢——在app服務(wù)器上使用curl命令獲取此IP:

curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address 
12

該命令返回的結(jié)果就是該服務(wù)器的私有IP,將它復(fù)制下來以備后續(xù)使用。

Hello World代碼

現(xiàn)在,創(chuàng)建我們的Node.js應(yīng)用。本教程使用vi編輯器,創(chuàng)建的應(yīng)用叫做hello.js

cd ~

vi hello.js1234

將下面的代碼復(fù)制到文件里。記得把a(bǔ)pp服務(wù)器的私有IP(兩處APP_PRIVATE_IP_ADDRESS部分的內(nèi)容)替換成你自己的。下面定義使用的端口是8080,如果有需要,你也可以改成自己的(只能是非admin的端口,即1024以上的):

hello.js

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8080, 'APP_PRIVATE_IP_ADDRESS');
console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:8080/');1234567

保存退出。

該應(yīng)用能夠監(jiān)聽指定的IP地址和端口,并返回“Hello World”以及200 HTTP狀態(tài)碼。該應(yīng)用目前僅能被同一私有網(wǎng)絡(luò)上的服務(wù)器訪問——比如我們的web服務(wù)器。

測(cè)試應(yīng)用(可選)

要測(cè)試應(yīng)用,可以在app服務(wù)器上敲入如下命令:

node hello.js12

注:用本指令運(yùn)行Node.js應(yīng)用的時(shí)候,其他發(fā)給該服務(wù)器的命令會(huì)被阻擋。測(cè)試結(jié)束后,記得用CTRL+C退出應(yīng)用。

打開另一個(gè)終端進(jìn)程,連接到web服務(wù)器上,從該服務(wù)器訪問app服務(wù)器的私有IP。我們用curl命令(記得將APP_PRIVATE_IP_ADDRESS和8080端口替換成你自己的):

curl http://APP_PRIVATE_IP_ADDRESS:808012

如果輸出的內(nèi)容是下面這樣的,說明應(yīng)用運(yùn)行正常,測(cè)試通過:

Output:
Hello World123

否則,請(qǐng)回去檢查Node.js應(yīng)用的運(yùn)行狀態(tài),以及上面配置的IP地址和端口是否有誤。

測(cè)試完成之后,回到app服務(wù)器上CTRL+C退出應(yīng)用。

安裝PM2

PM2是一個(gè)Node.js應(yīng)用的進(jìn)程管理器。PM2將Node.js應(yīng)用作為守護(hù)進(jìn)程(服務(wù))進(jìn)行管理,這樣比較方便。

我們將用NPM(Node軟件包模塊)在app服務(wù)器上安裝PM2。輸入下述命令:

sudo npm install pm2 -g12

使用PM2管理應(yīng)用

PM2的用法很簡(jiǎn)單。我們將介紹一些PM2的基本用法。

啟動(dòng)應(yīng)用

首先,使用pm2 start命令啟動(dòng)我們的hello.js,這會(huì)讓應(yīng)用在后臺(tái)運(yùn)行:

pm2 start hello.js12

該命令同時(shí)將該應(yīng)用加入到了PM2的進(jìn)程列表中。每次用PM2啟動(dòng)一個(gè)應(yīng)用時(shí),終端都會(huì)返回如下輸出:

Output:
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │     memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘1234567

從上面可以看到,PM2會(huì)給運(yùn)行的應(yīng)用自動(dòng)分配一個(gè)應(yīng)用名(就是該應(yīng)用的文件名減掉.js后綴)以及一個(gè)PM2 id。PM2同時(shí)還維護(hù)其他信息,如進(jìn)程的PID、當(dāng)前狀態(tài)、以及內(nèi)存使用情況。

在PM2下運(yùn)行的應(yīng)用如果崩潰或者被kill,則會(huì)自動(dòng)重啟。如果希望在系統(tǒng)重啟(boot或reboot)后也能夠自動(dòng)運(yùn)行,則可以使用PM2的startup子命令。

startup子命令會(huì)創(chuàng)建一個(gè)啟動(dòng)腳本,用于在服務(wù)器啟動(dòng)時(shí)打開PM2以及其所管理的所有進(jìn)程。你需要在命令中指定操作系統(tǒng),在本教程中是ubuntu

pm2 startup ubuntu12

返回的結(jié)果中,最后一行是一個(gè)命令,這個(gè)命令需要我們手動(dòng)執(zhí)行一次(以superuser的權(quán)限):

Output:
[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"12345

把它復(fù)制下來,運(yùn)行之,就實(shí)現(xiàn)了系統(tǒng)重啟后應(yīng)用也能自動(dòng)啟動(dòng)的功能:

sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"12

PM2的其他用法(可選)

PM2還有其他一些子選項(xiàng),可用于應(yīng)用的管理和信息查詢。PM2的幫助頁面可以通過運(yùn)行pm2調(diào)出,里面列出了更詳細(xì)的用法。本文只是簡(jiǎn)單的介紹一些。

停止應(yīng)用(用應(yīng)用名或PM2 id指定):

pm2 stop example12

重啟應(yīng)用(用應(yīng)用名或PM2 id指定):

pm2 restart example12

列出當(dāng)前管理中的應(yīng)用列表:

pm2 list12

關(guān)于指定應(yīng)用的詳細(xì)信息(用應(yīng)用名或PM2 id指定):

pm2 info example12

顯示應(yīng)用狀態(tài)、CPU、內(nèi)存使用情況:

pm2 monit12

現(xiàn)在我們完成了Node.js應(yīng)用的啟動(dòng)和PM2的設(shè)置,可以去web服務(wù)器設(shè)置反向代理了。

設(shè)置反向代理服務(wù)器

我們將用Nginx將用戶的訪問請(qǐng)求反向代理到app服務(wù)器的私有IP上。本教程將從頭設(shè)置一個(gè)Nginx,如果你的系統(tǒng)上已經(jīng)配置過Nginx,則可以直接將下文的location部分內(nèi)容復(fù)制粘貼到你自己的配置文件里(不要跟現(xiàn)有的配置起沖突就行)。

進(jìn)入web服務(wù)器,更新軟件列表:

sudo apt-get update12

用apt-get安裝Nginx:

sudo apt-get install nginx12

用vi打開Nginx配置文件:

sudo vi /etc/nginx/sites-available/default12

刪掉原來的內(nèi)容,將下面的內(nèi)容復(fù)制粘貼進(jìn)去。其中,server_name部分設(shè)置為web服務(wù)器本機(jī)的IP或域名,APP_PRIVATE_IP_ADDRESS設(shè)置為app服務(wù)器的私有IP。如果上面步驟中使用的不是8080端口,也需要修改:

/etc/nginx/sites-available/default

server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}123456789101112131415

上述配置將訪問web服務(wù)器根地址的請(qǐng)求轉(zhuǎn)發(fā)到了app服務(wù)器上,即,針對(duì)http://example.com/的訪問,其請(qǐng)求被轉(zhuǎn)發(fā)到APP_PRIVATE_IP_ADDRESS8080端口上,其上的Node.js應(yīng)用返回的內(nèi)容再通過web服務(wù)器返回到瀏覽器。

我們還可以在web服務(wù)器上添加更多的轉(zhuǎn)發(fā),這只需要添加location內(nèi)容塊即可。比如說,我們想把針對(duì)http://example.com/app2的訪問都轉(zhuǎn)發(fā)到APP_PRIVATE_IP_ADDRESS8081端口上,就可以添加下面的內(nèi)容:

    location /app2 {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8081;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }123456789

編輯完畢之后,保存退出。

在web服務(wù)器上重啟Nginx:

sudo service nginx restart12

如果我們的Node.js應(yīng)用運(yùn)行正常,應(yīng)用配置和Nginx配置都正確,則我們?cè)跒g覽器里訪問web服務(wù)器的時(shí)候,就能夠訪問到我們的應(yīng)用。現(xiàn)在就到瀏覽器里輸入web服務(wù)器的公網(wǎng)IP或域名試試看吧!

感謝各位的閱讀!關(guān)于“在Ubuntu 14.04上如何設(shè)置生產(chǎn)環(huán)境可用的Node.js”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI