Error tunneling socket could not be established statuscode 502

Hey, I am not really sure, is it a bug report or question about the module or coding in general because I am trying to a bit rework SteamCommunity.prototype.marketSearch implementation. The idea is...

Hey, I am not really sure, is it a bug report or question about the module or coding in general because I am trying to a bit rework SteamCommunity.prototype.marketSearch implementation. The idea is to switch proxy between each requests for increasing speed.
I experimentally discovered that if request to Steam every 3 second I won’t get 429 error. So with 10 proxy I can request to market every 0.3~ sec.

I have proxy pool, which I can use like this:

let proxies = [];

config.proxies.map(_proxy => {
  proxies.push({ lastUse: Date.now() - 3000, ..._proxy  });
})

const reloadProxy = () => {
  let res = proxies.shift();
  console.log(`http://${res.username}:${res.password}@${res.ip}:${res.port}`);
  if (Date.now() - res.lastUse < 3000) {
    proxies.unshift(res);   
    return reloadProxy();
  } else {
    proxies.push(res);
    return `http://${res.username}:${res.password}@${res.ip}:${res.port}`;
  }
}

So, I wanted to create externed instance of SteamCommunity for scanning market.

const sleep = require('sleep-promise');
const Cheerio = require('cheerio');
const config = require('../../config');
const Request = require('request');
const reloadProxy = require('./reloadProxy');

const SteamCommunity = require('steamcommunity');
let community = new SteamCommunity();

community.marketSearch = function(options, stream) {
  logger.info('Started parsing...')
  var qs = {};

  if(typeof options === 'string') {
    qs.query = options;
  } else {
    qs.query = options.query || '';
    qs.appid = options.appid;
    qs.search_descriptions = options.searchDescriptions ? 1 : 0;

    if(qs.appid) {
      for(var i in options) {
        if(['query', 'appid', 'searchDescriptions'].indexOf(i) != -1) {
          continue;
        }

        // This is a tag
        qs['category_' + qs.appid + '_' + i + '[]'] = 'tag_' + options[i];
      }
    }
  }

  qs.start = 0;
  qs.count = 100;
  qs.sort_column = 'price';
  qs.sort_dir = 'asc';

  var self = this;
  performSearch();

  function performSearch() {
    let USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36";
    let defaults = {  
      proxy: reloadProxy(),
      jar: this._jar,
      timeout: options.timeout || 50000,
      gzip: true,
      headers: {
        'User-Agent': USER_AGENT
      }
    };
  
    self.request = Request.defaults(defaults);
    
    self.httpRequest({
      // uri: 'https://iplogger.org/1oxzx', // here i can change uri to another, and all starts work
      uri: "https://steamcommunity.com/market/search/render/", // but when we requesting to steam, 502 error
      qs: qs,
      headers: {
        "referer": "https://steamcommunity.com/market/search"
      },
      json: true
    }, async function(err, response, body) {
      if (err) {
        if (err.code == 429) {
          logger.error('429 error! Sleeping 5 sec')
          await sleep(5000);
          performSearch();
          return;
        }
        stream.emit('error', err);
        return;
      }

      if(!body.success) {
        // return performSearch() // this is for testing proxy pool working
        stream.emit('error', new Error("Success is not true"));
        return;
      }

      if(!body.results_html) {
        stream.emit('error', new Error("No results_html in response"));
        return;
      }

      var $ = Cheerio.load(body.results_html);
      var $errorMsg = $('.market_listing_table_message');
      if($errorMsg.length > 0) {
        stream.emit('error', new Error($errorMsg.text()));
        return;
      }

      var rows = $('.market_listing_row_link');
      for(var i = 0; i < rows.length; i++) {
        stream.emit('newItem', (new CMarketSearchResult($(rows[i]))).market_hash_name);
      }

      if(body.start + body.pagesize >= body.total_count) {
        stream.emit('end', null);
        return;
      } else {
        console.log(qs.start);
        qs.start += body.pagesize;
        await sleep(3000/proxies.length);
        performSearch(); 
      }
    }, "steamcommunity");
  }
};

