您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么在CentOS6.x服務器上配置Nodejs”,在日常操作中,相信很多人在怎么在CentOS6.x服務器上配置Nodejs問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么在CentOS6.x服務器上配置Nodejs”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
首先創建一個playbook文件,我們盡量讓它保持簡單。
--- - hosts: all tasks:
定義一些運行這個playbook的主機,然后下面列出一系列的tasks。
1.1 添加額外的源
在準備應用一個服務器的時候,為了確保指定些軟件包可以用或者在***的版本,管理員經常首先添加額外的源。
下面的腳本,我們想要添加EPEL和Remi源,以便于我們可以得到類似node.js的軟件包。如果使用shell腳本處理的話,如下所示。
# 導入 Remi GPG 密鑰 – 請參閱: http://rpms.famillecollet.com/RPM-GPG-KEY-remi wget http://rpms.famillecollet.com/RPM-GPG-KEY-remi \ -O /etc/pki/rpm-gpg/RPM-GPG-KEY-remi rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi # 安裝 Remi repo, Remi repo里面包含了很多的PHP擴展 rpm -Uvh --quiet \ http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# 安裝EPEL源
yum install epel-release
# 安裝 Node.js (npm + 和它的依賴關系).
yum --enablerepo=epel install npm
這個shell腳本用于導入EPEL和Remi的GPG keys,然后添加這源,***安裝Nodejs。這對于簡單的部署是沒有問題的,但是運行這么多命令是比較笨的方法,如果你的連接不小心斷開了,那么你的腳本也會停止的。而如果這個時候,你的腳本剛準備完成呢?
提示:如果你想跳過指定的步驟,你可以跳過添加GPG keys的步驟,只需要在運行命令的時候加上—nogpgcheck.或者在Ansible中,yum模塊中設置disable_gpg_check參數為yes,但是***還是添加GPG keys。使用GPG,你可以知道包的作者是誰,包有沒有修改稿,除非你知道你正在做什么,否則***不要禁止GPG檢查。
Ansible讓事情變的更有健壯性,下面使用Ansible的案例顯得更加詳細,它和上面的shell腳本有同樣的功能,但是更容易理解,更加結構化。 下面使用了Ansible的變量和其它的一些有用的特性。接著上面的playbook,我們繼續往下寫。
tasks: - name: Import Remi GPG key rpm_key: "key={{ item }} state=present" with_items: - "http://rpms.famillecollet.com/RPM-GPG-KEY-remi" - name: Install Remi repo. command: "rpm -Uvh --force {{ item.href }} creates={{ item.creates }}" with_items: - href: "http://rpms.famillecollet.com/enterprise/remi-release-6.rpm" creates: "/etc/yum.repos.d/remi.repo" - name: Install epel repo yum: name=epel-release state=present - name: Stop the firewall service: name=iptables state=stopped - name: Install NodeJS and npm yum: name=npm state=present enablerepo=epel
我們看一下具體步驟。
rpm_key 是一個的Ansible模塊用于從你的RPM數據庫中添加或移除GPG key。我們正在從Remi的源中導入一個key。
因為Ansible沒有rpm命令,因此我們使用command模塊來使用rpm命令,這樣我們可以做其它的兩件事情。a) 使用creatse參數告訴Ansible什么時候不運行這個命令,這個例子里,我們告訴Ansible,這個命令成功執行后,將會創建那些文件。當這個文件存在的時候,這個命令將不會運行。b) 使用with_items定義一個URL和用于creates檢查的文件。
yum負責安裝EPEL源。
因為這個服務器我們將用來做測試用,所以我們使用service模塊禁止系統防火墻,防止它干涉我們測試。
yum安裝Node.js(同時安裝npm,Node’s package manager),我們使用enablerepo來指定在EPEL源中搜索它,當然也可以使用disablerepo來指定不使用那個源(repository)。
因為NPM現在被安裝了,我們使用Ansible 的npm模塊安裝Node.JS工具forever,forever來運行我們的app,設置global為yes,告訴NPM安裝模塊在/usr/lib/node_modules位置,然后所有的用戶都可以使用它了。
我們已經有一個Node.js app 服務器了,讓我們部署一個簡單的Node.js app,在80端口響應HTTP請求
1.2 部署一個Node.js app
這一步是在我們的服務器上部署簡單的Node.js app。首先,通過創建一個新的文件夾,我們創建一個簡單的Node.js app,這個文件夾和你上面的ymal文件處于相同的路徑下面。然后創建新的文件,app.js,在這個文件夾里面,編輯下面的文件
//app.js // 加載express 模塊. var express = require('express'), app = express.createServer(); // 響應”/”請求為 'Hello World'. app.get('/', function(req, res){ res.send('Hello World! Yunzhonge'); }); // 像一個真實服務器那樣監聽在80端口 app.listen(80); console.log('Express server started successfully.')
不要擔心node.js的語法的和我們的案例。我們需要一個快速的部署案例,這個案例可以用Python,Perl,Java,PHP或者其他編程語言來寫,但是因為Node是非常簡單的語言,運行一個簡單的輕量級的環境,它是一個非常不錯的語言來測試你的服務器。
因為這個小app依賴于Express(一個簡單的Node的HTTP框架),我們同樣需要通過一個package.json文件告訴NPM關于它的依賴關系,這個文件與app.js處于相同的路徑下面。
{ "name": "examplenodeapp", "description": "Example Express Node.js app.", "author": "yunzhonghe", "dependencies": { "express": "3.x.x" }, "engine": "node >= 0.10.6" }
然后添加下面內容到你的playbook里面,拷貝整個app到這個服務器,然后讓npm下載依賴的東西,(這里為express.)
- name: Ensure Node.js app folder exists. file: "path={{ node_apps_location }} state=directory" - name: Copy example Node.js app to server. copy: "src=app dest={{ node_apps_location }}" - name: Install app dependencies defined in package.json. npm: "path={{ node_apps_location }}/app"
首先我們使用file模塊確保我們安裝的app目錄存在。{{ node_apps_location }}變量可以在vars部分定義,vars部分位于playbook的頂部。當然也可以在inevntory中定義,也可以在運行ansible-playbook的時候定義。
我們使用Ansible的copy模塊拷貝這整個app文件夾到測試服務器,copy模塊可以聰明的區分單一的文件和包含文件的目錄,然后在目錄中遞歸,就像rsync或scp。Ansible的copy模塊在單個文件或少量文件時候非常好用,但是如果你拷貝大量的文件,嵌套幾層的目錄,copy模塊就不能勝任。這種情形下,如果你想拷貝整個目錄,你***考慮使用synchronize模塊,如果你想拷貝一個歸檔,然后展開它,***使用unarchive模塊。
第三步,我們使用npm模塊,這次除了app的路徑之外沒有額外的參數。這告訴NPM來解析package.json文件,然后確保所有的依賴關系都存在。
已經都完成了,***一步是啟動這個app
1.3 運行一個Node.js app
我們現在使用forever來啟動這個app。
- name: Check list of running Node.js apps. command: forever list register: forever_list changed_when: false - name: Start example Node.js app. command: "forever start {{ node_apps_location }}/app/app.js" when: "forever_list.stdout.find('{{ node_apps_location }}/app/app.js') == -1"
在這個play中,我們做了兩件新的事情。
register 創建了一個新的變量,forever_list,以便于下次task的時候使用用于判斷是否允運行下一個命令。register用于保存命令的輸出包括標準輸出和錯誤輸出,然后賦給變量名。
changed_when告訴Ansible什么時候這個play會導致改變。在這里,forever list命令永遠都不會導致服務器的改變,因為我們指定了false。
第二個play實際上使用forever啟動了這個app。我們可以啟動這個app通過調用node {{ node_apps_location }}/app/app.js,不過這種方式更難控制。
Forever跟蹤它管理的Node app,然后我們使用Forever的list選項,打印一系列的運行app。我們***次運行這個playbook時候,這list明顯是空的,但是判斷為空之后就會運行,如果app正在運行,我們不會啟動另外一個實例了,為了避免這種情形,我們使用when語句,指定,當app的路徑不在forever list的輸出信息的時候,我們啟動這個app。
1.4 Node.js app服務器總結。
在這時候上,你已經完成了playbook,然后安裝一個簡單的Node.js app,在80端口響應HTTP請求。
為了運行這個playbook在一個服務器上,使用下面的命令,傳遞node_apps_location變量通過命令
ansible-playbook --extra-vars="node_apps_location=/usr/local/opt/node"
當服務器完成配置和部署服務器的時候,在瀏覽器中指定測試服務器的主機名查看效果
簡單,但是有效,我們已經在少于50行的YMAL文件中配置了一個Nodejs應用服務器
到此結束,非常感謝朋友們的關注。
1.5 問題
問題1:當我在給100臺服務器進行nodejs app部署的時候,到20臺中斷了,我再重新執行,他是一個怎么個過程,前面已經安裝的軟件包,進行的配置的會重新的再進行執行一遍還是跳過呢?麻煩大牛解答
答:Ansible自身有冪等特性使其能有效保證所有操作的安全可靠性,針對執行失敗的情況會自動在家目錄下生成 對應的錯誤服務器列表 通過 --limit 再次有針對性的完成剩余工作
問題2: 請問大俠的nodejs 是通過工具部署的? npm 好復雜啊
哈,npm的配置是一次性的,初始配置確認比較耗時且麻煩,yum 或 npm 各有優劣,視業務而定吧
問題3: --extra-vars= 請問企業中應用的多嗎?
答:多,最少在我們的工作中一直有應用,前幾期的分享大家應該也有看到,這個參數應用的很多。但官網介紹的卻一筆代過。還是建議大家多用
問題4:當我通過ansible執行任務的過程中,會出現任務被長時間卡主的原因,這一般需要重哪些地方排查呢
答:很多朋友遇到這個問題,一直有問,根據個人的經驗建議如下幾個方面排查:
確實當前命令執行時間不長,
pong 檢測服務器存活
有些命令需連接外網下載更新耗時較長的可檢查網絡寬帶情況
-vvv 是非常好的排查方式
如若卻無解,/etc/ansible/ansible.cfg 中縮短操作執行時長,等待最終結束嘗試
到此,關于“怎么在CentOS6.x服務器上配置Nodejs”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。