Egg: 生产环境部署失败

Created on 24 Aug 2017  ·  27Comments  ·  Source: eggjs/egg

  • Node Version: 8.4.0 ,8.3.0
  • Egg Version:1.7.0
  • Plugin Name:
  • Plugin Version:
  • Platform: 阿里云centos 7.0
  • Mini Showcase Repository:

完全安照:https://eggjs.org/zh-cn/core/deployment.html 的方式进行部署的。

本地或服务器执行 npm run dev 都没有任何问题,一切正常。

但是执行 npm start 后,服务器拒绝访问或502错误。

各种依赖肯定都是有的。

不知道egg.js 部署还有哪些注意事项

启动脚本如下:

> [email protected] start /home/website/qingzhiyuedu
> egg-scripts start --daemon --port=8080

[egg-scripts] Starting egg application at /home/website/qingzhiyuedu
[egg-scripts] Run node /home/website/qyapi/node_modules/egg-scripts/lib/start-cluster {"v":false,"port":8080,"framework":"/home/website/qyapi/node_modules/egg","baseDir":"/home/website/qyapi"} --title=undefined
[egg-scripts] Save log file to /root/logs/server

而且:--title=undefined 始终是undefined, 即使设置了 egg-scripts start --daemon --port=8080 --title=egg-server-qyapi ,也是undefined。

部分package.json 如下

  "dependencies": {
    "egg": "^1.7.0",
    "egg-mysql": "^3.0.0",
    "egg-scripts": "^1.1.0",
    "egg-view-nunjucks": "^2.1.3"
  },
  "devDependencies": {
    "autod": "^2.9.0",
    "autod-egg": "^1.0.0",
    "egg-bin": "^4.1.0",
    "egg-ci": "^1.8.0",
    "egg-mock": "^3.9.0",
    "eslint": "^4.3.0",
    "eslint-config-egg": "^5.0.0",
    "webstorm-disable-index": "^1.2.0"
  },
  "engines": {
    "node": ">=6.0.0"
  },
  "scripts": {
    "start": "egg-scripts start --daemon --port=8080",
    "stop": "egg-scripts stop",
    "dev": "egg-bin dev --port 3001",
    "test": "npm run lint -- --fix && npm run test-local",
    "test-local": "egg-bin test",
    "cov": "egg-bin cov",
    "lint": "eslint .",
    "ci": "npm run lint && npm run cov",
    "autod": "autod"
  }

查看日志如下:
[---- server]# tail -f egg-web.log
2017-08-25 01:33:37,325 INFO 5387 [egg-static] starting static serve /public/ -> /home/website/qyapi/app/public
2017-08-25 01:33:37,328 INFO 5387 [egg-security] use csrf middleware
2017-08-25 01:33:37,329 INFO 5387 [egg-security] use methodnoallow middleware
2017-08-25 01:33:37,329 INFO 5387 [egg-security] use noopen middleware
2017-08-25 01:33:37,329 INFO 5387 [egg-security] use nosniff middleware
2017-08-25 01:33:37,332 INFO 5387 [egg-security] use xssProtection middleware
2017-08-25 01:33:37,332 INFO 5387 [egg-security] use xframe middleware
2017-08-25 01:33:37,333 INFO 5387 [egg-security] use dta middleware
2017-08-25 01:33:37,333 INFO 5387 [egg-security] compose 7 middlewares into one security middleware
2017-08-25 01:33:37,368 INFO 5387 [egg-watcher:app] watcher start success

egg-agent.log,common-error.log 日志文件都是空的

说明
同样的环境, express generator 生成的项目通过 node 或pm2 部署启动都是没有问题的。

应该不是端口的问题,换成其他端口也是一样的

Most helpful comment

@coolicer https://github.com/eggjs/egg-scripts/pull/7/files 支持成功后输出 URL 了

All 27 comments

[egg-scripts] Save log file to /root/logs/server

看下日志

发自我的 iPhone

在 2017年8月25日,01:39,Leeson notifications@github.com 写道:

[egg-scripts] Save log file to /root/logs/server

@atian25

