12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MeteorをCentOSにデプロイする

Last updated at Posted at 2014-12-03

Meteorで作成したアプリケーションを自分のサーバにデプロイしたが、Ubuntuに対するデプロイ情報はネットにあったもののCentOSにデプロイする方法がほとんどなかったのでシェアしてみる。

80番ポートには既にhttp-proxyでapacheやnodeのサーバにルーティングしているので、http-proxyでMeteorのアプリケーションにもルーティング出来るようにした。

環境

さくらVPS CentOS 6.5 64bit
Meteor 1.0
NodeJS v0.10.29
MongoDB v2.6.5

Meteorのデプロイ

####ローカルでの作業
開発環境(macでもなんでも)でアプリケーションが出来上がるとそのmeteorプロジェクトをパッケージ化する。

なお、あらかじめCentOSにはMeteorをインストールしているものとする。

$ meteor build [アプリケーションのあるパス]

もしくはmeteorプロジェクトのディレクトリ内で

$ meteor build .

すると以下のファイルが出来る。

[アプリケーション名].tar.gz

これをFTPクライアントなりなんなりでCentOSの任意の場所にコピーする。

####リモート

今回は以下のディレクトリにコピーしたので、

/var/www/[アプリケーション名]/[アプリケーション名].tar.gz

これを展開する。

$ tar -zxf [アプリケーション名].tar.gz

すると、bundleというディレクトリができるので、次のようにパッケージをいくつかインストールする。
この際いくつかwarningが出るかもしれないが、とりあえず支障はないので放置しておく。

$ cd bundle/programs/server
$ npm install

これで本来は完了なはずなのだが、bundleに戻って以下のコマンドを打つとエラーが出てきてしまう。

$ node main.js
/****/****/bundle/programs/server/node_modules/fibers/future.js:173
throw(ex);
^
Error: /home/****/bundle/programs/server/npm/npm-bcrypt/node_modules/bcrypt/build/Release/bcrypt_lib.node: invalid ELF header
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at bindings (/home/****/bundle/programs/server/npm/npm-bcrypt/node_modules/bcrypt/node_modules/bindings/bindings.js:74:15)
at Object.<anonymous> (/home/****/bundle/programs/server/npm/npm-bcrypt/node_modules/bcrypt/bcrypt.js:1:97)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)

どうやらmacでは正常に動いていたはずのbcryptがlinuxではなぜか上手く動いていないようなので、インストールし直してみる。
また、Meteorがbcryptをbundle/programs/server/npm/npm-bcrypt/node_modulesにコピーしているみたいなので、それも上書きする。

$ cd bundle/programs/server
$ npm install bcrypt
$ cp -r bundle/programs/server/node_modules/bcrypt bundle/programs/server/npm/npm-bcrypt/node_modules

これでMeteorに対する処理は終わり。

README内にあるコマンドを打つとアプリケーションが立ち上がる。

1行目は先の作業で終えているから必要ない。

Meteorには環境変数がいくつかあって、
MONGO_URLでmongoの指定、
ROOT_URLでホストの指定、
MAIL_URLでメールサーバの指定などが出来る。
READMEにはないが、POOTでポートの指定も可能。

$ (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

Mongoのインストール

ここはmongoの公式サイトにあるので説明は簡単に。

$ vi /etc/yum.repos.d/mongodb.repo

で以下を貼り付けて、

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

次のコマンドでmongoをインストール。

$ sudo yum install -y mongodb-org

mongoのadminを設定するなどしてからデータの保存場所を確保する。

$ sudo mkdir /data/db_mongo (この場所は任意)
$ sudo chown 'mongod:mongod' /data/db_mongo

今作成したdbの保存場所を示すパスを指定して、mongoを立ち上げる。

$ mongod --dbpath /data/db_mongo

ここでアプリケーション用のDBを作成し、セキュリティ上データベースにadminユーザを作成する。

$ mongo

$ db.createCollection("[コレクションの名前]");
$ use [コレクションの名前]
$ db.createUser('[ユーザ名]','[パスワード]');

http-proxyでルーティング

まずはhostとportの整理を。

ホスト ポート 用途
example.com 80 http-proxyによるプロキシサーバー
127.0.0.1(localhost) 3100 Meteorのアプリケーション
127.0.0.1(localhost) 27017 MongoDB

http-proxyの説明はhttp://qiita.com/ytakzk/items/e4422555549b069e3d90
この辺で説明しているので見ていただくとして、以下のように設定する。

proxy.js
var http = require('http');
var httpProxy = require('http-proxy');

// apacheのサーバ(別アプリケーションのために立てている)
var apacheProxy = new httpProxy.createProxyServer({
    target: {
    host: 'localhost',
    port: 8081
}});

// ghostのサーバ(別アプリケーションのために立てている)
var ghostProxy = new httpProxy.createProxyServer({
    target: {
    host: 'localhost',
    port: 6666
}});

// meteorのサーバ(今回に必要なもの)
var meteorProxy = new httpProxy.createProxyServer({
    target: {
    host: '127.0.0.1',
    port: 3100
}});

// ルーティング
var server = http.createServer(function ( req, res ) {
    var proxy;
    if (req.headers.host == 'example1.com') {
        proxy = apacheProxy.web( req, res );
    } else if (req.headers.host == 'example2.com') {
        proxy = ghostProxy.web( req, res );
    } else if (req.headers.host == 'example.com') {
        proxy = meteorProxy.web( req, res, function(err) {
	  console.log(err);
	});
    } else {
        res.writeHead(404);
        res.end();
    }
});

// websocket
server.on( 'upgrade', function( req, socket, head ) {
    meteorProxy.ws( req, socket, head );
});

server.listen(80, function(){
  process.setuid(500);
});
console.log('It Works!');

iptablesの設定

iptablesにポート3100を追加する。

$ sudo vi  /etc/sysconfig/iptables

以下の1行を追加

-A SERVICES -p tcp --dport 3100 -j ACCEPT

最終的なデプロイ

npmでforeverをインストールしておく。(割愛)

まずはプロキシサーバーを起動

$ sudo forever start proxy.js

mongoをバックグラウンドで起動

$ sudo mongod --fork --dbpath /data/db_mongo --logpath /var/log/mongodb/db.log

meteorのアプリケーションを起動

$ export MONGO_URL='mongodb://[先に作成したdbのユーザ名]:[先に作成したdbのユパスワード]@127.0.0.1:27017/[コレクション名]'
$ export ROOT_URL='http://127.0.0.1'
$ export PORT=3100
$ forever start main.js

再デプロイの手順

これまでと手順は一緒。
開発環境でtarファイルを作って同じ作業を繰り返せば良い。
プロキシサーバーやmongoはすでに立っているからそれは必要ないけど。
シェルで以下を走らせれば一発で再デプロイ終了。

$ tar -zxf [アプリケーション名].tar.gz
$ (cd bundle/programs/server & npm install bcrypt)
$ cp -r bundle/programs/server/node_modules/bcrypt bundle/programs/server/npm/npm-bcrypt/node_modules

$ export MONGO_URL='mongodb://user:password@host:port/databasename'
$ export ROOT_URL='http://example.com'
$ export MAIL_URL='smtp://user:password@mailhost:port/'
$ export MAIL_URL='smtp://postmaster%40wasabihunt.com:ebeeb40a2355e809ee691f817b4d3c81@smtp.mailgun.org:587'
$ forever restart main.js

実際のプロダクト

実際にMeteorで作ったプロダクトがこちら。
といってもまだβ版に過ぎないけども。
http://wasabihunt.com/

以上!

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?