ウェブアプリケーションを公開する前に、いくつかの質問を検討する必要があります。
sails.log()
を使用していますか?NODE_ENV
環境変数を「production」に設定して、ローカルで起動してみましたか?(これを簡単にテストするには、NODE_ENV=production node app
(またはショートカットとしてsails lift --prod
)を実行します)。本番環境でのみ適用される設定をいくつかの方法で提供できます。ほとんどのアプリでは、環境変数とconfig/env/production.js
を組み合わせて使用しています。どちらの方法を使用する場合でも、このセクションとドキュメントのスケーリングセクションでは、本番環境に移行する前に確認する必要がある設定について説明しています。
Node.jsは非常に高速です。多くのアプリでは、少なくとも最初は、1台のサーバーで予想されるトラフィックを処理できます。
このセクションでは、単一サーバーでのSailsデプロイに焦点を当てています。この種のデプロイは、スケールにおいて本質的に制限されています。ロードバランサーの背後にSails/Nodeアプリをデプロイする方法については、スケーリングを参照してください。
多くのチームは、ロードバランサーまたはプロキシ(HerokuやNowなどのPaaS、またはnginxサーバーの背後)の背後に本番アプリをデプロイすることを決定します。これは、スケーラビリティのニーズが変化し、サーバーを追加する必要がある場合にアプリの将来性を確保するのに役立つため、多くの場合適切なアプローチです。ロードバランサーまたはプロキシを使用している場合は、以下のリストにあるいくつかの項目を無視できます。
アプリがソケットを使用しており、nginxを使用している場合は、nginxがサーバーにWebsocketメッセージを中継するように設定してください。WebSocketsのプロキシに関するガイダンスは、nginxの該当するドキュメントで見つけることができます。
NODE_ENV
環境変数を'production'
に設定します。アプリの環境設定を'production'
に設定すると、Sailsは本番環境で実行されていることを認識します。これは間違いなく最も重要なステップです。Sailsアプリをデプロイする前に1つの設定のみ変更できる時間しかない場合、これがその設定であるべきです!
アプリが本番環境で実行されている場合
migrate: 'safe'
に強制されます。これは、デプロイ中に本番データを誤って破損するのを防ぐための安全策です。.css
および.js
ファイルにコンパイルして、ページの読み込み時間を短縮し、帯域幅の消費量を削減します。res.serverError()
からのエラーメッセージとスタックトレースはログに記録されますが、レスポンスには送信されません(これは、攻撃者が暗号化されたパスワードやSailsアプリがサーバーのファイルシステム上のどこに配置されているかなどの機密情報にアクセスするのを防ぐためです)。注:
sails.config.environment
を別の方法で'production'
に設定しても問題ありません。SailsはNODE_ENV
環境変数を自動的に'production'
に設定するか、警告をログに記録しますので、コンソールを確認してください。この環境変数が非常に重要である理由は、使用しているフレームワークに関係なく、Node.jsの普遍的な慣例であるためです。Sailsの組み込みミドルウェアと依存関係は、本番環境でNODE_ENV
が設定されていることを期待しており、そうでない場合は、開発でのみ使用するために設計された、効率の低いコードパスを使用します。
sails.config.sockets.onlyAllowOrigins
値を設定します。アプリでソケットを有効にしている場合(つまり、sails-hook-sockets
モジュールがインストールされている場合)、セキュリティ上の理由から、sails.config.sockets.onlyAllowOrigins
を、Websocketを介してアプリへの接続を許可するオリジンの配列に設定する必要があります。これは、アプリのconfig/env/production.js
ファイルで設定するのが一般的です。onlyAllowOrigins
の詳細については、ソケット設定のドキュメントを参照してください。
sails_port
環境変数を使用するか、--port
コマンドラインオプションを設定するか、本番環境の設定ファイルを変更するかに関係なく、Sails設定の最上位レベルに次の行を追加します。
port: 80
前述のように、アプリがロードバランサーまたはプロキシの背後で実行される場合は、このステップを無視してください。
アプリのすべてのモデルがデフォルトのデータストアを使用している場合、本番データベースの設定は、config/env/production.jsファイルでsails.config.datastores.default
を正しい設定で設定するほど簡単です。
アプリが複数のデータベースを使用している場合、プロセスは同様です。アプリで使用されるすべてのデータストアについて、config/env/production.jsのsails.config.datastores
辞書に項目を追加します。
バージョン管理(たとえばgit)を使用している場合、アプリの設定ファイルに機密情報(データベースパスワードなど)を含めると、リポジトリにチェックインされます。この問題に対する一般的な解決策は、特定の機密設定を環境変数として提供することです。詳細については、設定を参照してください。
MySQLなどのリレーショナルデータベースを使用している場合は、追加のステップがあります。本番環境で実行されている場合、Sailsがすべてのモデルをmigrate:safe
に設定する方法を覚えていますか?つまり、アプリの起動時に自動移行は実行されません...つまり、デフォルトではテーブルが存在しません。Sailsアプリのリレーショナルデータベースの初回設定時にこれに対処する一般的なアプローチを以下に示します。
frenchfryparty
)にデータベースを作成します。'production'
に設定せず、モデルの設定をmigrate: 'alter'
のままにします。ここでsails lift
を一度実行し、ローカルサーバーの起動が完了したら終了します。これが不安な場合、または本番データベースにリモートで接続できない場合は、上記のステップをスキップできます。代わりに、ローカルスキーマをダンプして、本番データベースにインポートします。
CSRFからの保護は、Sailsアプリにとって重要なセキュリティ対策です。すでにCSRF保護を有効にして開発を行っていない場合は(sails.config.security.csrf
を参照)、本番環境に移行する前にCSRF保護を有効にするようにしてください。
APIまたはWebサイトで認証を必要とする操作を実行する場合は、本番環境でSSLを使用する必要があります。SailsアプリでSSL証明書を使用するように設定するには、sails.config.ssl
を使用します。
前述のように、アプリがロードバランサーまたはプロキシの背後で実行される場合は、このステップを無視してください。
デプロイの最後のステップは、実際にサーバーを起動することです。たとえば
NODE_ENV=production node app.js
または、コマンドラインオプションの方が使いやすい場合は、--prod
を使用できます。
node app.js --prod
# (Sails will set `NODE_ENV` automatically)
ご覧のとおり、本番環境ではsails lift
ではなく、node app.js
を使用してSailsアプリを起動する必要があります。これにより、sails
コマンドラインツールにアクセスできる必要がなくなり、アプリはSailsアプリにバンドルされているapp.js
ファイル(同じことを行う)を実行するようになります。
HerokuなどのPaaSにデプロイしない限り、pm2
またはforever
などのツールを使用して、アプリサーバーがクラッシュした場合に再起動できるようにする必要があります。選択したデーモンに関係なく、上記のようにサーバーを起動するようにする必要があります。