Myndun stillinga fyrir nginx, saga um eina dráttarbeiðni

Sælir, félagar. Fallegt á combat serverunum mínum nginx hefur verið í gangi síðan 2006 og í gegnum árin með stjórn þess hef ég safnað fullt af stillingum og sniðmátum. Ég hrósaði nginx mikið og einhvern veginn kom í ljós að ég byrjaði meira að segja nginx hub á hubinu líka, sýndu m/
Vinir báðu mig um að setja upp þróunarbú fyrir sig og í stað þess að draga þá tilteknu sniðmátin mín, mundi ég eftir áhugaverðu verkefni nginxconfig.io, sem dreifir stillingum í hillunum og undirbýr allt fyrir lets dulkóðun o.s.frv. Ég hugsaði, hvers vegna ekki? Hins vegar varð ég reiður yfir því að nginxconfig býður mér að hlaða niður zip skjalasafninu í vafrann, án þess að leyfa mér að hlaða því beint inn á netþjóninn með wget/fetch/curl. Hvaða vitleysa, af hverju þarf ég það í vafranum, ég þarf það á servernum frá vélinni. Reiður fór ég á github til að sjá kjarkinn í verkefninu, sem leiddi til gaffals þess og, þar af leiðandi, togabeiðni. Sem ég myndi ekki skrifa um ef það væri ekki áhugavert 😉

Myndun stillinga fyrir nginx, saga um eina dráttarbeiðni

Auðvitað, áður en ég kafaði ofan í heimildirnar, skoðaði ég hvar Chrome dregur út myndaða zip skjalasafnið með stillingum, og þar beið mín heimilisfang sem byrjar á „blob:“, úps. Það hefur þegar orðið ljóst að þjónustan skapar ekki neitt á leiðinni, í raun er þetta allt gert af js. Reyndar er zip skjalasafnið búið til af biðlaranum, vafranum og javascriptinu sjálfu. Þeir. fegurðin er sú að verkefnið nginxconfig.io er einfaldlega hægt að vista sem html síðu, hlaða upp á suma narod.ru og það mun virka) Þetta er mjög fyndin og áhugaverð lausn, hún er hins vegar hræðilega óþægileg til að setja upp netþjóna, reyndar nákvæmlega fyrir það sem þetta verkefni var búið til. Sæktu myndasafnið með vafra og fluttu það síðan á netþjóninn með nc... árið 2019? Ég setti mér það verkefni að finna leið til að hlaða niður stillingum sem myndast beint á netþjóninn.
Eftir að hafa klúðrað verkefninu fór ég að hugsa um hvaða möguleikar mínir væru. Verkefnið var flókið af því að ég vildi ekki víkja frá því skilyrði að verkefnið skyldi áfram vera hreint framhlið, án bakhliðar. Auðvitað væri einfaldasta lausnin að draga upp nodejs og neyða það til að búa til skjalasafn með stillingum með beinum tenglum.
Reyndar voru ekki margir möguleikar. Nánar tiltekið kom aðeins einn upp í hugann. Við þurfum að setja upp stillingarnar og fá tengil sem við getum afritað á miðlaraborðið til að fá zip skjalasafn.
Nokkrar textaskrár í zip-skjalasafninu sem varð til vógu töluvert, bókstaflega nokkur kílóbæti. Augljósa lausnin var að fá base64 strenginn úr myndaða zip skjalasafninu og henda honum í biðminni, á meðan á þjóninum stendur með skipuninni í stjórnborðinu

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

við gætum búið til þessa sömu zip skrá.

nginxconfig.io var skrifað í AngularJS, ég get ekki einu sinni ímyndað mér hvaða kílómetra af kóða hefði þurft ef höfundurinn hefði ekki valið hvarfgjarnan js ramma. En ég get alveg ímyndað mér hversu miklu einfaldara og fallegra allt þetta væri hægt að útfæra í VueJS, þó að þetta sé allt annað efni.
Í verkefnaauðlindunum sjáum við aðferð til að búa til zip skjalasafn:

$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',
	});
};

allt er frekar einfalt, með því að nota bókasafnið jszip ZIP er búið til þar sem stillingarskrárnar eru settar. Eftir að zip skjalasafnið hefur verið búið til færir js það í vafrann með því að nota bókasafnið FileSaver.js:

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

þar sem innihald er blobhlutur zip-skjalasafnsins sem myndast.

Allt í lagi, allt sem ég þurfti að gera var að bæta við öðrum hnappi við hliðina á honum og þegar ég smellti á hann myndi ég ekki vista zip-skjalasafnið sem myndast í vafranum, heldur fá base64 kóðann úr honum. Eftir að hafa fílað aðeins, fékk ég 2 aðferðir, í stað þess að vera aðeins einn downloadZip:

$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',
	});
};

Eins og þú hefur ef til vill tekið eftir, flutti ég kynslóð zip-skjalasafnsins sjálfs yfir í private generateZip aðferðina, og svo framvegis. Þetta er AngularJS og höfundurinn sjálfur heldur sig við endurhringingar og útfærði það ekki með loforðum. downloadZip gerði samt saveAs sem úttak, en downloadBase64 gerði eitthvað aðeins öðruvísi. Við búum til FileReader hlut sem kom til okkar í html5 og er nú þegar alveg aðgengileg til notkunar. Sem getur í einu sinni búið til base64 streng úr blobsi, eða réttara sagt, það gerir DataURL streng, en þetta er ekki svo mikilvægt fyrir okkur, því DataURL inniheldur nákvæmlega það sem við þurfum. Bingó, smá hængur beið mín þegar ég reyndi að setja þetta allt í biðminni. Höfundur notaði bókasafnið í verkefninu klemmuspjaldjs, sem gerir þér kleift að vinna með klemmuspjaldið án flasshluta, byggt á völdum texta. Upphaflega ákvað ég að setja base64 minn í þátt með display:none;, en í þessu tilfelli gat ég ekki sett hann á klemmuspjaldið vegna þess að enginn aðskilnaður á sér stað. Þess vegna, í stað display:none; ég gerði

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

sem gerði mér kleift að fela þáttinn og skilja hann eftir á síðunni. Voila, verkefninu var lokið, þegar ég smellti á hnappinn minn var lína eins og þessi sett í biðminni:

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

sem ég setti einfaldlega inn í console á servernum og fékk strax zip archive með öllum stillingum.
Og auðvitað sendi ég höfundarbeiðni vegna þess að... verkefnið er virkt og líflegt, ég myndi vilja sjá uppfærslur frá höfundi og vera með minn eigin hnapp) Fyrir áhugasama, hér er það gafflinn minn verkefnið og hann sjálfur draga beiðni, þar sem þú getur séð hvað ég leiðrétti/bætti við.
Góða þróun allir)

Myndun stillinga fyrir nginx, saga um eina dráttarbeiðni

Heimild: www.habr.com

Bæta við athugasemd