[---- server]# tail -f egg-web.log
2017-08-25 01:33:37,325 INFO 5387 [egg-static] starting static serve /public/ -> /home/website/qyapi/app/public
2017-08-25 01:33:37,328 INFO 5387 [egg-security] use csrf middleware
2017-08-25 01:33:37,329 INFO 5387 [egg-security] use methodnoallow middleware
2017-08-25 01:33:37,329 INFO 5387 [egg-security] use noopen middleware
2017-08-25 01:33:37,329 INFO 5387 [egg-security] use nosniff middleware
2017-08-25 01:33:37,332 INFO 5387 [egg-security] use xssProtection middleware
2017-08-25 01:33:37,332 INFO 5387 [egg-security] use xframe middleware
2017-08-25 01:33:37,333 INFO 5387 [egg-security] use dta middleware
2017-08-25 01:33:37,333 INFO 5387 [egg-security] compose 7 middlewares into one security middleware
2017-08-25 01:33:37,368 INFO 5387 [egg-watcher:app] watcher start success

egg-agent.log,common-error.log 日志文件都是空的

应该还有 2 个 master-xx 的日志的。另外你在服务器上直接 curl localhost 对应端口看看

发自我的 iPhone

在 2017年8月25日,09:04,Leeson notifications@github.com 写道:

@atian25

[---- server]# tail -f egg-web.log
2017-08-25 01:33:37,325 INFO 5387 [egg-static] starting static serve /public/ -> /home/website/qyapi/app/public
2017-08-25 01:33:37,328 INFO 5387 [egg-security] use csrf middleware
2017-08-25 01:33:37,329 INFO 5387 [egg-security] use methodnoallow middleware
2017-08-25 01:33:37,329 INFO 5387 [egg-security] use noopen middleware
2017-08-25 01:33:37,329 INFO 5387 [egg-security] use nosniff middleware
2017-08-25 01:33:37,332 INFO 5387 [egg-security] use xssProtection middleware
2017-08-25 01:33:37,332 INFO 5387 [egg-security] use xframe middleware
2017-08-25 01:33:37,333 INFO 5387 [egg-security] use dta middleware
2017-08-25 01:33:37,333 INFO 5387 [egg-security] compose 7 middlewares into one security middleware
2017-08-25 01:33:37,368 INFO 5387 [egg-watcher:app] watcher start success

egg-agent.log,common-error.log 日志文件都是空的


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

额,我昨天也想发这个Issue的,我也遇到,我是一个hello world,直接npm start是跑不了,就像你那样。

title 的那个是 bug,https://github.com/eggjs/egg-scripts/pull/3 修复中。

但跟你们问题中的报错没关系,请提供下复现方式,可以尝试下:

  1. ssh 到服务器上,不用 daemon 启动,看看控制台输出是啥
  2. 确认下你的服务器的文档,是不是必须指定环境变量为启动端口,或者 workers 数量有限制 (譬如 leadcloud 和 sinaapp 就有限制,不确定你用的阿里云有没有)

@atian25 node v8.4.0 用egg-init新建一个simple的项目,安装完依赖,跑npm start就会出现。

还是无法复现

➜  aa node -v
v8.1.4

➜  aa npm start

> [email protected] start /Users/tz/Workspaces/tmp/aa
> egg-scripts start --daemon

[egg-scripts] Starting egg application at /Users/tz/Workspaces/tmp/aa
[egg-scripts] Run node /Users/tz/Workspaces/tmp/aa/node_modules/[email protected]@egg-scripts/lib/start-cluster {"v":false,"framework":"/Users/tz/Workspaces/tmp/aa/node_modules/egg","baseDir":"/Users/tz/Workspaces/tmp/aa"} --title=undefined
[egg-scripts] Save log file to /Users/tz/logs/aa

➜  aa curl localhost:7001/
hi, egg%                                                                        

➜  aa npm stop

> [email protected] stop /Users/tz/Workspaces/tmp/aa
> egg-scripts stop

[egg-scripts] Stopping egg application at /Users/tz/Workspaces/tmp/aa
[egg-scripts] Got master pid ["33724"]
[egg-scripts] Stopped

原来这样就是成功吗?:)

因为没有什么提示,我和楼主都觉得没成功吧

curl 成功了啊

发自我的 iPhone

在 2017年8月29日,11:57,Ryan notifications@github.com 写道:

原来这样就是成功吗?:)


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

楼主的问题是 服务器拒绝访问或502错误。

502 Bad Gateway 我怀疑是前面的 nginx 的端口配置不对导致反代没过来,@leeson8888 ssh 上去看看吧

目前的问题,我觉得可能和环境有关吧。
因为测试环境和本地是可以。
关键是日志文件里面没有明显的报错。

