Ответ 1
Я думаю, что ошибка от Nginx указывает на то, что соединение было закрыто вашим сервером nodejs (т.е. "вверх по течению" ). Как настроено nodejs?
Я использую сервер nginx и node для обслуживания запросов на обновление. Я получаю тайм-аут шлюза, когда я запрашиваю обновление для больших данных. Я видел эту ошибку из журналов ошибок nginx:
2016/04/07 00:46:04 [error] 28599 # 0: * 1 вверх по течению преждевременно закрытого соединения при чтении заголовка ответа от восходящего потока, клиент: 10.0.2.77, server: gis.oneconcern.com, request: GET/update_mbtiles/atlas19891018000415 HTTP/1.1 ", upstream:" http://127.0.0.1:7777/update_mbtiles/atlas19891018000415 ", хост:" gis.oneconcern.com"
Я ошибся в ошибке Google и попытался все, что мог, но я все еще получаю ошибку.
У моего nginx conf есть эти настройки прокси-сервера:
##
# Proxy settings
##
proxy_connect_timeout 1000;
proxy_send_timeout 1000;
proxy_read_timeout 1000;
send_timeout 1000;
Вот как настроен мой сервер
server {
listen 80;
server_name gis.oneconcern.com;
access_log /home/ubuntu/Tilelive-Server/logs/nginx_access.log;
error_log /home/ubuntu/Tilelive-Server/logs/nginx_error.log;
large_client_header_buffers 8 32k;
location / {
proxy_pass http://127.0.0.1:7777;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
}
location /faults {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_buffers 8 64k;
proxy_buffer_size 128k;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Я использую бэкэнд nodejs для обслуживания запросов на сервере aws. Ошибка шлюза появляется только тогда, когда обновление занимает много времени (около 3-4 минут). Я не получаю никаких ошибок для небольших обновлений. Любая помощь будет высоко оценена.
Node Код js:
app.get("/update_mbtiles/:earthquake", function(req, res){
var earthquake = req.params.earthquake
var command = spawn(__dirname + '/update_mbtiles.sh', [ earthquake, pg_details ]);
//var output = [];
command.stdout.on('data', function(chunk) {
// logger.info(chunk.toString());
// output.push(chunk.toString());
});
command.stderr.on('data', function(chunk) {
// logger.error(chunk.toString());
// output.push(chunk.toString());
});
command.on('close', function(code) {
if (code === 0) {
logger.info("updating mbtiles successful for " + earthquake);
tilelive_reload_and_switch_source(earthquake);
res.send("Completed updating!");
}
else {
logger.error("Error occured while updating " + earthquake);
res.status(500);
res.send("Error occured while updating " + earthquake);
}
});
});
function tilelive_reload_and_switch_source(earthquake_unique_id) {
tilelive.load('mbtiles:///'+__dirname+'/mbtiles/tipp_out_'+ earthquake_unique_id + '.mbtiles', function(err, source) {
if (err) {
logger.error(err.message);
throw err;
}
sources.set(earthquake_unique_id, source);
logger.info('Updated source! New tiles!');
});
}
Спасибо.
Я думаю, что ошибка от Nginx указывает на то, что соединение было закрыто вашим сервером nodejs (т.е. "вверх по течению" ). Как настроено nodejs?
Я решил это, установив более высокое значение тайм-аута для прокси:
location / {
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
proxy_pass http://localhost:3000;
}
Документация: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
У меня была такая же ошибка довольно долго, и вот что исправило ее для меня.
Я просто заявил в сервисе, что я использую следующее:
Description= Your node service description
After=network.target
[Service]
Type=forking
PIDFile=/tmp/node_pid_name.pid
Restart=on-failure
KillSignal=SIGQUIT
WorkingDirectory=/path/to/node/app/root/directory
ExecStart=/path/to/node /path/to/server.js
[Install]
WantedBy=multi-user.target
Что должно привлечь ваше внимание, так это "After = network.target". Я проводил дни и дни в поисках исправлений на стороне nginx, хотя проблема была именно в этом. Чтобы быть уверенным, прекратите запуск имеющейся у вас службы узла, запустите команду ExecStart напрямую и попробуйте воспроизвести ошибку. Если он не появляется, это просто означает, что у вашего сервиса есть проблема. По крайней мере, так я нашел свой ответ.
Для всех остальных, удачи!
Вы можете увеличить время ожидания в узле следующим образом.
app.post('/slow/request', function(req, res){ req.connection.setTimeout(100000);//100 seconds... }
В моем случае я попытался увеличить время ожидания в файле конфигурации, но не получилось. Позже выяснилось, что он работал, когда фильтровал меньше данных для отображения на одной странице. В views.py я просто добавил "& Q (year = 2019)", чтобы отображать только данные за 2019 год. Кстати, постоянное исправление будет использовать разбиение на страницы.
def list_offers(request, list_type):
context = {}
context['list_type'] = list_type
if list_type == 'ready':
context['menu_page'] = 'ready'
offer_groups = OfferGroup.objects.filter(~Q(run_status=OfferGroup.DRAFT) & Q(year=2019)).order_by('-year', '-week')
context['grouped_offers'] = offer_groups
return render(request, 'app_offers/list_offers.html', context)
Я добавляю это в мой файл nginx.conf, и он работает.
http {
fastcgi_connect_timeout 6000;
fastcgi_send_timeout 3000;
fastcgi_read_timeout 3000;
fastcgi_buffer_size 1m;
fastcgi_buffers 4 1m;
fastcgi_busy_buffers_size 1m;
fastcgi_temp_file_write_size 1m;
client_max_body_size 2m;
}