Nginxを使用してUbuntu 14.04にMeteor.jsアプリケーションをデプロイする方法

Meteor.jsについて

http://meteor.com [Meteor.js]は、Web開発者が一度JavaScriptコードを記述し、クライアント側とサーバー側の両方で再利用できるようにするJavaScriptのフレームワークです。 これは、Meteorのユニークなビルドプロセスのおかげで可能になりました(http://docs.meteor.com/#structuringyourapp [アプリケーションコードとコード共有の構造化]の詳細を参照してください)。 これにより、開発者がコードとデバッグを行う_development mode_と、公開されているアプリのバージョンに対して十分に安全な_production mode_との間の複雑な展開プロセスが必要になるという問題も解決されます。 Meteorフレームワークは、クライアントコードとサーバーコード、および開発と生産を密接に関連付ける方法を提供します。 これはおそらく、クライアント側の開発者がサーバー側のコードで作業を開始する最も簡単な方法です!

これを実際に見るには、Meteorのウェブサイトで紹介https://www.meteor.com/screencast[video]をご覧ください。

Meteor.jsを使用すると、Webサイト(Webアプリケーション)、HTML5ベースのWebブラウザーアプリケーション(AppCacheを使用)、またはモバイルアプリケーション(PhoneGapとの統合による)などのプロジェクトを開発できます。 必要なのは、JavascriptとHTMLの知識だけです。 Meteorには、MongoDB(NoSQLデータベース)のサポートが含まれています。 Atmosphereは、アプリケーションの完全な構成要素を提供して開発をさらにスピードアップできるパッケージをホストします。

このチュートリアルの最後には、次のものがあります。

  • Meteor.jsをインストールしました

  • 生産準備が整った形式でMeteorアプリケーション全体を含む展開パッケージを作成しました(Webサーバーとデータベースバックエンドを除く)

  • HTTP要求をMeteorに渡すために、Webサーバーとしてhttp://nginx.org/[Nginx]をインストールしました

  • データベースエンジンとしてMongoDBをインストールしました

  • Upstartでアプリケーションを管理しました

  • Meteorデータベース用に構成された毎日のデータベースバックアップ

このチュートリアル全体で、まだ独自のMeteorアプリケーションがない場合は、https://www.meteor.com/examples/todos [Meteor Webサイト]から「Todo List」サンプルアプリケーションを使用できます。

あなたが始める前に