@atian25
奇怪的是,目前通过pm2 可以启动,但是启动的端口是7001,不知道pm2 启动走的是哪里,如何配置端口?

// server.js
const egg = require('egg');
const workers = Number(process.argv[2] || require('os').cpus().length);
egg.startCluster({
  workers,
  baseDir: __dirname,
});

@leeson8888 你没明白我的意思,我现在怀疑在 nginx 那层就拦截了请求了,根本没到 egg 那边。

你要 ssh 到服务器去,用 egg-scripts start --port=8080 启动服务后,然后 curl localhost:8080 看能否访问先

感谢 @atian25 的热心回答。
应该不是 nginx 拦截的问题,因为新启的虚拟机,没有任何其他服务。
关键是npm start 的时候,只能启动node服务,不能启动监听的端口(肯定没有占有),换过不同的端口试过,防火墙也关了的
我觉得可能还是环境问题导致端口无法启动。

因为具体是运维在部署,我明天再让他全局安装一下egg-scripts(直接执行会找不到命令),按照你说的egg-scripts start --port=8080 启动试试,看看有什么错误。

@atian25 另外可以确定:

通过npm start 的方式

// config/config.prod.js
exports.cluster = {
  listen: {
    port: '8181',
  }
}

这里配置的端口并不能生效,仍然启动的是7001的端口。

但是
"start": "egg-scripts start --daemon --port=8181", 是可以启动8181端口的

我在公司测试环境,阿里云上都试过了。

加了个用例,https://github.com/eggjs/egg-scripts/pull/4

listen 这个好像是有问题,@popomore 看看?

可以确认 egg-scripts 这边没有传 PORT

// https://github.com/eggjs/egg-cluster/blob/master/lib/app_worker.js#L16
const port = options.port = options.port || listenConfig.port;

options.port 是有值的,被 https://github.com/eggjs/egg-cluster/blob/master/lib/utils/options.js#L14 formatOptions 了。

@leeson8888 不需要全局,你 ssh 到服务器去,./node_modules/egg-scripts start --port=8080 然后 curl http://localhost:8080 看看

用 sudo npm start 试试

@leeson8888 listen.port 那个已经在 https://github.com/eggjs/egg-cluster/pull/40 修复了,重新安装下依赖即可。

但你反馈的 服务器拒绝访问或502错误。 这个问题,还是需要你 ssh 去看看啥原因。

@atian25 谢谢。
关于“服务器拒绝访问或502错误”,这个问题已经解决了,一直忙,忘了来更新。
是因为数据库的一个权限,导致端口启动失败。
比较奇怪的是为什么日志里面没有记录,必须通过egg-scripts start才能看到错误日志。
而且当时通过pm2 start,7001 端口启动成功了,没有想到是数据库权限的问题。

你要看错误日志是在哪里的,直接 node index.js 的话,master 的日志是在控制台输出的,不会在文件,除非你自己 >

egg-scripts start 把 master 日志输出到 master-stderr.log 了。

是npm start 时候的日志,logs 下面的所有日志,包括了master-stderr.log,只提示启动失败,自动退出,但是没有 像egg-scripts start 一样,提示是数据库connection.js 的问题

你的 npm start 是啥? 不是 egg-scripts ?

 "scripts": {
    "start": "egg-scripts start --daemon --port=8080",
    "stop": "egg-scripts stop",
    "dev": "egg-bin dev --port 3001",
    "test": "npm run lint -- --fix && npm run test-local",
    "test-local": "egg-bin test",
    "cov": "egg-bin cov",
    "lint": "eslint .",
    "ci": "npm run lint && npm run cov",
    "autod": "autod"
  }

没有区别啊,就是多了一个守护参数 --daemon。 执行的都是一样的啊。

提示是数据库connection.js 的问题

有日志截图么?

--daemon 只是把日志重定向到文件而已,不输出到控制台。

@coolicer https://github.com/eggjs/egg-scripts/pull/7/files 支持成功后输出 URL 了

@atian25 我使用egg日志,运行命令 EGG_SERVER_ENV=test npm start,输出显示在 Save log file to /home/appadmin/logs,但是我的日志设置了
logger: {
dir: "../logs"
}
该目录下也有日志,但是奇怪的是:只是启动时记录了一两条日志,再后面就没有记录日志了!想请问下是什么原因

绝对路径, appInfo.root join 下看看

Was this page helpful?
0 / 5 - 0 ratings