介绍
当将Web应用程序部署到Droplet时,可能很容易使用与开发中使用的相同类型的设置,即通过在终端中运行“ruby app.rb”或“node server.js”来启动服务器。 这是简单和容易,同时提供可见日志。 甚至可以使用“screen”或“tmux”或“nohup”让它继续运行,即使SSH会话被删除。 这是危险的:如果服务器崩溃,没有人在周围重新启动会发生什么?
人们可以用永远的crontab来照顾这。 本教程介绍了更强大,虽然更复杂的解决方案。 使用systemd (拱和Fedora,并在未来的CentOS提供),Web应用程序可以彻底管理:原木,正常运行时间,资源和通过安全的cgroup ,以及先进的后台程序启动都可以被访问,控制和统一的微调方式。
本教程使用一个简单的Node.js应用程序,但适用于大多数(如果不是全部的话)其他人(无论是Ruby,Python等)。 对于PHP Web应用程序,建议使用更专业的LAMP或LEMP堆叠来代替。
将为Fedora和Arch提供命令,请记住要避免错误配置和/或混淆。 当未指示时,两个系统的命令相同。 还建议您在逐步尝试之前阅读整个教程,以便了解它的含义以及它是否适合您的情况。
系统预备
与systemd的服务器。 默认情况下配置Arch Linux和FedoraDroplet。
nginx的 ,要被用作反向代理http和WebSocket的服务器。
Git的 ,安装NVM,如果用git拉你的应用程序。
Root权限。 也可以登录为普通用户和sudo的所有命令,或苏-或sudo su -可根提示。
安装软件包
拱:
# pacman -Sy
# pacman -S nginx git
Fedora:
# yum install nginx git
应用前言
这些是您可以根据自己的喜好自定义的设置,但它们必须在开始之前决定并设置。
用户
应用程序将在其自己的单独用户帐户中运行。 选择一个名称,它应该与应用程序相关,以便于记住和维护。 这里, srv-node-sample
被使用。
# useradd -mrU srv-node-sample
港口
为了避免冲突,请选择一个高端口。 这里,使用“15301”。
应用程序设置
首先安装应用程序运行所必需的。 对于Node.js的(和Ruby,Python的...),有两种选择:要么使用系统的运行,或用户特定的安装(例如,使用NVM , rbenv , RVM , virtualenv中 ,等)。
使用系统节点
拱:
# pacman -S nodejs
Fedora:
# yum install nodejs
使用用户特定的安装
这必须安装在应用程序的主目录,例如/home/srv-node-sample
,这是最容易被以该用户登录完成:
# su srv-node-sample
$ cd
$ curl https://raw.github.com/creationix/nvm/master/install.sh | sh
$ source ~/.nvm/nvm.sh
$ nvm install 0.10
$ nvm alias default 0.10
然后记下节点二进制文件的安装位置:
$ which node
/home/srv-node-sample/.nvm/v0.10.22/bin/node
部署应用程序
登录至srv-node-sample
,部署你的代码。 这只是一个例子,你的过程会有所不同。
$ git clone git@server.company.tld:user/repo.git .
$ npm install
$ grunt deploy
对于本教程,使用以下示例应用程序:
js
var http = require('http');
http.createServer(function(req, res) {
res.end('<h1>Hello, world.</h1>');
}).listen(15301);
然后返回到根:
$ exit
Nginx设置
本教程仅简要介绍的配置需要,对Nginx的配置更全面的教程,请参阅“如何配置Nginx的Web服务器”或Nginx的手册 。
将它放在您的服务器块中:
location / {
proxy_pass http://localhost:15301/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
然后设置它的守护进程:
# systemctl enable nginx
# systemctl restart nginx
系统设置
为应用程序创建一个服务文件,在/etc/systemd/system/node-sample.service
。
有几个变量需要填写:
[node binary]这是“哪个节点”作为srv-node-sample用户的输出。 无论是
/usr/bin/node
或~/.nvm/...
路径如上所述。[main file]这是您的应用程序的主文件。 这里,'index.js`。
不要忘了更换
srv-node-sample
!
[Service]
ExecStart=[node binary] /home/srv-node-sample/[main file]
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=node-sample
User=srv-node-sample
Group=srv-node-sample
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
现在启动服务:
# systemctl enable node-sample
# systemctl start node-sample
用法
状态
# systemctl status node-sample
node-sample.service
Loaded: loaded (/etc/systemd/system/node-sample.service; enabled)
Active: active (running) since Fri 2013-11-22 01:12:15 UTC; 35s ago
Main PID: 7213 (node)
CGroup: name=systemd:/system/node-sample.service
└─7213 /home/srv-node-sample/.nvm/v0.10.22/bin/node /home/srv-nod...
Nov 22 01:12:15 d02 systemd[1]: Started node-sample.service.
日志
# journalctl -u node-sample
-- Logs begin at Thu 2013-11-21 19:05:17 UTC, end at Fri 2013-11-22 01:12:15 UTC. --
Nov 22 01:12:15 d02 systemd[1]: Starting node-sample.service...
Nov 22 01:12:15 d02 systemd[1]: Started node-sample.service.
Nov 22 01:12:30 d02 node-sample[7213]: Sample message from application
重新启动,停止等
强制重新启动:
# systemctl restart node-sample
停止应用程序:
# systemctl stop node-sample
如果应用程序死亡或被终止,应用程序将自动重新启动:
# systemctl status node-sample
node-sample.service
Loaded: loaded (/etc/systemd/system/node-sample.service; enabled)
Active: active (running) since Fri 2013-11-22 01:12:15 UTC; 35s ago
Main PID: 7213 (node)
CGroup: name=systemd:/system/node-sample.service
└─7213 /home/srv-node-sample/.nvm/v0.10.22/bin/node /home/srv-nod...
Nov 22 01:12:15 d02 systemd[1]: Started node-sample.service.
# kill 7213
# systemctl status node-sample
node-sample.service
Loaded: loaded (/etc/systemd/system/node-sample.service; enabled)
Active: active (running) since Fri 2013-11-22 01:54:37 UTC; 6s ago
Main PID: 7236 (node)
CGroup: name=systemd:/system/node-sample.service
└─7236 /home/srv-node-sample/.nvm/v0.10.22/bin/node /home/srv-nod...
Nov 22 01:54:37 d02 systemd[1]: node-sample.service holdoff time over, sch...t.
Nov 22 01:54:37 d02 systemd[1]: Stopping node-sample.service...
Nov 22 01:54:37 d02 systemd[1]: Starting node-sample.service...
Nov 22 01:54:37 d02 systemd[1]: Started node-sample.service.
PID已更改,显示应用程序确实已被终止和重新启动。
Websockets
如果应用程序使用websockets,则必须将以下行添加到Nginx配置:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
和Nginx必须重新加载:
# systemctl reload nginx