序章


このチュートリアルは、Express、Geddy、またはSailsに基づくアプリを含むNode.jsアプリケーションを実行するためのUbuntuサーバーのセットアップを支援することを目的としています。 これらの手順は、セキュリティ上の間違いを回避するのに役立つだけでなく、次のような驚くべき利点も提供します。

  • アプリをrootとして実行することはありません。 したがって、アプリはより安全になります。

  • ポート80を使用してアプリを実行します。これは通常、rootユーザーのみがアクセスできます。 ( http://mysite.com などのカスタムURLを使用してアプリを実行できますが、ポートを指定する必要はありません。)

  • アプリケーションがクラッシュすると再起動し、未処理の例外のログが保持されます。

  • サーバーが起動すると、アプリケーションが再起動します。 サービスとして実行されます。

これらの手順は、読者がLinuxの基本的な知識しか持っていないことを前提としています。 不要な情報をスキップすることもできますが、手順を厳密に実行すると、いくつかの利点が得られる場合があります。

コードを実行するための安全なアカウントを作成する


DigitalOceanドロップレットを最初に設定したときに、rootアカウントを使用してログオンするための指示を受け取りました。 手順は次のようになりました。

ドロップレットにログインするには、ターミナルウィンドウを開き、次の文字列をコピーして貼り付ける必要があります。

ssh [email protected]

192.241.xxx.xxx‘はあなたによって異なることに注意してください。 仮想サーバーのセットアップ時にDigitalOceanから受け取った指示に従い、sshを使用してログオンするだけです。

私たちのほとんどが理解しているように、rootアカウントを使用してコードを実行し、敵対的な当事者がコードを侵害した場合、その当事者がVPSを完全に制御できる可能性があります。

これを回避するために、適切なパスワードを指定すればルート操作を実行できる安全なアカウントを設定しましょう。 このチュートリアルでは、セーフユーザーを「safeuser」と呼びましょう。好きな名前を付けることができます。 今のところ、rootユーザーとしてログオンし、次の手順に従います。

  • 内のフォルダでユーザーを作成します /home/safeuser/:
useradd -s /bin/bash -m -d /home/safeuser -c "safe user" safeuser
  • のパスワードを作成します safeuser -次のコマンドを入力すると、2回入力するように求められます。
passwd safeuser
  • 安全なユーザーにルートレベルのコマンドを使用する権限を与えます。
usermod -aG sudo username

安全なユーザーとしてログインする


Ctrl-Dを押して、DigitalOceanルートセッションからログアウトします。

安全なユーザーとしてログオンするコマンドは、以前に使用したコマンドと同じですが、ユーザー名が変更されていることに注意してください。 安全なユーザーとしてログオンすると、root権限を持つコマンドを実行するたびに、sudoという単語を使用してコマンドを続行する必要があります。 自分のマシンのコマンドラインから、以下に表示されるコマンドを使用してログオンします。

ssh [email protected]

GITをインストールする


ログオンしたら、GITをインストールします(GITを使用してNode.jsをインストールします)。 何らかの理由でGITに慣れていない場合、それはあなたの人生の大きな部分になるであろう美しいツールです。 詳細については、GITブックをお読みください。 Ubuntuへのインストールは簡単です。

sudo apt-get install git

sudo という単語は、このコマンドをrootとして実行することを示しています。 パスワードの入力を求められます-つまり 安全なユーザーパスワード。 パスワードを入力すると、コマンドが実行されます。

最新のNode.JSをインストールする


この記事の執筆時点では、v0.10.24がNodeの最新バージョンであることに注意してください。 新しいバージョンがある場合は、代わりにそのバージョン番号を使用してください。

次のコマンドを一度に1行ずつ入力し、DropletがNode.jsをダウンロード、コンパイル、インストールするときの魔法を見てください。

sudo apt-get install build-essential
sudo apt-get install curl openssl libssl-dev
git clone https://github.com/joyent/node.git
cd node
git checkout v0.10.24
./configure
make
sudo make install

sudo makeと入力すると、さまざまなことが起こります。 我慢して。

make installプロセスが終了したら、次のように入力して、すべてがうまくいったことを確認します。

node -v

すべてがうまくいけば、次のように表示されます。 v0.10.24.

安全なユーザーにポート80の使用を許可する


アプリケーションをrootユーザーとして実行したくないことを忘れないでください。ただし、問題があります。安全なユーザーには、デフォルトのHTTPポート(80)を使用する権限がありません。 目標は、 http://mysite.com のような使いやすいURLに移動して、訪問者が使用できるWebサイトを公開できるようにすることです。

残念ながら、rootとしてサインオンしない限り、通常はhttp://mysite.com:3000のようなURLを使用する必要があります。ポート番号に注意してください。

多くの人がここで立ち往生していますが、解決策は簡単です。 いくつかのオプションがありますが、これは私が好きなものです。 次のコマンドを入力します。

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

これで、ノードアプリケーションにポート80で実行するように指示しても、文句は表示されません。

NPMを使用して、PM2と呼ばれるパッケージをインストールします。


NPMは、Node.jsアプリケーションで使用するフレームワークとライブラリをインストールするために使用するパッケージマネージャーです。 NPMはNode.jsとともにインストールされました。 PM2は、次の2つの問題を解決するための便利なツールです。

  1. クラッシュした場合、アプリケーションを再起動することでサイトを維持します。これらのクラッシュは発生しないはずですが、PM2があなたの背中を持っていることを知っておくとよいでしょう。 (ノードベースのサイトを実行し続けるために使用される別のツールであるForever.jsを知っている人もいるかもしれません。PM2には多くの機能があることがわかると思います。)

  2. サーバーを再起動するたびにノードアプリケーションをサービスとして再起動することで役立ちます。これを行う他の方法を知っている使用者もいますが、pm2を使用すると簡単になり、柔軟性が向上します。 。

コマンドラインで次のように入力して、PM2をインストールします。

sudo npm install pm2 -g

シンプルなノードアプリを作成する


ここで、環境をテストして、すべてが正常に機能していることを確認できます。 この例では、IPアドレスを使用しますが、目標はドメイン名を使用することです。 後でこれらの手順を見てください:DigitalOceanでホスト名を設定する方法

まず、テスト専用のシンプルなノードアプリを作成します。 コマンドラインで次のように入力します。

nano app.js

次に、次のコード行をnanoエディターに入力します。

var http = require('http');
var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Hello World\n");
});
server.listen(80);
console.log("Server running at http://127.0.0.1:80/");

