Meteor.jsについて

Meteor.js は、JavaScriptのフレームワークであり、Web開発者がJavaScriptコードを一度記述して、クライアント側とサーバー側の両方で再利用できるようにします。 これは、Meteor独自のビルドプロセスのおかげで可能になります(アプリケーションコードの構造化とコード共有の詳細をご覧ください)。 これにより、開発者がコーディングとデバッグを行う開発モードと、アプリの公開バージョンに十分な安全性を備えた本番モードの間で複雑なデプロイプロセスが必要になるという問題も解決されます。 。 Meteorフレームワークは、クライアントコードとサーバーコード、および開発と本番環境を密接に関連付ける方法を提供します。 これは、クライアント側の開発者がサーバー側のコードで作業を開始するための最も簡単な方法です。

これが実際に動作していることを確認するには、MeteorのWebサイトで紹介ビデオを表示することをお勧めします。

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

このチュートリアルの最後に、次のようになります。

  • インストールされたMeteor.js
  • Meteorアプリケーション全体を本番環境に対応した形式(Webサーバーとデータベースバックエンドを除く)で含むデプロイメントパッケージを作成しました
  • Nginx をWebサーバーとしてインストールして、HTTPリクエストをMeteorに渡します
  • データベースエンジンとしてMongoDBをインストールしました
  • Upstartでアプリケーションを管理しました
  • Meteorデータベース用に構成された毎日のデータベースバックアップ

このチュートリアル全体を通して、独自のMeteorアプリケーションをまだお持ちでない場合は、MeteorWebサイトの「TodoList」サンプルアプリケーションを使用できます。

あなたが始める前に

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

  • 別の開発用コンピューター上の既存のMeteorアプリ(「TodoList」アプリの例ここを表示できます。手順はチュートリアルの後半に記載されています)

  • 新しいUbuntu14.04サーバー。 ほとんどの場合、既存のMeteorインストールは機能するはずです

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

  • パッケージリストを更新しました。 実行する:

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

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

ステップ1—NginxWebサーバーをセットアップする

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

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

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

apt-get install nginx

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

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

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 todos.net; # 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 todos.net; # this domain must match Common Name (CN) in the SSL certificate

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

    ssl_certificate /etc/nginx/ssl/todos.pem; # full path to SSL certificate and CA certificate concatenated together
    ssl_certificate_key /etc/nginx/ssl/todos.key; # 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;
        }
    }
}

構成ファイルをニーズに合わせて調整したい場合、および詳細については、Nginx仮想ホストに関するこのチュートリアルを参照してください。

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

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

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

  • 証明書:/etc/nginx/ssl/todos.pem
  • キー:/etc/nginx/ssl/todos.key

SSL証明書とキーをまだ持っていない場合は、Nginx の自己署名SSL証明書の作成に関するこのチュートリアルを使用して、自己署名証明書を作成する必要があります。 キー名としてtodos.key、証明書名として todos.pem のように、構成ファイルから同じ名前を使用することを忘れないでください。 自己署名証明書はテストには問題ありませんが、実稼働での使用には商用の署名付き証明書を使用することをお勧めします。 自己署名証明書は、ssl_staplingに接続されたNginx警告と、Webブラウザーのセキュリティ警告を引き起こします。

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

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

rm /etc/nginx/sites-enabled/default

そして、Meteor仮想ホストを有効にします。

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

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

nginx -t

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

nginx -s reload

この時点で、Webブラウザを使用してhttps:// todos.net (またはIPアドレス)にアクセスできます。 502 BadGatewayが表示されます。 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 todos --out /var/backups/mongodb/$(date +'\%Y-\%m-\%d')

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