あなたが持っている必要があります:

  • 別の開発コンピューター上の既存のMeteorアプリ(「Todo List」アプリのサンプルを表示できますhttps://www.meteor.com/examples/todos [こちら]。手順はチュートリアルの後半で説明します)

  • 新しい* Ubuntu 14.04 *サーバー。ほとんどの場合、既存のMeteorインストールは動作するはずです

  • コマンドを実行するためのサーバーへの* root *アクセス

  • パッケージリストを更新しました。 実行します。 + apt-getアップデート

  • 実際に使用しているドメイン名に置き換えます(または、ドメインがなく、代わりにIPアドレスを使用する場合はそのままにします)

  • (.netを除く)をアプリケーションの名前に置き換えます

ステップ1-Nginx Webサーバーのセットアップ

Nginxをインストールしてセットアップします。これは、Meteorの組み込みWebサーバーにはない機能であるSSLでWebトラフィックを暗号化できるためです。 Nginxを使用すると、同じサーバー上の他のWebサイトにサービスを提供し、トラフィックをフィルタリングしてログに記録することもできます。

この構成では、SSL証明書でサイトを保護し、すべてのトラフィックをHTTPからHTTPSにリダイレクトします。 また、SSL接続のセキュリティを強化するために、いくつかの新しいセキュリティプラクティスを利用します。

Nginxをインストールするには、次を実行します。

apt-get install nginx

`+ / etc / nginx / sites-available +`に仮想ホスト設定ファイルを作成します。

以下は注釈付きの設定ファイルで、次の内容で「+ / etc / nginx / sites-available / +」として作成できます。 すべての構成設定の説明は、ファイルのコメントに含まれています。

server_tokens off; # for security-by-obscurity: stop displaying nginx version

# this section is needed to proxy web-socket connections
map $http_upgrade $connection_upgrade {
   default upgrade;
   ''      close;
}

# HTTP
server {
   listen 80 default_server; # if this is not a default server, remove "default_server"
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html; # root is irrelevant
   index index.html index.htm; # this is also irrelevant

   server_name ; # the domain on which we want to host the application. Since we set "default_server" previously, nginx will answer all hosts anyway.

   # redirect non-SSL to SSL
   location / {
       rewrite     ^ https://$server_name$request_uri? permanent;
   }
}

# HTTPS server
server {
   listen 443 ssl spdy; # we enable SPDY here
   server_name ; # this domain must match Common Name (CN) in the SSL certificate

   root html; # irrelevant
   index index.html; # irrelevant

   ssl_certificate /etc/nginx/ssl/; # full path to SSL certificate and CA certificate concatenated together
   ssl_certificate_key /etc/nginx/ssl/; # full path to SSL key

   # performance enhancement for SSL
   ssl_stapling on;
   ssl_session_cache shared:SSL:10m;
   ssl_session_timeout 5m;

   # safety enhancement to SSL: make sure we actually use a safe cipher
   ssl_prefer_server_ciphers on;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK';

   # config to enable HSTS(HTTP Strict Transport Security) https://developer.mozilla.org/en-US/docs/Security/HTTP_Strict_Transport_Security
   # to avoid ssl stripping https://en.wikipedia.org/wiki/SSL_stripping#SSL_stripping
   add_header Strict-Transport-Security "max-age=31536000;";

   # If your application is not compatible with IE <= 10, this will redirect visitors to a page advising a browser update
   # This works because IE 11 does not present itself as MSIE anymore
   if ($http_user_agent ~ "MSIE" ) {
       return 303 https://browser-update.org/update.html;
   }

   # pass all requests to Meteor
   location / {
       proxy_pass http://127.0.0.1:8080;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade; # allow websockets
       proxy_set_header Connection $connection_upgrade;
       proxy_set_header X-Forwarded-For $remote_addr; # preserve client IP

       # this setting allows the browser to cache the application in a way compatible with Meteor
       # on every applicaiton update the name of CSS and JS file is different, so they can be cache infinitely (here: 30 days)
       # the root path (/) MUST NOT be cached
       if ($uri != '/') {
           expires 30d;
       }
   }
}

構成ファイルをニーズに合わせて調整する場合、および詳細については、https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-でこのチュートリアルを参照してください。 server-blocks-virtual-hosts-on-ubuntu-14-04-lts [Nginx仮想ホスト]。

仮想ホスト設定ファイルに見られるように、Nginxは有効なSSL証明書と `+ / etc / nginx / ssl +`のキーを期待します。 このディレクトリを作成して保護する必要があります。

mkdir /etc/nginx/ssl
chmod 0700 /etc/nginx/ssl

次に、上記の構成で定義した場所に証明書(および必要に応じてチェーン証明書)とキーを含むファイルを作成できます。

  • 証明書: + / etc / nginx / ssl / +

  • キー: + / etc / nginx / ssl / +

SSL証明書とキーがまだない場合は、次のhttps://www.digitalocean.com/community/tutorials/how-to-create-a-ssl-certificate-onを使用して自己署名証明書を作成する必要があります-nginx-for-ubuntu-12-04 [Nginxの自己署名SSL証明書の作成に関するチュートリアル]。 キー名として* todos.key 、証明書名として todos.pem *のように、構成ファイルから同じ名前を使用することを忘れないでください。 自己署名証明書はテストには適していますが、本番用には商用の署名付き証明書を使用することをお勧めします。 自己署名証明書は、ssl_staplingに接続されたNginx警告、およびWebブラウザーのセキュリティ警告を引き起こします。

証明書の作成または取得が完了したら、上記の「+ todos.pem 」および「 todos.key +」ファイルがあることを確認してください。

次に、デフォルトの仮想ホストを無効にする必要があります。

rm /etc/nginx/sites-enabled/default

そして、Meteor vhostを有効にします。

ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

vhost設定にエラーがないことをテストします(自己署名証明書がある場合、ssl_staplingに関連するエラーが表示されますが、これは問題ありません)。

nginx -t

すべてが正常に見える場合、Nginxに変更を適用できます。

nginx -s reload

この時点で、Webブラウザーを使用してhttps://(またはIPアドレス)にアクセスできます。 * 502 Bad Gateway *と表示されます。 Meteorがまだ実行されていないため、これで問題ありません。

ステップ2-MongoDBデータベースのセットアップ

通常のUbuntuリポジトリからMongoDBをインストールします。 標準構成で問題ないはずです。 データベースへの接続に認証は必要ありませんが、接続はローカルホストからのみ可能です。 これは、外部接続が不可能であることを意味します。したがって、システムへのSSHアクセス権を持つ信頼できないユーザーがいない限り、データベースは安全です。

MongoDBサーバーパッケージをインストールします。

apt-get install mongodb-server

これが、MongoDBを実行するために必要なすべてです。 外部ホストからのアクセスが不可能であることを確認するために、次を実行してMongoDBが* 127.0.0.1 *にバインドされていることを確認します。 このコマンドで確認してください:

netstat -ln | grep -E '27017|28017'

期待される出力:

tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:28017         0.0.0.0:*               LISTEN
unix  2      [ ACC ]     STREAM     LISTENING     6091441  /tmp/mongodb-27017.sock

何か問題が発生した場合に毎日のバックアップを利用できるようにするために、単純なコマンドを毎日のcronジョブとして*オプションで*インストールできます。 ファイル `+ / etc / cron.d / mongodb-backup +`を作成します。

@daily root mkdir -p /var/backups/mongodb; mongodump --db  --out /var/backups/mongodb/$(date +'\%Y-\%m-\%d')

ステップ3-Meteorアプリケーションのインストール

まず、Node.jsをインストールする必要があります。 Meteorは通常、標準リポジトリで利用可能なものよりも新しいバージョンのNode.jsを必要とするため、カスタムPPA を使用します(執筆時点では、Ubuntu 14.04はnodejs = 0.10.25〜dfsg2-2ubuntu1を提供しますが、Meteor 0.8.3 Node.js 0.10.29以降が必要です)

以下を実行してNode.jsでPPAを追加し、Enterを押して確認します。

add-apt-repository ppa:chris-lea/node.js

出力:

Evented I/O for V8 javascript. Node's goal is to provide an easy way to build scalable network programs
More info: https://launchpad.net/~chris-lea/+archive/ubuntu/node.js
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmphsbizg3u/secring.gpg' created
gpg: keyring `/tmp/tmphsbizg3u/pubring.gpg' created
gpg: requesting key C7917B12 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmphsbizg3u/trustdb.gpg: trustdb created
gpg: key C7917B12: public key "Launchpad chrislea" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

次に、リポジトリキャッシュを更新する必要があります。その後、Node.jsとnpm(Node.jsパッケージマネージャー)をインストールできます。

apt-get update
apt-get install nodejs

Meteorアプリケーションを通常のユーザーとして実行することをお勧めします。 したがって、特にその目的のために新しいシステムユーザーを作成します。

adduser --disabled-login

出力:

Adding user `todos' ...
Adding new group `todos' (1001) ...
Adding new user `todos' (1001) with group `todos' ...
Creating home directory `/home/todos' ...
Copying files from `/etc/skel' ...
Changing the user information for todos
Enter the new value, or press ENTER for the default
       Full Name []:
       Room Number []:
       Work Phone []:
       Home Phone []:
       Other []:
Is the information correct? [Y/n]

ステップ4-Upstartの構成

これで、管理するhttps://www.digitalocean.com/community/tutorials/the-upstart-event-system-what-it-is-and-how-to-use-it[Upstart]サービスを作成する準備ができました。 Meteorアプリ。 Upstartは、起動時にアプリを自動的に起動し、Meteorが死んだ場合に再起動します。 Upstartサービスファイルの作成の詳細については、https://www.digitalocean.com/community/tutorials/the-upstart-event-system-what-it-is-and-how-to-use-it [このチュートリアル]。

ファイル `+ / etc / init / .conf +`を作成します。 繰り返しますが、インラインで注釈が付けられています。

# upstart service file at /etc/init/
description "Meteor.js (NodeJS) application"
author "Daniel Speichert <[email protected]>"

# When to start the service
start on started mongodb and runlevel [2345]

# When to stop the service
stop on shutdown

# Automatically restart process if crashed
respawn
respawn limit 10 5

# we don't use buil-in log because we use a script below
# console log

# drop root proviliges and switch to mymetorapp user
setuid
setgid

script
   export PATH=/opt/local/bin:/opt/local/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
   export NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
   # set to home directory of the user Meteor will be running as
   export PWD=/home/
   export HOME=/home/
   # leave as 127.0.0.1 for security
   export BIND_IP=127.0.0.1
   # the port nginx is proxying requests to
   export PORT=8080
   # this allows Meteor to figure out correct IP address of visitors
   export HTTP_FORWARDED_COUNT=1
   # MongoDB connection string using  as database name
   export MONGO_URL=mongodb://localhost:27017/
   # The domain name as configured previously as server_name in nginx
   export ROOT_URL=https://
   # optional JSON config - the contents of file specified by passing "--settings" parameter to meteor command in development mode
   export METEOR_SETTINGS='{ "somesetting": "someval", "public": { "othersetting": "anothervalue" } }'
   # this is optional: http://docs.meteor.com/#email
   # commented out will default to no email being sent
   # you must register with MailGun to have a username and password there
   # export MAIL_URL=smtp://[email protected]:[email protected]
   # alternatively install "apt-get install default-mta" and uncomment:
   # export MAIL_URL=smtp://localhost
   exec node /home//bundle/main.js >> /home//.log
end script

この設定ファイルで注意すべきことの1つは、 `+ METEOR_SETTINGS `パラメーターです。 Meteorの開発モードを起動するときに ` meteor --settings config.json `を使用する場合、 ` config.json `の内容を変数として ` METEOR_SETTINGS +`に貼り付ける必要があります。

Meteorのメールパッケージを使用する場合は、「+ MAIL_URL +」が有効なSMTP URLである必要があります*のみ*。 MailGun(Meteor推奨)、ローカルメールサーバーなどを使用できます。

ファイルで見ることができるように、ログは `+ / home //。log。`に保存されます。このファイルは回転せず、時間とともに*成長します*。 目を離さないことをお勧めします。 理想的には、多くのコンテンツ(エラー)が含まれてはなりません。 オプションで、https://www.digitalocean.com/community/tutorials/how-to-configure-logging-and-log-rotation-in-nginx-on-an-ubuntu-vps [log rotation]をセットアップするか、 Upstartスクリプトの最後にある「 >> 」を「> +」に置き換えて、ファイルの最後に追加するのではなく、ファイル全体を上書きします。

実際のMeteorアプリケーションファイルはまだ用意されていないため、まだこのサービスを開始しないでください。

ステップ5-Meteorアプリケーションのデプロイ

オプション:Meteorプロジェクトがまだない場合

Meteorプロジェクトをまだ持っておらず、デモアプリを使用したい場合、それは問題ではありません!

*ホームコンピューターまたは開発Linuxサーバーでこの次の手順を実行します。*コマンドはOSによって異なる場合があります。 ホームフォルダーに移動します。

cd ~

まず、Meteorの開発バージョンをインストールします。

curl https://install.meteor.com | /bin/sh

次に、https://www.meteor.com/examples/todos [Todo List]というサンプルからアプリケーションを作成します。

meteor create --example todos

アプリケーションのディレクトリを入力すると、続行する準備ができました。

cd todos

すべてのMeteorプロジェクト

Meteorアプリから製品版バンドルを作成します。 次のコマンドは、Meteorアプリケーションが存在する場所であればどこでも、*ホームコンピューターまたは開発Linuxサーバー*で実行する必要があります。 プロジェクトディレクトリに移動します。

cd

そして実行:

meteor build .

これにより、ディレクトリ「+」に「 todos.tar.gz 」などのアーカイブファイルが作成されます。 このファイルをドロップレットの「〜+」ディレクトリにコピーします。

scp .tar.gz root@:~

*ここでドロップレットに戻ります。*プロジェクトディレクトリを作成し、アーカイブプロジェクトファイルをそこに移動します。 これは、以前に作成したプロジェクトユーザーのホームフォルダーであり、ルートホームフォルダーではないことに注意してください。

mkdir /home/
mv .tar.gz /home/

プロジェクトディレクトリに移動して展開します。

cd /home/
tar -zxf .tar.gz

プロジェクトのREADMEをご覧ください。

cat /home//bundle/README

バンドルには、内容を含む `+ README +`ファイルが含まれます。

This is a Meteor application bundle. It has only one external dependency:
Node.js 0.10.29 or newer. To run the application:

 $ (cd programs/server && npm install)
 $ export MONGO_URL='mongodb://user:password@host:port/databasename'
 $ export ROOT_URL='http://example.com'
 $ export MAIL_URL='smtp://user:password@mailhost:port/'
 $ node main.js

Use the PORT environment variable to set the port where the
application will listen. The default is 80, but that will require
root on most systems.

Find out more about Meteor at meteor.com.

このレシピは、 `+ / etc / init / .conf +`ファイルに反映されます。 READMEには、まだ必要なことがもう1つあります。

次に、必要なnpmモジュールをインストールする必要があります。 それらのいくつかをビルドできるようにするには、g ++をインストールして以下を作成する必要もあります。

apt-get install g++ make
cd /home//bundle/programs/server
npm install

次のような出力が表示されます。

npm WARN package.json [email protected] No description
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No README data

> [email protected] install /home/todos/bundle/programs/server/node_modules/fibers
> node ./build.js

`linux-x64-v8-3.14` exists; testing
Binary is fine; exiting
[email protected] node_modules/underscore

[email protected] node_modules/semver

[email protected] node_modules/source-map-support
└── [email protected] ([email protected])

[email protected] node_modules/fibers

これを行う必要があるのは、アプリケーションバンドルにプラットフォーム依存のモジュールとライブラリが含まれていないためです。

アプリケーションを実行する準備はほぼ整いましたが、ファイルをルートとして操作し、 `++`ユーザーが所有する必要があるため、プロジェクトディレクトリの所有権を更新する必要があります。

chown : /home/ -R

ステップ6-ショータイム

この時点で、Meteorアプリケーションを実行するために必要なものはすべて揃っています。

  • Node.js環境がインストールされている

  • プロジェクトディレクトリにインストールされたアプリケーション

  • アプリケーションを実行するように構成されたUpstartサービス

  • MongoDBデータベース

  • Meteorアプリケーションの前にあるNginxプロキシサーバーは、SSL暗号化を提供します

アプリケーションを起動するには、プロジェクトディレクトリから次のコマンドを実行します。

start

これで、https://のブラウザーでアプリケーションを表示できるはずです。

アプリケーションの再デプロイ

開発モードで変更を加えると(そして、開発者になります!)、ステップ5を繰り返し( `+ meteor build `から開始)、 ` restart +`までほとんどの手順を実行できます。コマンド。Upstartを介してアプリケーションをリロードします。

これにより、ダウンタイムなしで新しいバージョンをプッシュできます。 クライアント(Webサイトの訪問者)は、新しいバージョンのコードを自動的にプルし、ページを更新します-これがMeteorの魔法です!

これをテストする場合は、ホームコンピューターまたは開発サーバー上のアプリの開発コピーの `+ todos / client / todos.html +`ページのテキストを簡単に変更できます。

開発サーバー:

造る:

meteor build

アップロード:

scp .tar.gz root@:/home/

本番サーバー:

展開する:

tar -zxf /home//.tar.gz

プロジェクトフォルダに移動します。

cd /home//bundle/programs/server

npmモジュールを更新します(いくつかの警告が表示される場合があります)。

npm install

アプリを再起動します。

restart

トラブルシューティング

何かがうまくいかない場合、問題を探す場所に関するいくつかのヒントを以下に示します。

  • アプリケーションが起動して終了する場合は、「+ / home //。log +」を確認してください。適切なエラーメッセージをスローする必要があります(例: プログラミングエラーの場合)。

  • アプリケーションの代わりにHTTPエラーが表示される場合は、「+ / var / log / nginx / error.log +」を確認してください。

  • データベースに問題があると思われる場合は、「+ / var / log / mongodb / mongod.log」を確認してください。

最後に、すべてのサービスが実行されているかどうかを確認します。

status
service nginx status
status mongodb
Related