SystemdとNginxを使用してNode.jsアプリケーションをデプロイする方法
序章
ドロップレットにWebアプリケーションをデプロイする場合、開発で使用されるのと同じ種類のセットアップを単純に使用したくなるかもしれません。 ターミナルで「rubyapp.rb」または「nodeserver.js」を実行してサーバーを起動します。 これはシンプルで簡単ですが、目に見えるログを提供します。 SSHセッションがドロップされた場合でも、「screen」、「tmux」、または「nohup」を使用して実行を継続することもできます。 これは危険です。サーバーがクラッシュし、サーバーを再起動する人がいない場合はどうなりますか?
foreverとcrontabを使用してこれを処理できます。 このチュートリアルでは、より複雑ではありますが、より堅牢なソリューションを紹介します。 systemd (ArchとFedora、および将来的にはCentOSで利用可能)を使用すると、Webアプリケーションを完全に管理できます: cgroups によるログ、稼働時間、リソース、セキュリティ、および高度なデーモンの起動すべてが統一された方法でアクセス、制御、微調整されます。
このチュートリアルでは、単純なNode.jsアプリケーションを使用しますが、すべてではないにしても、他のほとんどのアプリケーション(Ruby、Pythonなど)にも適用できます。 PHP Webアプリケーションの場合は、代わりに、より特殊なLAMPまたはLEMPスタックを使用することをお勧めします。
コマンドはFedoraとArchの両方に提供されますが、設定ミスや混乱を避けるためにどちらがどちらであるかを監視してください。 示されていない場合、コマンドは両方のシステムで同じです。 また、チュートリアルの内容と状況に適しているかどうかを理解するために、チュートリアルを段階的に試す前に、チュートリアル全体を読むことをお勧めします。
システムの予備知識
- systemdを備えたサーバー。 Arch LinuxとFedoraのドロップレットは、デフォルトでこのように構成されています。
- Nginx 、リバースプロキシhttpおよびwebsocketサーバーとして使用されます。
- Git 、nvmをインストールし、gitを使用している場合はアプリケーションをプルします。
- ルートアクセス。 通常のユーザーとしてログインし、 sudo すべてのコマンドにログインすることも、su-またはsudosu-にルートプロンプトにログインすることもできます。
パッケージをインストールする
アーチ:
# pacman -Sy # pacman -S nginx git
Fedora:
# yum install nginx git
アプリケーションの予備
これらはお好みに合わせてカスタマイズできる設定ですが、開始する前に決定して設定する必要があります。
ユーザー
アプリケーションは、独自の個別のユーザーアカウントで実行されます。 名前を選択してください。覚えやすく、保守しやすいように、アプリケーションに関連している必要があります。 ここでは、srv-node-sample
を使用します。
# useradd -mrU srv-node-sample
ポート
競合を避けるために、高いポートを選択してください。 ここでは「15301」を使用しています。
アプリケーションのセットアップ
アプリケーションの実行に必要なものをインストールすることから始めます。 Node.js(およびRuby、Python…)の場合、2つの選択肢があります。システムのランタイムを使用するか、ユーザー固有のインストールを使用するか(例: 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 [email protected]: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の構成に関するより詳細なチュートリアルについては、「NginxWebサーバーの構成方法」または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
Systemdセットアップ
/etc/systemd/system/node-sample.service
にアプリケーションのサービスファイルを作成します。
入力する必要のある変数がいくつかあります。
- [ノードバイナリ]これは、srv-node-sampleユーザーとしての「どのノード」の出力です。 上記の
/usr/bin/node
または~/.nvm/...
パスのいずれか。 - 【メインファイル】アプリケーションのメインファイルです。 ここでは、'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が変更され、アプリケーションが実際に強制終了されて再起動されたことを示しています。
WebSocket
アプリケーションがWebSocketを使用する場合は、次の行をNginx構成に追加する必要があります。
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1;
Nginxをリロードする必要があります:
# systemctl reload nginx