Pm2, Nginx или Nodejs doesent предоставляют новейшую версию развернутого маршрута - PullRequest
0 голосов
/ 08 октября 2018

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

Полагаю, это послужит хорошим уроком для кэшей Nginx, pm2 или Nodejs, которые могут быть интересны всем, кто разрабатывает с помощью этих приложений / рамок.

Факты:

Настройка

  • Сервер Ubuntu 16.04
  • развертывание на сервере через pm2 с компьютера Windows 10
  • приложениянаписано в nodejs v8.9.4

История до фактической ошибки

  • Приложение работало около полутора месяцев после первого развертываниябез проблем
  • Сегодня приложение отображало ошибку: TypeError: путь должен быть строкой.Получено не определено
  • Чтобы получить текущее состояние программы на компьютере, я приступил к обновлению приложения с помощью функции обновления pm2.
  • Приложение снова работало после обновления,Во время развертывания npm установка выполняется снова, и я подумал, что это только что исправило проблему.

Фактическая ошибка

  • В ходе дальнейшего тестирования яобнаружил, что одна из функций загрузки для Zip-файла больше не работает.
  • После попытки / тестирования (с mocha) того же маршрута на моем локальном компьютере я пришел к решению, что с чем-то не такпуть к месту, где файл должен быть сохранен и извлечен из него.
  • Тестирование для получения дополнительной регистрации из приложения не сработало.
  • При входе на веб-страницу маршрута Nginx, pm2или приложение, кажется, предоставляет старую страницу до того, как я ее отредактировал.Хотя код на сервере определенно совпадает с кодом на моем компьютере.
  • Cognito также не показывает / не использует новую страницу.
  • Я действительно был уверен в этом факте послеразвертывание несколько раз с другими другими путями для сохранения файла zip, как вы можете видеть в примере.Он всегда пытается найти файл с этим путем: '/web/l18n/archive.zip'
  • Даже если я указываю другой путь в файле маршрута, zip-файл всегда сохраняется в' / web/archive.zip'

Код

Не забывайте, что я уже много играл с кодом, чтобы устранить некоторые очевидные проблемы,Обе части запроса if, задающего путь к месту сохранения пути archive.zip, не влияют на Сообщение об ошибке

var zip = new JSZip()

	const dictionaryName = process.env.dictionaryNames
	const splitDictionaryName = dictionaryName.split(';')

	for (const dictionary of splitDictionaryName) {
		const tempDictionaryPath = path.join(__dirname, '/../../' + process.env.dictionaryFolder + '/dictionary.' + dictionary + '.json')
		const dictionaryContent = fs.readFileSync(tempDictionaryPath, 'utf8')
		zip.file('dictionary.' + dictionary + '.json', dictionaryContent)
	}
	await zip.generateAsync({
		type: 'nodebuffer'
	})
		.then(async function (content) {
			const stateString = process.env.state | 'local'
			let archivePath = ''

			if (stateString === 'staging') {
				archivePath = '/web/l18n/current/afasfsagf.zip'
			} else {
				archivePath = path.join(__dirname, '/../aasdasfgasfgs.zip')
			}

			await fs.writeFile(archivePath, content, function (err) {
				if (err) {
					global.log.info(err)
					res.send({})
				} else {
					res.download(archivePath)
				}
			})
		}).catch(function (err) {
			global.log.err(err)
		})

Маршрутизация

Маршрут загружается напрямую через файл, указанный выше.Любой другой маршрут, даже более продвинутый способ обработки файлов, работает нормально.

const downloadAll = require('./routes/downloadAll.js')

this.http = express() 

this.http.get('/download_all', downloadAll)

Рули "Запрос"

Доступ к маршруту осуществляется через новое окно, которое открывается при нажатии кнопки на кнопкеОсновной домашний маршрут.

$('button').click(function (event) {
		let buttonId = $(this).attr('id')
		if (buttonId === 'downloadAllDictionaries') {
			var win = window.open('/download_all')
			window.location.reload()
		}
	})

Nginx

server {
listen 80;


server_name ****;
access_log /var/log/nginx/****.access.log;
error_log /var/log/nginx/****.error.log;
# pass the request to the node.js server with the correct headers
# and much more can be added, see nginx config options


location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_pass http://127.0.0.1:7000;
    proxy_set_header Host **********;
    proxy_redirect off;
}

listen 443 ssl; # managed by Certbot

include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


if ($scheme != "https") {
    return 301 https://$host$request_uri;
} # managed by Certbot
}

1 Ответ

0 голосов
/ 08 октября 2018

Убедитесь, что nginx не кэширует прокси-запросы.

Добавьте эти 2 строки в расположение прокси:

location / { add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; expires off; }

...