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
-
Первая и основная причина ― перегрузка сервера. Перегрузка может быть вызвана несколькими проблемами:
- Большое количество посетителей одновременно. Веб-ресурс может посещать ограниченное количество посетителей. Сколько человек может посетить сайт зависит от возможностей сервера (размера оперативной памяти) и настроек, которые сделал создатель ресурса. Если по какой-либо причине на сайт зайдёт больше пользователей, чем запланировано, сервис может не справиться и страница выдаст код 502. Такое случается при рекламных акциях и распродажах в интернет-магазинах.
- Атака хакеров или DDoS-атака. Эта проблема связана с предыдущей причиной перегрузки. Хакер имитирует большой наплыв пользователей, из-за чего сервер выходит из строя. Такие атаки могут быть использованы для снижения продаж.
- Плохая оптимизация сайта. Настройки ресурса сделаны так, что маленькое количество посетителей генерирует много запросов. В этом случае нужно оптимизировать работу сервера с пользовательскими запросами.
- Второй причиной возникновения кода 502 могут явиться ошибки РНР. Если для расширения функционала сайта в панель управления были добавлены некорректно настроенные плагины, они могут выдавать проблемы в своей работе. Вместе с ними ошибку покажет и сайт целиком. Также если код сайта написан неправильно, запросы могут давать отрицательный результат.
- Ошибка браузера. Проблема может быть на стороне пользователя, если у него установлены расширения, которые нарушают соединение с сервером сайта.
Чем отличается ошибка 502 Bad Gateway Nginx
Между браузером и сервером может стоять веб-сервер. Он используется для снижения нагрузки на сервер, аутентификации пользователей и многого другого. Самые популярные программы для создания веб-сервера ― Nginx и Apache. Так как веб-сервер является посредником между браузером и сервером, то именно он будет оповещать пользователя о проблеме. Поэтому в зависимости от веб-сервера в сообщении вы можете увидеть надпись Bad Gateway Nginx или Bad Gateway Apache. При этом причины возникновения проблемы одинаковы.
Как исправить ошибку 502
Что делать, если вы пользователь
- Перезагрузите страницу, если проблема была вызвана наплывом посетителей. Возможно, через некоторое время посетители уйдут со страницы и вы сможете увидеть контент.
- Попробуйте зайти на другой веб-ресурс. Если вы можете зайти на другой сайт, значит проблема на стороне владельца ресурса и вы ничего не можете сделать. Вернитесь на страницу позже, когда администратор восстановит доступ.
- Проверьте подключение к интернету. Из-за низкой скорости или нестабильности соединения браузер может не получать данные с сервера.
- Запустите браузер в режиме «Инкогнито». В режиме «Инкогнито» браузер работает с базовыми настройками. Если вам удалось зайти на веб-ресурс в этом режиме, значит одно из ваших расширений браузера мешает соединению. Это расширение нужно отключить.
- Почистите файлы cookies. Если при повторном входе на сайт всё равно отображается ошибка 502, очистите кэш браузера. Возможно, доступ уже восстановлен, но ваш браузер обращается к старой версии страницы из кэша.
- Очистите кэш DNS. DNS-кэш — это временная база данных вашего компьютера, которая хранит записи обо всех последних посещениях и попытках посещений веб-сайтов и их IP-адресах. Кэш позволяет ускорить вход на часто посещаемые веб-ресурсы. Если у сайта изменились DNS, а данные из кэша отправляют на старый IP-адрес, в браузере появится код 502. После очистки браузер начнёт обращаться к новому IP-адресу.
Как очистить кэш DNS
В зависимости от вашей операционной системы очистите кэш по одной из инструкций.
- Откройте командную строку. Для этого введите в поисковую строку «Командная строка» и выберите появившееся приложение:
- Введите команду:
ipconfig /flushdns
- Дождитесь сообщения об очистке кэша:
- Откройте терминал клавишами Ctrl+Alt+T.
- Введите команду:
Для Ubuntu:
sudo service network-manager restart
Для других дистрибутивов:
sudo /etc/init.d/nscd restart
- Войдите в терминал. Для этого нажмите клавиши Command + Space. Введите Терминал и нажмите на найденное приложение.
- Введите команду:
sudo killall -HUP mDNSResponder
Готово, вы очистили кеш DNS. Попробуйте заново зайти на сайт.
Что делать, если вы владелец сайта
Проверьте количество свободной памяти. Это можно сделать двумя способами.
Способ 1 ― введите команду top
в командной строке сервера:
Mem ― вся оперативная память.
Swap ― раздел подкачки.
Посмотрите на строку Mem ― free. Это количество свободного места на сервере. Если там указано маленькое число, ошибка 502 Bad Gateway появляется из-за нехватки памяти. Увеличьте количество оперативной памяти и проблема пропадёт. Также в результатах можно будет увидеть, какую нагрузку на сервер даёт каждый отдельный процесс.
Способ 2 ― введите команду free -m
.
Mem ― вся оперативная память.
Swap ― раздел подкачки.
В строке Mem ― free показано свободное место на сервере. Если там маленькое число, увеличьте количество оперативной памяти.
Проверьте логи сервера. Если проблема возникла в момент каких-либо обновлений на сайте, проверьте журнал изменений, чтобы отменить те доработки, которые нарушили функциональность сервера. Также в логах можно увидеть DDos-атаку. Если дело в нехватке памяти, в логах отобразится ошибка OOM (out of memory).
Проверьте плагины в WordPress. Если ваш сайт создан на WordPress, некоторые плагины и темы могут нарушать работу сервера.
-
1.
Войдите в панель управления WordPress. Если вы пользуетесь услугой REG.Site, войти в панель управления CMS можно прямо из Личного кабинета.
-
2.
Перейдите во вкладку «Плагины» ― «Установленные».
-
3.
Нажмите Деактивировать у плагина, который, как вам кажется, повлиял на работу сайта:
Можно сразу отключить все плагины, чтобы убедиться, что один из них влияет на работу сервера. И далее по очереди включайте плагины, пока не найдёте конкретный плагин-виновник.
Проверьте, как работают вспомогательные службы, например MySQL и Memcached. Иногда они могут стать причиной 502 ошибки.
Свяжитесь со службой поддержки своего хостинг-провайдера. Если ничего из вышеперечисленного не помогло, обратитесь к службе поддержки и подробно опишите проблему и действия, которые вы предприняли до обращения. Действуйте по одной из инструкций ниже.
Сайт находится на виртуальном хостинге REG.RU
Если вы столкнулись с единичными случаями возникновения 502 ошибки, можете проигнорировать их.
Если код 502 возникает регулярно, напишите заявку в службу поддержки. В заявке укажите:
- Точное московское время наблюдения проблемы.
- Название сайта, на котором была замечена проблема.
- Если ошибка отображается не сразу, а после определённых действий (добавление изображения, отправка формы с сайта, импорт файлов), подробно опишите порядок действий, по которому мы сможем воспроизвести проблему.
- Если для воспроизведения проблемы необходимо авторизоваться в административной части сайта, предоставьте логин и пароль для доступа.
Сайт находится на 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, обратитесь в техподдержку. В заявке укажите:
- Точное московское время наблюдения проблемы.
- Название сайта, на котором была замечена проблема.
- Если ошибка отображается не сразу, а после определённых действий (добавление изображения, отправка формы с сайта, импорт файлов), подробно опишите порядок действий, по которому мы сможем воспроизвести проблему.
- Если для воспроизведения проблемы необходимо авторизоваться в административной части сайта, предоставьте логин и пароль для доступа.