Hapi 是一款优秀的 Node.js Web 框架,它拥有强大的插件系统、可扩展性和安全性,成为了许多公司选择构建生产级别应用的首选。本文将分享如何将 Hapi 应用部署到生产环境中的经验,包括常见的优化和安全提醒。
第一步:环境变量的设置
在部署 Hapi 应用之前,我们需要确保每个人都有使用特定环境变量的权限,如端口号、MONGODB 连接字符串、JWT 密钥等等。这个过程可以通过使用 dotenv 模块 来实现,从而可以在生产环境中动态配置这些值。
require('dotenv').config();
在上述代码中,我们使用 dotenv 模块加载环境变量,并将它们解析为 process.env 变量。在部署时,我们可以将环境变量设置为服务器上的值,而不需手动更改代码。
第二步:生产级别的错误处理
一个真正意义上的生产级别应用必须拥有严谨的错误处理机制。当出现未知的或者未处理的错误时,应用应该能够明确地报告错误信息并及时采取恢复措施。在 Hapi 中,使用 hapi-error 可以轻松地实现这个功能。
const HapiError = require('hapi-error'); const server = new Hapi.Server(); ... const errorHandler = new HapiError(); server.decorate('server', 'errors', errorHandler); server.ext('onPreResponse', (request, h) => { const response = request.response; const statusCode = response.statusCode; if (statusCode >= 400) { response.output.payload.error = HapiError.create(statusCode); } return h.continue; });
在上述代码中,我们首先使用 hapi-error
模块创建实例 errorHandler,然后使用 server.decorate() 方法将 errorHandler 实例绑定到服务器实例上。最后,通过使用 server.ext() 方法,将 onPreResponse 生命周期扩展到处理所有的响应, 并在响应中捕获错误信息。
第三步:使用 pm2 进行进程管理
在部署 Hapi 应用时,为了保证服务器的稳定性,使用进程管理工具是必不可少的。在 Node.js 领域中,pm2 是广受欢迎的进程管理器之一,它可以轻松地管理进程、监控日志、重启进程等等操作。
首先,使用 pm2 命令行工具,将 Hapi 应用启动,并将其作为服务运行,并自动压缩和切换日志文件:
$ pm2 start app.js --name my_app --log log/my_app.log --merge-logs --compress
注意,在部署时,应该总是使用 --production 选项来运行 Node.js 应用程序。这个选项可以设置 NODE_ENV 环境变量在 'production' 模式,从而可以禁用一些不必要的日志和调试(这也可以使用 pm2 start app.js --env production 实现)
第四步:使用 Nginx 进行反向代理
在生产环境中,使用 Nginx 作为反向代理,可以实现许多优点,如负载均衡、高可用、SSL/TLS 终止等。使用 Nginx 来作为我们 Hapi 应用的反向代理,可以让我们通过添加 SSL/TLS 支持来保护数据,同时可优化实时请求的响应时间和存储器消耗。
首先,安装 Nginx,并简单配置反向代理服务器信息:
server { listen 80; server_name mywebapp.com; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
在上述代码中,我们配置 Nginx 监听 80 端口,并将所有的基路径请求代理到本地运行于 3000 端口的 Hapi 应用服务器。此外,我们还添加了 http 版本、upgrade 选项以及更改代理请求头信息的额外选项。
第五步: 总结
以上是部署 Hapi 应用到生产环境的实践经验。通过使用相应的工具和技巧,我们可以轻松地构建和部署质量稳定的生产级别 Web 应用程序,并在实际运行中能够快速响应错误和优化性能。本文的示例代码和指导意义将有助于你快速上手并实现部署应用程序的最佳实践。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a33967add4f0e0ffb54ea9