まず、Node.jsをインストールする必要があります。 Meteorは通常、標準リポジトリで利用可能なものよりも新しいバージョンのNode.jsを必要とするため、カスタムPPA を使用します(執筆時点では、Ubuntu14.04はnodejs= 0.10.25〜dfsg2-2ubuntu1を提供し、Meteor0.8は.3にはNode.js0.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 todos

出力:

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—アップスタートの構成

これで、Meteorアプリを管理するためのUpstartサービスを作成する準備が整いました。 Upstartは、起動時にアプリを自動的に起動し、Meteorが停止した場合に再起動します。 Upstartサービスファイルの作成について詳しくは、このチュートリアルをご覧ください。

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

# upstart service file at /etc/init/todos.conf
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 todos
setgid todos

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/todos
    export HOME=/home/todos
    # 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 todos as database name
    export MONGO_URL=mongodb://localhost:27017/todos
    # The domain name as configured previously as server_name in nginx
    export ROOT_URL=https://todos.net
    # 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/todos/bundle/main.js >> /home/todos/todos.log
end script

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

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

ファイルからわかるように、ログは/home/todos/todos.log.に保存されます。このファイルはローテーションせず、は時間の経過とともに成長します。 それを監視することは良い考えです。 理想的には、多くのコンテンツ(エラー)が含まれていてはなりません。 オプションで、ログローテーションを設定するか、Upstartスクリプトの最後で>>>に置き換えて、ファイルの最後に追加する代わりにファイル全体を上書きできます。 。

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

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

オプション:Meteorプロジェクトをまだ持っていない場合

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

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

cd ~

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

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

次に、 TodoListという例からアプリケーションを作成します。

meteor create --example todos

これで、アプリケーションのディレクトリに入り、続行する準備が整いました。

cd todos

すべてのMeteorプロジェクト

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

cd /app/dir

そして実行します:

meteor build .

これにより、ディレクトリ/app/dirtodos.tar.gzのようなアーカイブファイルが作成されます。 このファイルをドロップレットの~ディレクトリにコピーします。

scp todos.tar.gz [email protected]todos.net:~

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

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

プロジェクトディレクトリに移動し、解凍します。

cd /home/todos
tar -zxf todos.tar.gz

プロジェクトREADMEを見てください。

cat /home/todos/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:[email protected]:port/databasename'
  $ export ROOT_URL='http://example.com'
  $ export MAIL_URL='smtp://user:[email protected]: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/todos.confファイルに反映されています。 READMEには、やらなければならないことがもう1つあります。

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

apt-get install g++ make
cd /home/todos/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

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

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

chown todos:todos /home/todos -R

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

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

  • Node.js環境がインストールされています
  • プロジェクトディレクトリにインストールされたアプリケーション
  • アプリケーションを実行するように構成されたUpstartサービス
  • MongoDBデータベース
  • Meteorアプリケーションの前にあるNginxプロキシサーバーでSSL暗号化を提供

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

start todos

これで、https:// todos.netのブラウザーでアプリケーションを表示できるようになります。

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

開発モードで変更を加える場合(そして、私たちは開発者です!)、ステップ5(meteor buildから開始)を繰り返すだけで、[までほとんどのステップを実行できます。 X197X]コマンド。Upstartを介してアプリケーションをリロードします。

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

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

開発サーバー:

建てる:

meteor build /app/dir

アップロード:

scp todos.tar.gz [email protected]todos.net:/home/todos

本番サーバー:

拡大:

tar -zxf /home/todos/todos.tar.gz

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

cd /home/todos/bundle/programs/server

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

npm install

アプリを再起動します。

restart todos

トラブルシューティング

何か問題が発生した場合、問題を探すためのヒントをいくつか示します。

  • アプリケーションが起動して終了する場合は、/home/todos/todos.logを確認してください。 適切なエラーメッセージをスローする必要があります(例: プログラミングエラーの場合)。
  • アプリケーションの代わりにHTTPエラーが表示される場合は、/var/log/nginx/error.logを確認してください。
  • データベースに問題があると思われる場合は、/var/log/mongodb/mongodb.logを確認してください。

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

status todos
service nginx status
status mongodb