在Ubuntu 14.04上設置生產環境可用的Node.js
在Ubuntu 14.04上設置生產環境可用的Node.js
提供:ZStack社區
前言
Node.js是一個開源的JavaScript運行時環境,開發者可以用它方便的構建服務器端應用和網絡應用。Node.js可在Linux、OS X、FreeBSD和Windows上運行,在其上運行的應用使用JavaScript編寫。Node.js應用可以在命令行運行,然而本文的目的在於以服務的方式運行Node.js應用,讓這些應用可以在系統重啟或遇到錯誤時自動重啟,以配合生產環境的需求。
本文將設置一個可用於線上的Node.js環境,該環境包含兩臺Ubuntu 14.04服務器:一臺運行PM2管理下的Node.js應用,另一臺是踏板服務器,讓用戶通過Nginx反向代理登陸到應用服務器。
本教程有一個CentOS版本,可以在這裏查閱。
前提條件
本教程中的兩臺Ubuntu 14.04之間通過私有網絡連接(在同一數據中心內),兩臺服務器的命名如下:
app:安裝了Node.js運行時、Node.js應用和PM2的服務器
web:安裝了Nginx(做反向代理)的踏板服務器。用戶訪問本機的IP以連接到app服務器。
你也可以只用單臺服務器完成本教程,只需要把教程中涉及app服務器私有IP的地方都換成本機IP(127.0.0.1
)即可。
整個部署的圖示如下:
在開始操作之前,你的兩臺服務器上都需要設置好具備sudo
權限的普通非root用戶,我們需要用這個用戶名登陸到服務器上。如果你還沒設置過,可以參閱我們的Ubuntu 14.04初始配置教程。
如果你想通過域名(而不是IP)來訪問web服務器,則你需要購買一個域名,然後參閱如下教程完成設置:
How To Set Up a Host Name with DigitalOcean
How to Point to DigitalOcean Nameservers From Common Domain Registrars
上述條件達成後,進入下述步驟開始在app服務器上安裝Node.js。
安裝Node.js
我們將在app服務器上安裝最新LTS版本的Node.js。
在app服務器上,運行apt-get更新命令:
sudo apt-get update12
然後安裝git
(npm
的安裝需要git
):
sudo apt-get install git12
到Node.js官網找到Linux軟件包(.tar.xz)的下載連接,右鍵復制地址。本教程撰文時的最新LTS版本是4.2.3,如果你希望安裝最新的stable版本,可以到stable版本下載頁面獲取下載地址。
進入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
解壓縮之後,壓縮包就沒用了。可以回到剛才的目錄刪除之前下載的壓縮包:
cd ~ rm -rf node-v*1234
然後,我們要配置npm
的全局prefix
,用於創建Node軟件包的符號連接(symbolic link)。我們在這裏將默認目錄設置為/usr/local
:
mkdir node/etc echo ‘prefix=/usr/local‘ > node/etc/npmrc1234
現在,將node
和npm
的二進制文件移動到安裝路徑下(我們的安裝路徑是/opt/node
):
sudo mv node /opt/12
然後,將文件的所有者設置為root
:
sudo chown -R root: /opt/node12
然後,為node
和npm
的二進制文件設置符號鏈接。我們使用的是/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
最後,確認Node是否正確安裝:
node -v12
如此,Node.js運行時的安裝就完成了。現在開始編寫我們的Node.js應用。
創建Node.js應用
我們將創建一個簡單的“Hello World”應用,該應用針對所有的HTTP請求返回“Hello World”。你也可以直接部署你自己的應用,只是要確保你的應用監聽的IP地址和端口是正確的。
我們希望該應用響應來自反向代理服務器“web”的請求,因此需要在app服務器配置私有網絡的服務器間通訊。你需要知道app服務器的私有網絡地址。
對於DigitalOcean的用戶而言,你的droplet的私有IP可以在Metadata服務中查詢——在app服務器上使用curl
命令獲取此IP:
curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address 12
該命令返回的結果就是該服務器的私有IP,將它復制下來以備後續使用。
Hello World代碼
現在,創建我們的Node.js應用。本教程使用vi
編輯器,創建的應用叫做hello.js
:
cd ~ vi hello.js1234
將下面的代碼復制到文件裏。記得把app服務器的私有IP(兩處APP_PRIVATE_IP_ADDRESS
部分的內容)替換成你自己的。下面定義使用的端口是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
保存退出。
該應用能夠監聽指定的IP地址和端口,並返回“Hello World”以及200
HTTP狀態碼。該應用目前僅能被同一私有網絡上的服務器訪問——比如我們的web服務器。
測試應用(可選)
要測試應用,可以在app服務器上敲入如下命令:
node hello.js12
註:用本指令運行Node.js應用的時候,其他發給該服務器的命令會被阻擋。測試結束後,記得用CTRL+C
退出應用。
打開另一個終端進程,連接到web服務器上,從該服務器訪問app服務器的私有IP。我們用curl
命令(記得將APP_PRIVATE_IP_ADDRESS
和8080端口替換成你自己的):
curl http://APP_PRIVATE_IP_ADDRESS:808012
如果輸出的內容是下面這樣的,說明應用運行正常,測試通過:
Output: Hello World123
否則,請回去檢查Node.js應用的運行狀態,以及上面配置的IP地址和端口是否有誤。
測試完成之後,回到app服務器上CTRL+C
退出應用。
安裝PM2
PM2是一個Node.js應用的進程管理器。PM2將Node.js應用作為守護進程(服務)進行管理,這樣比較方便。
我們將用NPM(Node軟件包模塊)在app服務器上安裝PM2。輸入下述命令:
sudo npm install pm2 -g12
使用PM2管理應用
PM2的用法很簡單。我們將介紹一些PM2的基本用法。
啟動應用
首先,使用pm2 start
命令啟動我們的hello.js
,這會讓應用在後臺運行:
pm2 start hello.js12
該命令同時將該應用加入到了PM2的進程列表中。每次用PM2啟動一個應用時,終端都會返回如下輸出:
Output: ┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐ │ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │ watching │ ├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤ │ hello │ 0 │ fork │ 5871 │ online │ 0 │ 0s │ 9.012 MB │ disabled │ └──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘1234567
從上面可以看到,PM2會給運行的應用自動分配一個應用名(就是該應用的文件名減掉.js
後綴)以及一個PM2 id。PM2同時還維護其他信息,如進程的PID、當前狀態、以及內存使用情況。
在PM2下運行的應用如果崩潰或者被kill,則會自動重啟。如果希望在系統重啟(boot或reboot)後也能夠自動運行,則可以使用PM2的startup
子命令。
startup
子命令會創建一個啟動腳本,用於在服務器啟動時打開PM2以及其所管理的所有進程。你需要在命令中指定操作系統,在本教程中是ubuntu
:
pm2 startup ubuntu12
返回的結果中,最後一行是一個命令,這個命令需要我們手動執行一次(以superuser的權限):
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
把它復制下來,運行之,就實現了系統重啟後應用也能自動啟動的功能:
sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"12
PM2的其他用法(可選)
PM2還有其他一些子選項,可用於應用的管理和信息查詢。PM2的幫助頁面可以通過運行pm2
調出,裏面列出了更詳細的用法。本文只是簡單的介紹一些。
停止應用(用應用名或PM2 id指定):
pm2 stop example12
重啟應用(用應用名或PM2 id指定):
pm2 restart example12
列出當前管理中的應用列表:
pm2 list12
關於指定應用的詳細信息(用應用名或PM2 id指定):
pm2 info example12
顯示應用狀態、CPU、內存使用情況:
pm2 monit12
現在我們完成了Node.js應用的啟動和PM2的設置,可以去web服務器設置反向代理了。
設置反向代理服務器
我們將用Nginx將用戶的訪問請求反向代理到app服務器的私有IP上。本教程將從頭設置一個Nginx,如果你的系統上已經配置過Nginx,則可以直接將下文的location
部分內容復制粘貼到你自己的配置文件裏(不要跟現有的配置起沖突就行)。
進入web服務器,更新軟件列表:
sudo apt-get update12
用apt-get安裝Nginx:
sudo apt-get install nginx12
用vi打開Nginx配置文件:
sudo vi /etc/nginx/sites-available/default12
刪掉原來的內容,將下面的內容復制粘貼進去。其中,server_name
部分設置為web服務器本機的IP或域名,APP_PRIVATE_IP_ADDRESS
設置為app服務器的私有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服務器根地址的請求轉發到了app服務器上,即,針對http://example.com/
的訪問,其請求被轉發到APP_PRIVATE_IP_ADDRESS
的8080
端口上,其上的Node.js應用返回的內容再通過web服務器返回到瀏覽器。
我們還可以在web服務器上添加更多的轉發,這只需要添加location
內容塊即可。比如說,我們想把針對http://example.com/app2
的訪問都轉發到APP_PRIVATE_IP_ADDRESS
的8081
端口上,就可以添加下面的內容:
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服務器上重啟Nginx:
sudo service nginx restart12
如果我們的Node.js應用運行正常,應用配置和Nginx配置都正確,則我們在瀏覽器裏訪問web服務器的時候,就能夠訪問到我們的應用。現在就到瀏覽器裏輸入web服務器的公網IP或域名試試看吧!
總結
至此,我們現在有一臺跑著Node.js應用的app服務器運行在一個Nginx反向代理服務器的後面,而且這臺反向代理服務器還可以同時給其他應用提供反向代理。
如果你想要加密web服務器和用戶之間的傳輸,可以查閱這篇介紹HTTPS(TLS/SSL)配置的教程。
本文來源自DigitalOcean Community。英文原文:How To Set Up a Node.js Application for Production on Ubuntu 14.04 by Mitchell Anicas
翻譯:lazycai
在Ubuntu 14.04上設置生產環境可用的Node.js