如何部署使用Systemd和Nginx的Node.js的应用

介绍

当将Web应用程序部署到Droplet时,可能很容易使用与开发中使用的相同类型的设置,即通过在终端中运行“ruby app.rb”或“node server.js”来启动服务器。 这是简单和容易,同时提供可见日志。 甚至可以使用“screen”或“tmux”或“nohup”让它继续运行,即使SSH会话被删除。 这是危险的:如果服务器崩溃,没有人在周围重新启动会发生什么?

人们可以用永远的crontab来照顾这。 本教程介绍了更强大,虽然更复杂的解决方案。 使用systemd (拱和Fedora,并在未来的CentOS提供),Web应用程序可以彻底管理:原木,正常运行时间,资源和通过安全的cgroup ,以及先进的后台程序启动都可以被访问,控制和统一的微调方式。

本教程使用一个简单的Node.js应用程序,但适用于大多数(如果不是全部的话)其他人(无论是Ruby,Python等)。 对于PHP Web应用程序,建议使用更专业的LAMPLEMP堆叠来代替。

将为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的...),有两种选择:要么使用系统的运行,或用户特定的安装(例如,使用NVMrbenvRVMvirtualenv中 ,等)。

使用系统节点

拱:

# 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
:提交费利克斯Saparelli
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