function CMarketSearchResult(row) {
  var match = row.attr('href').match(//market/listings/(d+)/([^?/]+)/);

  this.appid = parseInt(match[1], 10);
  this.market_hash_name = decodeURIComponent(match[2]);
  this.image = ((row.find('.market_listing_item_img').attr('src') || "").match(/^https?://[^/]+/economy/image/[^/]+//) || [])[0];
  this.price = parseInt(row.find('.market_listing_their_price .market_table_value span.normal_price').text().replace(/[^d]+/g, ''), 10);
  this.quantity = parseInt(row.find('.market_listing_num_listings_qty').text().replace(/[^d]+/g, ''), 10);
}

module.exports = community;

This is like the same as your implementation, but here I reload proxy each request and use stream to push elements back. So I can use this ljust like this:

const createAllItemStream = async () => {
  const itemsStream = new Readable();
  itemsStream._read = function () {};
  community.marketSearch({
    // query: 'desert', 
    appid: 730
  }, itemsStream);

  return itemsStream;
}

module.exports = async ({ mod }) => {
  if (mod == 'stream')
    return createAllItemStream();
  if (mod == 'silent' || !mod) {
    let count = 0;
    const itemsStream = await createAllItemStream();
    itemsStream.on('error', (err) => {
      throw err;
    });
    itemsStream.on('newItem', async (itemName) => {
      let item = await Item.findOrCreate({ where: { marketHashName: itemName }, defaults: { status: 'new' } });
      if (item[1]) count++;
    })
    itemsStream.on('end', () => {
      logger.info(`${count} new items.`);
      return count;
    });
  }
}

And when I requesting to Steam I get this:

(node:14916) UnhandledPromiseRejectionWarning: Error: tunneling socket could not be established, statusCode=502
    at ClientRequest.onConnect (D:Desktopworkprojectssteam-market-botnode_modulestunnel-agentindex.js:166:19)
    at Object.onceWrapper (events.js:273:13)
    at ClientRequest.emit (events.js:182:13)
    at Socket.socketOnData (_http_client.js:482:11)
    at Socket.emit (events.js:182:13)
    at addChunk (_stream_readable.js:283:12)
    at readableAddChunk (_stream_readable.js:264:11)
    at Socket.Readable.push (_stream_readable.js:219:10)
    at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
(node:14916) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function withoutout a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:14916) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will termerminate the Node.js process with a non-zero exit code.

Do you know what does it mean, or how to fix it?

[Enter steps to reproduce below:]

Atom Version: 1.12.9
Electron Version: 1.3.13
System: Mac OS X 10.12.1
Thrown From: Atom Core

Stack Trace

Uncaught Error: tunneling socket could not be established, statusCode=502

At stream.js:74

Error: tunneling socket could not be established, statusCode=502
    at ClientRequest.onConnect (/Applications/Atom.app/Contents/Resources/app.asar/node_modules/tunnel-agent/index.js:165:19)
    at ClientRequest.g (events.js:286:16)
    at emitThree (events.js:116:13)
    at ClientRequest.emit (events.js:194:7)
    at Socket.socketOnData (_http_client.js:393:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:176:18)
    at Socket.Readable.push (_stream_readable.js:134:10)
    at TCP.onread (net.js:543:20)

Commands

     -4:22.3.0 settings-view:open (atom-text-editor.editor.is-focused)
  2x -3:16 core:confirm (atom-text-editor.editor.mini.is-focused)

Config

{
  "core": {
    "customFileTypes": {
      "source.ini": [
        ".buckconfig",
        ".hgrc",
        ".flowconfig"
      ],
      "source.json": [
        ".arcconfig",
        "BUCK.autodeps"
      ],
      "source.python": [
        "BUCK"
      ]
    },
    "disabledPackages": [
      "tree-view",
      "language-babel"
    ],
    "telemetryConsent": "limited",
    "themes": [
      "atom-dark-ui",
      "one-dark-syntax"
    ]
  }
}

Installed Packages

# User
atom-react-native-autocomplete, v0.0.27 (active)
haskell-grammar, v0.4.0 (active)
highlight-selected, v0.11.2 (active)
language-babel, v2.48.5 (inactive)
language-graphql, v0.8.0 (active)
language-ini, v1.17.0 (active)
language-javascript-jsx, v0.3.7 (active)
language-lua, v0.9.11 (active)
language-ocaml, v1.1.2 (active)
language-swift, v0.5.0 (active)
language-thrift, v1.0.2 (active)
merge-conflicts, v1.4.4 (active)
nuclide, v0.195.0 (active)
nuclide-format-js, v0.0.36 (inactive)
react, v0.16.2 (active)
set-syntax, v0.3.2 (active)
simplified-chinese-menu, v3.5.0 (active)
sort-lines, v0.14.0 (inactive)
tool-bar, v1.0.1 (active)
atom-dark-syntax, v0.27.0 (inactive)
atom-dark-ui, v0.52.0 (active)
atom-light-syntax, v0.28.0 (inactive)
atom-light-ui, v0.45.0 (inactive)
base16-tomorrow-dark-theme, v1.3.0 (inactive)
base16-tomorrow-light-theme, v1.3.0 (inactive)
one-dark-ui, v1.6.2 (inactive)
one-light-ui, v1.6.2 (inactive)
one-dark-syntax, v1.5.0 (active)
one-light-syntax, v1.5.0 (inactive)
solarized-dark-syntax, v1.0.5 (inactive)
solarized-light-syntax, v1.0.5 (inactive)
about, v1.7.0 (active)
archive-view, v0.62.0 (active)
autocomplete-atom-api, v0.10.0 (active)
autocomplete-css, v0.13.1 (active)
autocomplete-html, v0.7.2 (active)
autocomplete-plus, v2.31.4 (active)
autocomplete-snippets, v1.11.0 (active)
autoflow, v0.27.0 (inactive)
autosave, v0.23.1 (active)
background-tips, v0.26.1 (active)
bookmarks, v0.42.0 (active)
bracket-matcher, v0.82.2 (active)
command-palette, v0.39.0 (inactive)
deprecation-cop, v0.54.1 (active)
dev-live-reload, v0.47.0 (active)
encoding-selector, v0.22.0 (active)
exception-reporting, v0.40.0 (active)
find-and-replace, v0.202.2 (inactive)
fuzzy-finder, v1.4.0 (active)
git-diff, v1.1.0 (active)
go-to-line, v0.31.0 (inactive)
grammar-selector, v0.48.2 (active)
image-view, v0.60.0 (active)
incompatible-packages, v0.26.1 (active)
keybinding-resolver, v0.35.0 (active)
line-ending-selector, v0.5.0 (active)
link, v0.31.2 (inactive)
markdown-preview, v0.158.8 (active)
metrics, v1.1.2 (active)
notifications, v0.65.1 (active)
open-on-github, v1.2.1 (inactive)
package-generator, v1.0.1 (inactive)
settings-view, v0.243.1 (active)
snippets, v1.0.4 (active)
spell-check, v0.68.4 (active)
status-bar, v1.4.1 (active)
styleguide, v0.47.2 (active)
symbols-view, v0.113.1 (inactive)
tabs, v0.103.0 (active)
timecop, v0.33.2 (active)
tree-view, v0.210.0 (inactive)
update-package-dependencies, v0.10.0 (active)
welcome, v0.35.1 (active)
whitespace, v0.35.0 (active)
wrap-guide, v0.38.2 (active)
language-c, v0.54.0 (active)
language-clojure, v0.22.1 (active)
language-coffee-script, v0.48.0 (active)
language-csharp, v0.13.0 (active)
language-css, v0.40.1 (active)
language-gfm, v0.88.0 (active)
language-git, v0.15.0 (active)
language-go, v0.43.0 (active)
language-html, v0.47.1 (active)
language-hyperlink, v0.16.1 (active)
language-java, v0.24.0 (active)
language-javascript, v0.122.0 (active)
language-json, v0.18.3 (active)
language-less, v0.29.6 (active)
language-make, v0.22.2 (active)
language-mustache, v0.13.0 (active)
language-objective-c, v0.15.1 (active)
language-perl, v0.37.0 (active)
language-php, v0.37.3 (active)
language-property-list, v0.8.0 (active)
language-python, v0.45.1 (active)
language-ruby, v0.70.2 (active)
language-ruby-on-rails, v0.25.1 (active)
language-sass, v0.57.0 (active)
language-shellscript, v0.23.0 (active)
language-source, v0.9.0 (active)
language-sql, v0.25.0 (active)
language-text, v0.7.1 (active)
language-todo, v0.29.1 (active)
language-toml, v0.18.1 (active)
language-xml, v0.34.12 (active)
language-yaml, v0.27.1 (active)

# Dev
No dev packages

Ошибка 502 при открытии сайта может появиться неожиданно. В этой статье мы расскажем, что значит код ошибки 502 и что может сделать пользователь и владелец сайта, чтобы её исправить.

Ошибка 502 Bad Gateway: что значит

Файлы любого сайта находятся на физическом сервере. Чтобы их получить и отобразить веб-ресурс на компьютере, браузер делает запрос на сервер. Если он по какой-либо причине не передал файлы, появляется ошибка 500-511.

Ошибка 502 Bad Gateway возникает при неправильной работе прокси-сервера, DNS-сервера и чаще всего сервера, на котором размещён сайт. Проблема может распространяться как на весь ресурс, так и на отдельные страницы. Это зависит от характера проблемы. Существуют разновидности 502 ошибки: Bad Gateway Nginx, Bad Gateway Apache. Об их отличиях мы расскажем ниже. Также эта ошибка может иметь формулировки:

  • Bad Gateway: Registered endpoint failed to handle the request, Temporary Error (502),
  • Error 502,
  • Bad 502 Gateway,
  • 502 Error,
  • 502. That’s an error,
  • 502 Service Temporarily Overloaded,
  • 502 Server Error: The server encountered a temporary error and could not complete your request,
  • 502 – Web server received an invalid response while acting as a gateway or proxy server,
  • 502 Bad Gateway Nginx,
  • 502 Proxy Error,
  • HTTP 502,
  • HTTP Error 502 Bad Gateway.


Что значит плохой шлюз: ошибка 502

Причины возникновения ошибки 502 Bad Gateway

  1. Первая и основная причина ― перегрузка сервера. Перегрузка может быть вызвана несколькими проблемами:

  2. Большое количество посетителей одновременно. Веб-ресурс может посещать ограниченное количество посетителей. Сколько человек может посетить сайт зависит от возможностей сервера (размера оперативной памяти) и настроек, которые сделал создатель ресурса. Если по какой-либо причине на сайт зайдёт больше пользователей, чем запланировано, сервис может не справиться и страница выдаст код 502. Такое случается при рекламных акциях и распродажах в интернет-магазинах.
  3. Атака хакеров или DDoS-атака. Эта проблема связана с предыдущей причиной перегрузки. Хакер имитирует большой наплыв пользователей, из-за чего сервер выходит из строя. Такие атаки могут быть использованы для снижения продаж.
  4. Плохая оптимизация сайта. Настройки ресурса сделаны так, что маленькое количество посетителей генерирует много запросов. В этом случае нужно оптимизировать работу сервера с пользовательскими запросами.
  5. Второй причиной возникновения кода 502 могут явиться ошибки РНР. Если для расширения функционала сайта в панель управления были добавлены некорректно настроенные плагины, они могут выдавать проблемы в своей работе. Вместе с ними ошибку покажет и сайт целиком. Также если код сайта написан неправильно, запросы могут давать отрицательный результат.
  6. Ошибка браузера. Проблема может быть на стороне пользователя, если у него установлены расширения, которые нарушают соединение с сервером сайта.

Чем отличается ошибка 502 Bad Gateway Nginx

Между браузером и сервером может стоять веб-сервер. Он используется для снижения нагрузки на сервер, аутентификации пользователей и многого другого. Самые популярные программы для создания веб-сервера ― Nginx и Apache. Так как веб-сервер является посредником между браузером и сервером, то именно он будет оповещать пользователя о проблеме. Поэтому в зависимости от веб-сервера в сообщении вы можете увидеть надпись Bad Gateway Nginx или Bad Gateway Apache. При этом причины возникновения проблемы одинаковы.

Как исправить ошибку 502

Что делать, если вы пользователь

  1. Перезагрузите страницу, если проблема была вызвана наплывом посетителей. Возможно, через некоторое время посетители уйдут со страницы и вы сможете увидеть контент.
  2. Попробуйте зайти на другой веб-ресурс. Если вы можете зайти на другой сайт, значит проблема на стороне владельца ресурса и вы ничего не можете сделать. Вернитесь на страницу позже, когда администратор восстановит доступ.
  3. Проверьте подключение к интернету. Из-за низкой скорости или нестабильности соединения браузер может не получать данные с сервера.
  4. Запустите браузер в режиме «Инкогнито». В режиме «Инкогнито» браузер работает с базовыми настройками. Если вам удалось зайти на веб-ресурс в этом режиме, значит одно из ваших расширений браузера мешает соединению. Это расширение нужно отключить.
  5. Почистите файлы cookies. Если при повторном входе на сайт всё равно отображается ошибка 502, очистите кэш браузера. Возможно, доступ уже восстановлен, но ваш браузер обращается к старой версии страницы из кэша.
  6. Очистите кэш DNS. DNS-кэш — это временная база данных вашего компьютера, которая хранит записи обо всех последних посещениях и попытках посещений веб-сайтов и их IP-адресах. Кэш позволяет ускорить вход на часто посещаемые веб-ресурсы. Если у сайта изменились DNS, а данные из кэша отправляют на старый IP-адрес, в браузере появится код 502. После очистки браузер начнёт обращаться к новому IP-адресу.


Как очистить кэш DNS

В зависимости от вашей операционной системы очистите кэш по одной из инструкций.

  1. Откройте командную строку. Для этого введите в поисковую строку «Командная строка» и выберите появившееся приложение:
  1. Введите команду:

ipconfig /flushdns

  1. Дождитесь сообщения об очистке кэша:
  1. Откройте терминал клавишами Ctrl+Alt+T.
  2. Введите команду:

Для Ubuntu:

sudo service network-manager restart

Для других дистрибутивов:

sudo /etc/init.d/nscd restart

  1. Войдите в терминал. Для этого нажмите клавиши Command + Space. Введите Терминал и нажмите на найденное приложение.
  2. Введите команду:

sudo killall -HUP mDNSResponder

Готово, вы очистили кеш DNS. Попробуйте заново зайти на сайт.

Что делать, если вы владелец сайта

Проверьте количество свободной памяти. Это можно сделать двумя способами.

Способ 1 ― введите команду top в командной строке сервера:

Mem ― вся оперативная память.

Swap ― раздел подкачки.

Посмотрите на строку Memfree. Это количество свободного места на сервере. Если там указано маленькое число, ошибка 502 Bad Gateway появляется из-за нехватки памяти. Увеличьте количество оперативной памяти и проблема пропадёт. Также в результатах можно будет увидеть, какую нагрузку на сервер даёт каждый отдельный процесс.

Способ 2 ― введите команду free -m.

Mem ― вся оперативная память.

Swap ― раздел подкачки.

В строке Memfree показано свободное место на сервере. Если там маленькое число, увеличьте количество оперативной памяти.

Проверьте логи сервера. Если проблема возникла в момент каких-либо обновлений на сайте, проверьте журнал изменений, чтобы отменить те доработки, которые нарушили функциональность сервера. Также в логах можно увидеть DDos-атаку. Если дело в нехватке памяти, в логах отобразится ошибка OOM (out of memory).

Проверьте плагины в WordPress. Если ваш сайт создан на WordPress, некоторые плагины и темы могут нарушать работу сервера.

  1. 1.

    Войдите в панель управления WordPress. Если вы пользуетесь услугой REG.Site, войти в панель управления CMS можно прямо из Личного кабинета.

  2. 2.

    Перейдите во вкладку «Плагины» ― «Установленные».

  3. 3.

    Нажмите Деактивировать у плагина, который, как вам кажется, повлиял на работу сайта:

Можно сразу отключить все плагины, чтобы убедиться, что один из них влияет на работу сервера. И далее по очереди включайте плагины, пока не найдёте конкретный плагин-виновник.

Проверьте, как работают вспомогательные службы, например MySQL и Memcached. Иногда они могут стать причиной 502 ошибки.

Свяжитесь со службой поддержки своего хостинг-провайдера. Если ничего из вышеперечисленного не помогло, обратитесь к службе поддержки и подробно опишите проблему и действия, которые вы предприняли до обращения. Действуйте по одной из инструкций ниже.


Сайт находится на виртуальном хостинге REG.RU

Если вы столкнулись с единичными случаями возникновения 502 ошибки, можете проигнорировать их.
Если код 502 возникает регулярно, напишите заявку в службу поддержки. В заявке укажите:

  1. Точное московское время наблюдения проблемы.
  2. Название сайта, на котором была замечена проблема.
  3. Если ошибка отображается не сразу, а после определённых действий (добавление изображения, отправка формы с сайта, импорт файлов), подробно опишите порядок действий, по которому мы сможем воспроизвести проблему.
  4. Если для воспроизведения проблемы необходимо авторизоваться в административной части сайта, предоставьте логин и пароль для доступа.


Сайт находится на VPS REG.RU

Чаще всего на VPS используется связка: Nginx + бэкенд-сервер (Apache, PHP-FPM, Gunicorn, NodeJS). Ошибка 502 возникает в случае, если Nginx не может получить ответ от этих сервисов.
Клиенты с VPS сталкиваются с «502 Bad Gateway», когда:

  • какой-то из сервисов выключен. Перезапустите веб-сервер Apache, PHP-FPM либо другой сервис, с которым работает Nginx;
  • между Nginx и бэкенд-сервером некорректно настроена связь. Например, Nginx производит обращение к порту 8080, а веб-сервер Apache «слушает» на 8081. В этом случае необходимо скорректировать настройки веб-сервера.

Если вам не удалось самостоятельно устранить ошибку 502, обратитесь в техподдержку. В заявке укажите:

  1. Точное московское время наблюдения проблемы.
  2. Название сайта, на котором была замечена проблема.
  3. Если ошибка отображается не сразу, а после определённых действий (добавление изображения, отправка формы с сайта, импорт файлов), подробно опишите порядок действий, по которому мы сможем воспроизвести проблему.
  4. Если для воспроизведения проблемы необходимо авторизоваться в административной части сайта, предоставьте логин и пароль для доступа.

Понравилась статья? Поделить с друзьями:
  • Error ts5055 cannot write file because it would overwrite input file
  • Error ts2769 no overload matches this call
  • Error ts2532 object is possibly undefined
  • Error ts2503 cannot find namespace nodejs
  • Error ts18003 no inputs were found in config file