Nginx үчүн конфигурацияларды түзүү, бир тартуу сурамынын тарыхы

Саламатсыздарбы, жолдоштор. Менин согуштук серверлеримде сулуу жөргөмүш 2006-жылдан бери иштеп келе жатат жана анын башкаруу жылдарында мен көптөгөн конфигурацияларды жана шаблондорду топтодум. Мен nginxти абдан мактадым жана кандайдыр бир жол менен мен хабда nginx хабын да баштадым, m/
Досторум менден алар үчүн өнүктүрүү фермасын түзүүнү суранышты жана аларга менин атайын шаблондорумду сүйрөп баргандын ордуна, мен кызыктуу долбоорду эстедим. nginxconfig.io, конфигурацияларды текчелерге чачыратып, баарын шифрлөө үчүн даярдайт ж.б. Мен ойлодум, эмне үчүн? Бирок, nginxconfig мага zip архивин wget/fetch/curl аркылуу серверге түз жүктөөгө уруксат бербестен, браузерге жүктөп алууну сунуштаганы мени кыжырдантты. Эмне деген куру сөз, эмнеге мага браузерде керек, консолдон серверге керек. Ачууланып, мен githubка бардым, долбоордун өзөгүн көрүү үчүн, анын айрыга жана натыйжада тартуу өтүнүчүнө алып келди. Кызыктуу болбосо жазбайт элем 😉

Nginx үчүн конфигурацияларды түзүү, бир тартуу сурамынын тарыхы

Албетте, булактарды казуудан мурун, мен Chrome конфигурациялары менен түзүлгөн zip архивин каякка тартаарын карадым, ал жерде мени "blob:" менен башталган дарек күтүп турган, ой. Кызмат жолдо эч нерсе жаратпагандыгы айкын болду, чындыгында мунун бардыгы js тарабынан жасалат. Чынында эле, zip архиви кардар, браузер жана JavaScript өзү тарабынан түзүлөт. Ошол. сулуулук бул долбоор болуп саналат nginxconfig.io жөн гана html баракчасы катары сакталып, айрымдарына жүктөлсө болот narod.ru жана ал иштейт) Бул абдан күлкүлүү жана кызыктуу чечим, бирок серверлерди орнотуу үчүн абдан ыңгайсыз, чындыгында, бул долбоор эмне үчүн түзүлгөн. Түзүлгөн архивди браузер менен жүктөп алып, анан 2019-жылы nc... аркылуу серверге өткөрөсүзбү? Мен өзүмө натыйжада конфигурацияны түз серверге жүктөөнүн жолун табуу милдетин койдум.
Долбоорду айрыгандан кийин мен кандай варианттар бар экенин ойлоно баштадым. Долбоор эч кандай арткы чексиз, таза алдыңкы план бойдон калуусу керек деген шарттан тайгым келбегендиктен тапшырма татаал болду. Албетте, эң жөнөкөй чечим - бул nodejs файлдарын чыгарып, аны түз шилтемелерди колдонуп конфигурациялары бар архивди түзүүгө мажбурлоо.
Чынында, көп варианттар болгон эмес. Тагыраак айтканда, бирөө гана ойго келди. Конфигурацияларды орнотуп, zip архивин алуу үчүн сервер консолуна көчүрө турган шилтемени алышыбыз керек.
Пайда болгон zip архивдеги бир нече текст файлдары бир аз, түз маанисинде бир нече килобайт болгон. Ачык чечим - түзүлгөн zip архивинен base64 сапты алуу жана аны буферге ыргытуу, консолдогу буйрук менен серверде

echo 'base64string' | base64 --decode > config.zip

биз ушул эле zip файлды түзө алабыз.

nginxconfig.io AngularJSде жазылган, эгер автор реактивдүү js алкагын тандабаганда, канча километр код талап кылынарын элестете да албайм. Бирок мен мунун бардыгын VueJSде канчалык жөнөкөй жана сулуураак ишке ашырууга болорун элестете алам, бирок бул такыр башка тема.
Долбоордун ресурстарында биз zip архивин түзүү ыкмасын көрөбүз:

$scope.downloadZip = function() {
	var zip = new JSZip();

	var sourceCodes = $window.document.querySelectorAll('main .file .code.source');

	for (var i = 0; i < sourceCodes.length; i++) {
		var sourceCode = sourceCodes[i];

		var name	= sourceCode.dataset.filename;
		var content	= sourceCode.children[0].children[0].innerText;

		if (!$scope.isSymlink() && name.match(/^sites-available//)) {
			name = name.replace(/^sites-available//, 'sites-enabled/');
		}

		zip.file(name, content);

		if (name.match(/^sites-available//)) {
			zip.file(name.replace(/^sites-available//, 'sites-enabled/'), '../' + name, {
				unixPermissions: parseInt('120755', 8),
			});
		}
	}

	zip.generateAsync({
		type: 'blob',
		platform: 'UNIX',
	}).then(function(content) {
		saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
	});

	gtag('event', $scope.getDomains().join(','), {
		event_category: 'download_zip',
	});
};

баары абдан жөнөкөй, китепкананы колдонуу jszip Конфигурация файлдары жайгаштырылган жерде Zip түзүлөт. Zip архивин түзгөндөн кийин, js аны китепкана аркылуу браузерге берет FileSaver.js:

saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');

бул жерде мазмун zip архивинин натыйжадагы blob объектиси болуп саналат.

Макул, мен анын жанына дагы бир баскычты кошушум керек болчу жана мен аны басканда, натыйжада zip архивин браузерге сактабайм, бирок андан base64 кодун алмакмын. Бир аз убара тартып, мен бир эле downloadZipдин ордуна 2 ыкмага ээ болдум:

$scope.downloadZip = function() {
	generateZip(function (content) {
		saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
	});

	gtag('event', $scope.getDomains().join(','), {
		event_category: 'download_zip',
	});
};
$scope.downloadBase64 = function() {
	generateZip(function (content) {
		var reader = new FileReader();
		reader.readAsDataURL(content);
		reader.onloadend = function() {
			var base64 = reader.result.replace(/^data:.+;base64,/, '');
			// в переменной base64 как раз нужный мне zip архив в виде base64 строки
		}
	});

	gtag('event', $scope.getDomains().join(','), {
		event_category: 'download_base64',
	});
};

Сиз байкагандырсыз, мен zip архивинин муунунун өзүн privategenerZip ыкмасына жылдырдым ж.б.у.с. Бул AngularJS, жана автор өзү кайра чалууларды карманып, аны убадалар аркылуу ишке ашырган эмес. downloadZip дагы эле saveAs чыгарды, ал эми downloadBase64 бир аз башкача кылды. Биз html5те бизге келген FileReader объектин түзөбүз жана буга чейин эле жеткиликтүү колдонуу үчүн. Кайсы бир убакта блобдон base64 сап түзө алат, тагыраак айтканда, ал DataURL сапты түзөт, бирок бул биз үчүн анчалык деле маанилүү эмес, анткени DataURL бизге керектүү нерсени камтыйт. Бинго, мунун баарын буферге салууга аракет кылганда мени бир аз тосмо күтүп турду. Автор долбоордо китепкананы колдонгон clipboardjs, бул тандалган тексттин негизинде флеш объекттери жок алмашуу буфери менен иштөөгө мүмкүндүк берет. Башында, мен өзүмдүн base64тү display:none; менен элементке коюуну чечтим, бирок бул учурда аны алмашуу буферине коё алган жокмун, анткени бөлүү пайда болбойт. Ошондуктан, ордуна display:none; Мен жасадым

position: absolute;
z-index: -1;
opacity: 0;

бул мага элементти көрүүдөн жашырууга жана аны баракта калтырууга мүмкүнчүлүк берди. Voila, тапшырма аткарылды, мен баскычымды басканымда буферге мындай сызык жайгаштырылган:

echo 'base64string' | base64 --decode > config.zip

Мен жөн гана сервердеги консолго чаптап, дароо бардык конфигурациялары менен zip архивин алдым.
Анан, албетте, мен авторго тартуу өтүнүчүн жөнөттүм, анткени... долбоор активдүү жана жандуу, мен автордон жаңыртууларды көргүм келет жана өзүмдүн баскычым бар) Кызыккандар үчүн бул жерде менин айры долбоор жана мен тартуу жөнүндө арыз, мен эмнени оңдогонумду/кошконумду көрө аласыз.
Баарынарга ийгилик)

Nginx үчүн конфигурацияларды түзүү, бир тартуу сурамынын тарыхы

Source: www.habr.com

Комментарий кошуу