FreeBSD 安裝 Node.js + MongoDB 與部署 App


簡單記錄一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# 先更新 index 和 ports
cd /usr/ports && make fetchindex
cvsup -L 2 -h cvsup.tw.FreeBSD.org /usr/share/examples/cvsup/ports-supfile

# 通過 ports 安裝 node
cd /usr/ports/www/node
make install clean

# 通過 ports 安裝 mongodb (需等待)
cd /usr/ports/databases/mongodb
make install clean

(選擇 V8 引擎取代 SpiderMonkey)
(之後的用預設)
(之後再用預設)

# 將安裝 mongodb 時新增的 mongodb 用戶 shell 改為 nologin
chsh -s /usr/sbin/nologin mongodb

# 通過 ports 安裝 supervisor
# Python 寫的,用來管理 node app
cd /usr/ports/sysutils/py-supervisor
make install clean

# 重新進入 root 環境,使上面安裝的指令可作用
su -

# 接下來,設定 supervisor
# 編輯 supervisord.conf
# ports 預設位置是這裡.
# 可複製到 /etc/supervisord.conf
vim /usr/local/etc/supervisord.conf

# 裡面的內容如下
# ================
[unix_http_server]
file=/var/run/supervisor/supervisor.sock
chmod=0700
chown=www:www

[supervisord]
user=root

;最後在最下面加入 (前面加 ; 代表註解)
[program:node_app]
command=/usr/local/bin/node /home/[用戶]/node-app.example.com/app.js
directory=/home/[用戶]/node-app.example.com
autostart=true
startsecs=5
user=[執行者]
;redirect_stderr=true
;stdout_logfile = /var/log/supervisord/node_note.log
# ================

# 將 sock 存放目錄設為 www 用戶和用戶組才可讀取
chown -Rf www:www /var/run/supervisor

# 之後修改 nginx 加入 proxy 轉向到內部端口
server {
listen 80;
charset utf-8;
server_name node-app.example.com;
root /home/[用戶]/node-app.example.com;

location / {
proxy_pass http://127.0.0.1:[端口]/;
}
}

# 運行 MongoDB
mongod --dbpath /var/db/mongodb/ --logpath /var/log/mongodb.log --fork

# 進入命令窗口,測試操作資料庫(或者加權限)
mongo 127.0.0.1:27017

# 簡單記錄一下權限設置,
# 重新運行 MongoDB 後,再用 admin 時就需要權限了
use admin
db.auth("username", "password")
exit

killall mongod
mongod --dbpath /var/db/mongodb/ --logpath /var/log/mongodb.log --fork --auth

# 為確保開發環境和上線環境內的依賴套件一致使用如下指令
# 更新自機中的 NPM 確保可使用 npm shrinkwrap 指令 (>= 1.1.2)
# 生成 npm-shrinkwrap.json
npm update npm -g
npm shrinkwrap

# 再到主機中更新 npm
# 再安裝 app (應用) 的依賴套件
npm update npm -g
npm install

# 之後兩邊再比對一下 npm list 是否一樣
npm list

# 最後通過 supervisor 執行 node app 應用
# 使 node app 應用打開 127.0.0.1:[端口] 的端口
supervisord -c /usr/local/etc/supervisord.conf
supervisorctl start node_app

# 當 supervisord 運行後,以後就可經 supervisorctl 操作
supervisorctl stop [node_app],停止某個 supervisord.conf 中的 [program:(應用)]
supervisorctl start node_app,運行某個應用
supervisorctl restart programxxx,重新運行某個應用
supervisorctl stop all,停止重部應用
supervisorctl reload,重新載入最新的配置文件,並按照配置文件執行每個應用

*** 註 ***
當修改 supervisord.conf 後,需使用 reload 重新加載,start,stop,restart都不會加新文件

# 最後將 supervisor 和 mongod 都放到 /etc/rc.local
# ===========
# Supervisord (因不是預設的檔案位置,所以不用前者)
#supervisord_enable="YES"
supervisord -c /usr/local/etc/supervisord.conf

# MongoDB
mongod --dbpath /var/db/mongodb/ --logpath /var/log/mongodb.log --fork --auth
參考:

http://cuppster.com/2011/05/12/diy-node-js-server-on-amazon-ec2/
http://serverfault.com/questions/134179/how-do-i-automatically-start-supervisor-on-boot-in-freebsd
http://feilong.me/2011/03/monitor-processes-with-supervisord
http://www.aiezu.com/Article/FreeBSD_MongoDB.aspx