ctrl-X を押して終了します。nanoが保存するかどうかを尋ねてきたら、「はい」と答えます。

これで、環境のテストに使用できるapp.jsというノードベースのアプリケーションができました。

次のように入力すると、コマンドラインでapp.jsを実行できます。 node app.js

そうすれば、ブラウザを使用してIPアドレスをURLとして入力することで、HelloWorldのテキストを表示できるはずです。 crtl-Cを押すと、実行を中断できます。 これは、アプリケーションを実行する方法ではありません。 はるかに良い方法があります。 Nodeを直接使用する代わりに、PM2を使用して実行します。

PM2を使用してアプリを実行し、サーバーの再起動時にnode.jsアプリケーションが自動的に起動することを確認します


pm2を使用してアプリケーションを実行すると、いくつかの大きなメリットがあります。 上記のようにアプリを実行する代わりに、次のコマンドを使用してアプリを実行します。 pm2 start app.js

このレポートが表示されます。

この方法でアプリケーションを実行する利点は何ですか?

  • PM2は、クラッシュした場合にアプリケーションを自動的に再起動します。

  • PM2は、未処理の例外のログを保持します。この場合、ファイルは/home/safeuser/.pm2/logs/app-err.logにあります。

  • PM2は、1つのコマンドで、サーバーの再起動時に管理するすべてのアプリケーションを確実に再起動できます。 基本的に、ノードアプリケーションはサービスとして起動します。

次のように入力して、このコマンドを実行し、アプリケーションをサービスとして実行します。

sudo env PATH=$PATH:/usr/local/bin pm2 startup -u safeuser

ユーザー名としてsafeuserを使用していない可能性があることに注意してください。セットアップに対応する名前を使用してください。 次のレポートが表示されます。

Adding system startup for /etc/init.d/pm2-init.sh ...
   /etc/rc0.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc1.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc6.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc2.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc3.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc4.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc5.d/S20pm2-init.sh -> ../init.d/pm2-init.sh

今、私たちの述べた目的は達成されました!

  • ルートとして実行していません。 したがって、アプリはより安全です。

  • ポート80を使用しています。これは通常、rootユーザーのみが使用できます。

  • アプリケーションがクラッシュすると再起動し、未処理の例外のログを保持します。

  • サーバーが起動すると、アプリケーションが再起動します。

楽しむ! これは、最初はかなり堅牢な設定です。

**考えた後:**safeuserディレクトリにnodeというファイルフォルダがあることに気付くかもしれません。 インストール時に使用されましたが、もう必要ありません。 次のように入力して削除できます。

rm -rf /home/safuser/node

ノードについて学ぶことはまだたくさんありますが、このチュートリアルでは正しい道を歩むことができます。 pm2の詳細については、pm2リポジトリにアクセスしてください。

重要な説明:ノードアプリケーションを起動する起動スクリプトがありますが、それがどのように機能するかを理解していれば、多くの混乱を避けることができます。 スクリプトは「pm2-init.sh」と呼ばれます。 ‘etc / init.d /’ディレクトリにありますが、app.jsは起動しません。 代わりに、サーバーが最後にシャットダウンしたときにPM2で実行されていたプログラムを開始します。

これは重要。 pm2 list、と入力したときにノードアプリケーションがリストに表示されない場合、サーバーの再起動時にアプリは再起動しません。 pm2を使用してアプリを起動するための適切な手順に従って、アプリが再起動することを確認します。 pm2 start app.js

ジム・キャシディ