简介
目前能够方便地部署Meteor app的方法还不多,一般都是用官网的Galaxy
或者meteor up
或者按照部署Nodejs
服务器的方式。而如果我们想要使用Nginx
作为Web服务器,其中配置的步骤又很繁琐,那有没有好的开源项目或者平台能够帮助我们减轻痛苦呢?答案是必须的。下面就隆重请出今天的主角——PhusionPassenger
。
Passenger简介
Passenger 想必对于Rails
开发者都很熟悉了,使用Passenger+Apache/Nginx
配置Rails Web
程序也是主流之一。
没想到如今竟然也支持Meteor
了(其实不止Meteor,还支持Nodejs和Python)。从他的官网介绍中可以看到——A web server and application server for your web apps
,其实就是整合了web服务器和后端语言所需要的各种依赖包。而且他的官网有非常详细的教程,本文就是按照此教程一步步走下来的,其中也记录了我部署过程中遇到的一些问题和解决方法。话不多说,首先奉上地址:
步骤一 选择一台云服务器
国外一般用亚马逊或Digital Ocean的云服务器,这里我们就选择通用的运行Linux的服务器,配置差不多都一样。我使用的是阿里云运行Ubuntu14.04的服务器,当然CentOS也支持。
步骤二 选择Passenger集成包
官网总共提供了三种模式:与Nginx集成,与Apache集成,Standalone。三种模式的介绍与区别大家看官网,这里我选择了Nginx集成模式。
步骤三 选择Passenger版本
有开源版和企业版,企业版要收费的,所以我选择了open source
。
步骤四 安装Nodejs环境
说明 以下都是在你买的服务器上操作的
1 | $ sudo apt-get update |
经过此过程,安装的Nodejs版本是0.12.10,大家也可以从NodeSource安装其他的版本如v4.3.1,或者使用nvm版本管理脚本。不过一开始在我尝试使用更高的版本时,老是出问题,后来发现Meteor不支持更高的Nodejs版本,所以大家尽量使用v0.12或者以下的版本吧!
另外,使用nvm
版本管理安装的Nodejs,其实安装到了你的用户目录下,以后使用不需要sudo
命令,方便。而上面的步骤会全局安装Nodejs,以后安装包时,会出现权限问题,大家自行选择。
步骤五 安装Passenger
还是先选择你的服务器安装的系统类型和版本,这里我选择的是Ubuntu14.04.开始安装:
1 | # 添加钥匙和apt包 |
安装完成后,打开vim /etc/nginx/nginx.conf
,并取消下面两行的注释:
1 | # passenger_root /some-filename/locations.ini; |
然后重启Nginx服务器:
1 | sudo service nginx restart |
查看是否安装成功:
1 | sudo /usr/bin/passenger-config validate-install |
查看Passenger运行情况(不是必须):
1 | sudo /usr/sbin/passenger-memory-stats |
最后重新执行一下:
1 | sudo apt-get update |
目前都还是准备工作,下面开始上正餐了。
步骤六 部署Meteor App
说明 以下操作是在你的本地机器上
首先打包你的Meteor程序包meteor bundle package.tar.gz
,此处使用的是bundle
命令,会出现提示说这个命令已经被build
命令取代了,不过这里因为build
命令会把iOS and Android
移动平台的包一起打包进去,而我们并不需要。package.tar.gz
是你取的压缩包的名字和格式。执行结束后,会在当前目录下生成。
然后传到服务器上:
1 | scp package.tar.gz adminuser@yourserver.com: |
登陆到服务器:ssh root@120.24.72.4
(需要先下载ssh)
说明 以下操作是在你的远程服务器上
首先创建一个普通用户如blog
(如果你以前已经创建过,可以省略这一步),按照提示输入密码(注意:不是你的root账户密码)
1 | adduser blog |
然后确保以后可以不用密码登陆服务器(不是必须)
1 | sudo mkdir -p ~blog/.ssh |
现在blog
用户是没有root权限的,不能使用sudo
命令,最好把blog
添加到sudoers
里,输入visudo
,找到:
1 | # User privilege specification |
在下面添加一句:
1 | # User privilege specification |
切换到blog
用户(以后直接使用这个用户就行,不用在使用root)
1 | sudo -u blog -H bash -l |
然后你就能使用sudo
命令了,注意,你的root用户密码不要和你的普通用户密码一样,以后需要输入密码时,直接输入普遍用户的
密码就可以了,不需要再使用root用户的密码。
接下来:
1 | # 创建程序使用的目录(名字任意) |
安装mongodb
1 | sudo apt-get install -y mongodb |
此处最好进入到/bundle
目录下,创建两个空目录,后面要用到public
目录,
而tmp
目录可以创建restart.txt
文件,用于Nginx重启(现在不需要):
1 | mkdir tmp public |
接着进入到cd /programs/server
目录下,执行:
1 | sudo npm install --production |
安装完成后,创建Nginx
配置文件:
1 | sudo vim /etc/nginx/sites-enabled/blog.conf |
写入如下内容:
1 | server { |
最后重启Nginx
1 | sudo service nginx restart |
然后你可以访问你的网站了:
- 如果能直接访问,那只有恭喜你了
- 如果显示
500
错误,说明Passenger
配置过程出错,没有启动,你可以再仔细从头来一遍 - 如果出现
Passenger
提示的错误信息,如We're sorry, but something went wrong.
说明Passenger启动了,但是程序内部有误,我就是在第三种情况下困扰了好久,这时就要查看Nginx
错误日志了:
1 | sudo cat /var/log/nginx/error.log |
也可以查看Passenger
的输出信息,在/var/log/
目录下,有很多html
文件,你可以用cat
命令查看。然后根据错误信息Google之,可能遇到的问题不一样,下面是我遇到的:
1 | /your-app-path/bundle/programs/server/node_modules/fibers/future.js:245 |
在网上搜了许多方法,归纳一下就是这两个包fibers
和bcrypt
的依赖关系,需要重新安装,不过我试了N多遍,还是不行,就在我要放弃的时候,
又重新仔细看了一遍错误原因,才发现bcrypt
这个包的位置不在bundle/programs/server/node_modules/
目录下,而是在/bundle/programs/server/npm/npm-bcrypt/node_modules/
目录下,然后瞬间看到一丝希望,赶忙删除/bcrypt
这个目录,重新运行npm install bcrypt
安装了新的包,最后
重启Nginx
,访问我的域名,真的就成功了。此刻,我真的想哭。泪的教训:看错误日志一定要仔细,仔细,再仔细
总结一下:
- 运行
npm install --production
后,fibers
和bcrypt
这两个包应该就在正确的位置了 - 但由于依赖问题(我猜)不能工作,安装的
fibers
的版本是1.0.5
,bcrypt
的版本是0.7.8
- 所以我只把
/bundle/programs/server/npm/npm-bcrypt/node_modules/
目录下的/bcrypt
文件夹删除 - 然后重新安装
npm install bcrypt
(注意是在这目录下),就会安装0.8.5版本
的bcrypt
了 - 然后问题就能解决,最后重启
Nginx
- 注意我没有重新安装
fibers
包
步骤七 你的程序需要更新时
当我们更新程序后,需要上传新的打包好的文件,并再次部署,也可以编写自动化脚本,帮助你处理。这部分内容请大家直接看官网的步骤,我这里不再赘述了。
接下来
Passenger
还能做更多,比如一台服务器可以同时运行多个Meteor app
,监控你的内存和CPU,更多的配置项和优化功能,错误处理和调试等。
总结
可以看到,使用Passenger
真的很方便,不用再头疼Nginx
的配置了,极大地节省了你的时间,强烈推荐大家使用。
如果你遇到了其他问题,并且不能解决,可以联系我。