使用 Apache2 的 NodeJS 应用程序有时会返回 503 服务器不可用

2024-04-20

风景

我有一个乌班图18.04DigitalOcean 中的服务器具有以下规格:1 vCPUs, 1GB and 25GB磁盘.

在这个服务器(我们称之为 API SERVER)中,我使用 PHP 和 NodeJS(在由 apache 管理的代理中运行)。

我使用以下规格设置我的虚拟主机(000-默认.conf,我没有使用域名):

    DocumentRoot /var/www/html/api
    #Allow Htacess Files
    <Directory "/var/www/html">
    AllowOverride All
    </Directory>

    #Nodejs (API) Directory Redirection

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full
    KeepAlive On

    <Proxy *>
    Require all granted
    </Proxy>

    <Location /node_api>
    ProxyPass http://127.0.0.1:3569 retry=0
    ProxyPassReverse http://127.0.0.1:3569
    </Location>

In /var/www/html我有两个文件夹:

  • api包含 php 制作的 api 的文件夹(只需输入服务器 IP 即可访问);
  • node_api包含节点中制作的 api 的文件夹(要访问,您需要输入服务器 ip 并添加/node_api在网址中);

我使用 PM2 来管理我的节点服务器 (server.js)。

我的 API 是做什么的

另一台服务器向该服务器(实际上是一个 API)发出请求,更具体地说是针对 PHP 中创建的文件。

PHP文件执行一些内部分析,最后它向使用node创建的api发送一些请求,等待响应并保存在本地文件中(这些请求通过CURL).

$chNodePrintDesktop = curl_init('http://MY_PUBLIC_IP_SERVER/node_api/requestScreenShootForDesktop/');
curl_setopt($chNodePrintDesktop, CURLOPT_HEADER, 0);
curl_setopt($chNodePrintDesktop, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chNodePrintDesktop, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($chNodePrintDesktop, CURLOPT_TIMEOUT, 0);
curl_setopt($chNodePrintDesktop, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); 
curl_setopt($chNodePrintDesktop, CURLOPT_POSTFIELDS, "urlsite=http://".$argv[2]);
$dataNodePrintDesktop = curl_exec($chNodePrintDesktop);
curl_close($chNodePrintDesktop);

在我的例子中,我向节点 api 发送 5 个请求,每个请求都调用不同的路由(正如我们在上面的代码中看到的,我正在调用该路由)'requestScreenShootForDesktop').

我的节点 api 中存在所有 5 条路由,请使用名为的库'puppeteer'。在这种情况下,当我调用其中一个路由时,节点会获取 CURL 发送的 url 并返回数据,例如来自路由的数据/requestScreenShootForMobile/:

app.post('/requestScreenShootForMobile/', async function(req, res){
  const pathUpload = '/var/www/html/node_api/uploads/' + Math.floor(Date.now() / 1000) + '.png';
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(req.body.urlsite);
  await await page.emulate(devices['iPhone 6']);
  await page.screenshot({path: pathUpload});
  await browser.close();

  
  var img = await fs.readFileSync(pathUpload);
  await res.writeHead(200, {'Content-Type': 'image/png' });
  await res.end(img, 'binary');
  
  
  await fs.unlinkSync(pathUpload);
});

正如您在上面看到的,每次调用路线时我都会打开和关闭 chrome。

问题

在向服务器发出的单个请求中,php 执行以下过程:

  • 执行一些内部分析。
  • 对 NODE api 的不同路由执行 5 个 CURL(请求桌面的屏幕截图,另一个移动设备的屏幕截图,抓取所有链接等等......所有这些都使用 puppeteer,每次调用路由时打开和关闭 chrome)。
  • 将所有数据保存在 .txt 文件中。

在一些分析过程中,我注意到 Node 所做的一些结果最终返回了错误503 service unavailable:

由于以下原因,服务器暂时无法满足您的请求 维护停机或容量问题。请稍后再试 Apache/2.4.29 (Ubuntu) 服务器位于 MY_PUBLIC_IP_SERVER 端口 80

第一次分析时,结果通常会正确显示,但随着执行多个分析(通常是同时执行),CURL 通常会更频繁地返回错误 503。

我尝试升级我的服务器的规格(2 个专用 vCPU, 4GB and 25GB磁盘), use retry=0 in ProxyPass,但这些都不起作用。

有趣的一点是,虽然 Node 返回错误 503,但 php 始终生成 .txt 文件。

可能发生什么情况以及如何解决这个问题?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Apache2 的 NodeJS 应用程序有时会返回 503 服务器不可用 的相关文章

  • PHP上传文件产生错误代码4。为什么?

    HTML
  • 使用 PHP/COM/ADSI/LDAP 更改 AD 密码

    我已经被这个问题困扰了好几天了 我尝试了各种解决方案均无济于事 请帮忙 Problem 我们有两个域控制器 它们不属于我们的管理范围 我们能够通过端口 389 上的 LDAP 进行连接 但无法通过端口 636 安全连接 我们正在开发一个系统
  • Ubuntu 18.04升级后php7.2-curl无法安装

    今天从 16 04 升级到 18 04do release upgrade d 在升级过程中 我被告知一些软件包将被删除 其中包括 删除 libperl5 22 lxc common perl modules 5 22 php imagic
  • Javascript 函数与 php 一样吗?

    我在网站上使用 WebIM 提供聊天支持 我希望能够在客户端启动聊天会话时设置一个计时器 如果操作员 技术人员在 x 秒内没有响应 我希望页面重定向到客户端可以留言的另一个页面 有点像 请稍等 我们尝试联系您 这样 如果所有技术人员都太忙或
  • Node.js es6 使用index.js 导出/导入

    我有以下文件夹结构 src index js lib test js dist examples example js src lib test js export default class Test src index js impor
  • Facebook 中用户的时区是如何编码的

    我需要检查用户的时区 但我找不到它的真正定义 参考API http developers facebook com docs reference api user says 用户的时区与 UTC 的偏移量 现在在维基百科上这些是可能的时区
  • 如何读取 XML 文件并从中获取值以在 PHP 编码的 HTML 页面中显示

    我有一个 XML 文件 其中有一些重复的标签 其中包含不同的值 我需要获取这些值并显示在我的网页中 请帮助我得到这个 如果您使用 PHP5 可以查看 SimpleXML 您可以在这里找到介绍教程 http www w3schools com
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • 无法在 AWS Lambda 自定义授权方中验证 Twilio 请求

    我使用 NodeJS 构建了一个自定义授权者 lambda 函数 并将其配置为授权 AWS 中的另一个 lambda 函数 这个其他函数是从 HTTP 端点触发的 并且具有我在 Twilio Messaging Service 中配置为 w
  • 带有非字符串值的 AWS S3 x-amz-meta 错误:InvalidHeader 和 InvalidParameterType

    尝试使用node js AWS sdk时s3Client upload带有元数据的可选参数 const AWS require aws sdk const s3Client new AWS S3 params Key key secret
  • 使用节点护照进行两次不同的登录

    我对两个站点 前台站点和后台 有相同的应用程序 两个站点都需要不同的登录条件 因为后台需要将 is admin 值设置为 true 这是我的登录方法 module exports verifyCredentials function use
  • htaccess 301 重定向 - 删除查询字符串 (QSA)

    我一直在努力处理一些 htaccess 重定向 我只是花了一些时间在堆栈上阅读和搜索 但无法获得适合我的场景的答案 我正在将旧客户端网站的 301 重定向到新客户端 旧页面有参数查询 我想从网址中删除它 menu php idCategor
  • 在 AWS Lambda 中共享代码

    在 AWS Lambda 函数之间共享代码的首选方式是什么 我有这样的结构 functions a 节点模块 index js 包 json b 节点模块 index js 包 json c 节点模块 index js 包 json 这让每
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • 与 array_intersect 相反?

    是否有一个内置函数可以获取数组 1 中不存在于数组 2 中的所有成员 我知道如何以编程方式执行此操作 只是想知道是否有一个内置函数可以执行相同的操作 所以请不要提供代码示例 这听起来像是一份工作array diff http www php
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015
  • 如何移动 Zend_Layout 的“视图”

    通常它会是这样的结构 application modules somemodule views scripts index index phtml 我如何将其移动到 application templates somemodule temp
  • 如何获取 URL 中未知的 $_GET 值的数组?

    我正在使用一个在线购物车 它接受订购的商品并通过 URL 将其唯一 ID 传递到 process php 页面 所以 URL 看起来像这样 process php code 1 231 code 2 532 code 3 342 Anoth
  • 如何显示 PHP 对象

    我有这样的代码 dataRecord1 client gt GetRecord token table filter echo pre print r dataRecord1 echo pre foreach dataRecord1 gt

随机推荐