ื™ืฆื™ืจืช ื”ื’ื“ืจื•ืช ืขื‘ื•ืจ nginx, ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื‘ืงืฉืช ืžืฉื™ื›ื” ืื—ืช

ืฉืœื•ื, ื—ื‘ืจื™ื. ื™ืคื” ืขืœ ืฉืจืชื™ ื”ืงืจื‘ ืฉืœื™ nginx ืคื•ืขืœ ืžืื– 2006 ื•ื‘ืžื”ืœืš ืฉื ื•ืช ื”ื ื™ื”ื•ืœ ืฉืœื• ืฆื‘ืจืชื™ ื”ืจื‘ื” ื”ื’ื“ืจื•ืช ื•ืชื‘ื ื™ื•ืช. ืฉื™ื‘ื—ืชื™ ืžืื•ื“ ืืช nginx ื•ืื™ื›ืฉื”ื• ื™ืฆื ืฉืืคื™ืœื• ื”ืชื—ืœืชื™ nginx hub ื’ื ื‘ืจื›ื–ืช, ื”ืฉื•ื•ื™ืฅ ื‘-m/
ื—ื‘ืจื™ื ื‘ื™ืงืฉื• ืžืžื ื™ ืœื”ืงื™ื ืขื‘ื•ืจื ื—ื•ื•ืช ืคื™ืชื•ื—, ื•ื‘ืžืงื•ื ืœื’ืจื•ืจ ืœื”ื ืืช ื”ืชื‘ื ื™ื•ืช ื”ืกืคืฆื™ืคื™ื•ืช ืฉืœื™, ื ื–ื›ืจืชื™ ื‘ืคืจื•ื™ืงื˜ ืžืขื ื™ื™ืŸ nginxconfig.io, ืฉืžืคื–ืจ ืชืฆื•ืจื•ืช ืขืœ ื”ืžื“ืคื™ื ื•ืžื›ื™ืŸ ื”ื›ืœ ืœืืคืฉืจ ืœื”ืฆืคื™ืŸ ื•ื›ื•'. ื—ืฉื‘ืชื™, ืœืžื” ืœื? ืขื ื–ืืช, ื”ืชืจื’ื–ืชื™ ืžื”ืขื•ื‘ื“ื” ืฉ-nginxconfig ืžืฆื™ืข ืœื™ ืœื”ื•ืจื™ื“ ืืช ืืจื›ื™ื•ืŸ ื”-zip ืœื“ืคื“ืคืŸ, ืžื‘ืœื™ ืœืืคืฉืจ ืœื™ ืœื”ืขืœื•ืช ืื•ืชื• ื™ืฉื™ืจื•ืช ืœืฉืจืช ื‘ืืžืฆืขื•ืช wget/fetch/curl. ืื™ื–ื” ืฉื˜ื•ื™ื•ืช, ืœืžื” ืื ื™ ืฆืจื™ืš ืืช ื–ื” ื‘ื“ืคื“ืคืŸ, ืื ื™ ืฆืจื™ืš ืืช ื–ื” ื‘ืฉืจืช ืžื”ืงื•ื ืกื•ืœ. ื›ื•ืขืก, ื”ืœื›ืชื™ ืœ-github ืœืจืื•ืช ืืช ื”ืื•ืžืฅ ืฉืœ ื”ืคืจื•ื™ืงื˜, ืžื” ืฉื”ื•ื‘ื™ืœ ืœืžื–ืœื’ ืฉืœื•, ื•ื›ืชื•ืฆืื” ืžื›ืš, ื‘ืงืฉืช ืžืฉื™ื›ื”. ืžื” ืฉืœื ื”ื™ื™ืชื™ ื›ื•ืชื‘ ืขืœื™ื• ืื ื–ื” ืœื ื”ื™ื” ืžืขื ื™ื™ืŸ ๐Ÿ˜‰

ื™ืฆื™ืจืช ื”ื’ื“ืจื•ืช ืขื‘ื•ืจ nginx, ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื‘ืงืฉืช ืžืฉื™ื›ื” ืื—ืช

ื›ืžื•ื‘ืŸ, ืœืคื ื™ ืฉื—ืคืจืชื™ ื‘ืžืงื•ืจื•ืช, ื”ืกืชื›ืœืชื™ ื”ื™ื›ืŸ ื›ืจื•ื ืžื•ืฉืš ืืช ืืจื›ื™ื•ืŸ ื”-zip ืฉื ื•ืฆืจ ืขื ื”ื’ื“ืจื•ืช, ื•ืฉื ื—ื™ื›ืชื” ืœื™ ื›ืชื•ื‘ืช ืฉืžืชื—ื™ืœื” ื‘-"blob:", ืื•ืคืก. ื›ื‘ืจ ื”ืชื‘ืจืจ ืฉื”ืฉื™ืจื•ืช ืœื ืžื™ื™ืฆืจ ืฉื•ื ื“ื‘ืจ ื‘ื“ืจืš, ืœืžืขืฉื”, ื”ื›ืœ ื ืขืฉื” ืขืœ ื™ื“ื™ js. ื•ืื›ืŸ, ืืจื›ื™ื•ืŸ ื”-zip ื ื•ืฆืจ ืขืœ ื™ื“ื™ ื”ืœืงื•ื—, ื”ื“ืคื“ืคืŸ ื•ื”-Javascript ืขืฆืžื•. ื”ึธื”ึตืŸ. ื”ื™ื•ืคื™ ื”ื•ื ืฉื”ืคืจื•ื™ืงื˜ nginxconfig.io ื ื™ืชืŸ ืคืฉื•ื˜ ืœืฉืžื•ืจ ื›ื“ืฃ HTML, ืœื”ืขืœื•ืช ืœื—ืœืง narod.ru ื•ื–ื” ื™ืขื‘ื•ื“) ื–ื” ืคืชืจื•ืŸ ืžืื•ื“ ืžืฆื—ื™ืง ื•ืžืขื ื™ื™ืŸ, ืขื ื–ืืช, ื”ื•ื ื ื•ืจื ืœื ื ื•ื— ืœื”ื’ื“ื™ืจ ืฉืจืชื™ื, ืœืžืขืฉื”, ื‘ื“ื™ื•ืง ื‘ืฉื‘ื™ืœ ืžื” ืฉื”ืคืจื•ื™ืงื˜ ื”ื–ื” ื ื•ืฆืจ. ืœื”ื•ืจื™ื“ ืืช ื”ืืจื›ื™ื•ืŸ ืฉื ื•ืฆืจ ืขื ื“ืคื“ืคืŸ, ื•ืœืื—ืจ ืžื›ืŸ ืœื”ืขื‘ื™ืจ ืื•ืชื• ืœืฉืจืช ื‘ืืžืฆืขื•ืช nc... ื‘ืฉื ืช 2019? ื”ืฆื‘ืชื™ ืœืขืฆืžื™ ืืช ื”ืžืฉื™ืžื” ืœืžืฆื•ื ื“ืจืš ืœื”ื•ืจื™ื“ ืืช ื”ืชืฆื•ืจื” ืฉื ื•ืฆืจื” ื™ืฉื™ืจื•ืช ืœืฉืจืช.
ืœืื—ืจ ืฉื—ื™ืœืงืชื™ ืืช ื”ืคืจื•ื™ืงื˜, ื”ืชื—ืœืชื™ ืœื—ืฉื•ื‘ ืžื” ื”ืืคืฉืจื•ื™ื•ืช ืฉืœื™. ื”ืžืฉื™ืžื” ื”ืกืชื‘ื›ื” ื‘ืฉืœ ื”ืขื•ื‘ื“ื” ืฉืœื ืจืฆื™ืชื™ ืœื—ืจื•ื’ ืžื”ืชื ืื™ ืฉื”ืคืจื•ื™ืงื˜ ื™ื™ืฉืืจ ื—ื–ื™ืช ื˜ื”ื•ืจื”, ืœืœื ื›ืœ ืื—ื•ืจื™. ื›ืžื•ื‘ืŸ, ื”ืคืชืจื•ืŸ ื”ืคืฉื•ื˜ ื‘ื™ื•ืชืจ ื™ื”ื™ื” ืœืžืฉื•ืš ืืช ื”-nodejs ื•ืœื”ื›ืจื™ื— ืื•ืชื• ืœื™ืฆื•ืจ ืืจื›ื™ื•ืŸ ืขื ื”ื’ื“ืจื•ืช ื‘ืืžืฆืขื•ืช ืงื™ืฉื•ืจื™ื ื™ืฉื™ืจื™ื.
ืœืžืขืฉื”, ืœื ื”ื™ื• ื”ืจื‘ื” ืืคืฉืจื•ื™ื•ืช. ืœื™ืชืจ ื“ื™ื•ืง, ืจืง ืื—ื“ ืขืœื” ื‘ืจืืฉ. ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ื’ื“ื™ืจ ืืช ื”ื”ื’ื“ืจื•ืช ื•ืœืงื‘ืœ ืงื™ืฉื•ืจ ืฉื ื•ื›ืœ ืœื”ืขืชื™ืง ืœืงื•ื ืกื•ืœืช ื”ืฉืจืช ื›ื“ื™ ืœืงื‘ืœ ืืจื›ื™ื•ืŸ zip.
ื›ืžื” ืงื‘ืฆื™ ื˜ืงืกื˜ ื‘ืืจื›ื™ื•ืŸ ื”-zip ืฉื”ืชืงื‘ืœ ืฉืงืœื• ืœื ืžืขื˜, ืžืžืฉ ื›ืžื” ืงื™ืœื•ื‘ื™ื™ื˜ื™ื. ื”ืคืชืจื•ืŸ ื”ื‘ืจื•ืจ ื”ื™ื” ืœืงื‘ืœ ืืช ื”ืžื—ืจื•ื–ืช base64 ืžืืจื›ื™ื•ืŸ ื”-zip ืฉื ื•ืฆืจ ื•ืœื–ืจื•ืง ืื•ืชื” ืœืชื•ืš ื”ืžืื’ืจ, ืชื•ืš ื›ื“ื™ ื”ืฉืจืช ืขื ื”ืคืงื•ื“ื” ื‘ืžืกื•ืฃ

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

ื ื•ื›ืœ ืœื™ืฆื•ืจ ืืช ืื•ืชื• ืงื•ื‘ืฅ zip.

nginxconfig.io ื ื›ืชื‘ ื‘-AngularJS, ืื ื™ ืืคื™ืœื• ืœื ื™ื›ื•ืœ ืœื“ืžื™ื™ืŸ ืื™ื–ื” ืงื™ืœื•ืžื˜ืจื™ื ืฉืœ ืงื•ื“ ื”ื™ื• ื ื“ืจืฉื™ื ืื ื”ืžื—ื‘ืจ ืœื ื”ื™ื” ื‘ื•ื—ืจ ื‘ืžืกื’ืจืช js reactive. ืื‘ืœ ืื ื™ ื™ื›ื•ืœ ืœื“ืžื™ื™ืŸ ื‘ืฆื•ืจื” ืžื•ืฉืœืžืช ื›ืžื” ืคืฉื•ื˜ ื•ื™ืคื” ื™ื•ืชืจ ืืคืฉืจ ืœื™ื™ืฉื ืืช ื›ืœ ื–ื” ื‘-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.

ืื•ืงื™ื™, ื›ืœ ืžื” ืฉื”ื™ื™ืชื™ ืฆืจื™ืš ืœืขืฉื•ืช ื–ื” ืœื”ื•ืกื™ืฃ ื›ืคืชื•ืจ ื ื•ืกืฃ ืœื™ื“ื• ื•ื›ืืฉืจ ืœื—ืฆืชื™ ืขืœื™ื•, ืœื ื”ื™ื™ืชื™ ืฉื•ืžืจ ืืช ืืจื›ื™ื•ืŸ ื”-zip ืฉื”ืชืงื‘ืœ ื‘ื“ืคื“ืคืŸ, ืืœื ืืงื‘ืœ ืžืžื ื• ืืช ืงื•ื“ base64. ืื—ืจื™ ืฉื”ืชืขืกืงืชื™ ืงืฆืช, ืงื™ื‘ืœืชื™ 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 ืขืฉื” ืžืฉื”ื• ืžืขื˜ ืฉื•ื ื”. ืื ื—ื ื• ื™ื•ืฆืจื™ื ืื•ื‘ื™ื™ืงื˜ FileReader ืฉื”ื’ื™ืข ืืœื™ื ื• ื‘-html5 ื•ื”ื•ื ื›ื‘ืจ ื“ื™ ื–ืžื™ืŸ ืœืฉื™ืžื•ืฉ. ืืฉืจ, ื‘ื‘ืช ืื—ืช, ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืžื—ืจื•ื–ืช base64 ืž-blob, ืื• ืœื™ืชืจ ื“ื™ื•ืง, ื”ื™ื ืžื™ื™ืฆืจืช ืžื—ืจื•ื–ืช DataURL, ืื‘ืœ ื–ื” ืœื ื›ืœ ื›ืš ื—ืฉื•ื‘ ืขื‘ื•ืจื ื•, ื›ื™ DataURL ืžื›ื™ืœ ื‘ื“ื™ื•ืง ืืช ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื. ื‘ื™ื ื’ื•, ื—ื™ื›ื” ืœื™ ืชืงืœื” ืงื˜ื ื” ื›ืฉื ื™ืกื™ืชื™ ืœื”ื›ื ื™ืก ืืช ื›ืœ ื–ื” ืœืžืื’ืจ. ื”ืžื—ื‘ืจ ื”ืฉืชืžืฉ ื‘ืกืคืจื™ื™ื” ื‘ืคืจื•ื™ืงื˜ clipboardjs, ื”ืžืืคืฉืจ ืœืš ืœืขื‘ื•ื“ ืขื ื”ืœื•ื— ืœืœื ืื•ื‘ื™ื™ืงื˜ื™ ืคืœืืฉ, ื‘ื”ืชื‘ืกืก ืขืœ ื”ื˜ืงืกื˜ ืฉื ื‘ื—ืจ. ื‘ืชื—ื™ืœื”, ื”ื—ืœื˜ืชื™ ืœืฉื™ื ืืช ื”-base64 ืฉืœื™ ื‘ืืœืžื ื˜ ืขื display:none;, ืื‘ืœ ื‘ืžืงืจื” ื”ื–ื” ืœื ื™ื›ื•ืœืชื™ ืœืฉื™ื ืื•ืชื• ืขืœ ื”ืœื•ื— ื›ื™ ืœื ืžืชืจื—ืฉืช ื”ืคืจื“ื”. ืœื›ืŸ, ื‘ืžืงื•ื display:none; ืื ื™ ืขืฉื™ืชื™

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

ืžื” ืฉืืคืฉืจ ืœื™ ื’ื ืœื”ืกืชื™ืจ ืืช ื”ืืœืžื ื˜ ืžื”ืขื™ืŸ ื•ื’ื ืœื”ืฉืื™ืจ ืื•ืชื• ื‘ื“ืฃ. ื•ื•ืืœื”, ื”ืžืฉื™ืžื” ื”ื•ืฉืœืžื”, ื›ืืฉืจ ืœื—ืฆืชื™ ืขืœ ื”ื›ืคืชื•ืจ ืฉืœื™, ืฉื•ืจื” ื›ื–ื• ื”ื•ืฆื‘ื” ื‘ืžืื’ืจ:

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

ืฉืคืฉื•ื˜ ื”ื“ื‘ืงืชื™ ืœืงื•ื ืกื•ืœื” ื‘ืฉืจืช ื•ืžื™ื“ ืงื™ื‘ืœืชื™ ืืจื›ื™ื•ืŸ zip ืขื ื›ืœ ื”ื”ื’ื“ืจื•ืช.
ื•ื›ืžื•ื‘ืŸ, ืฉืœื—ืชื™ ื‘ืงืฉืช ืžืฉื™ื›ื” ืœืžื—ื‘ืจ, ื›ื™... ื”ืคืจื•ื™ืงื˜ ืคืขื™ืœ ื•ืชื•ืกืก, ืืฉืžื— ืœืจืื•ืช ืขื“ื›ื•ื ื™ื ืžื”ืžื—ื‘ืจ ื•ื™ืฉ ืœื™ ื›ืคืชื•ืจ ืžืฉืœื™) ืœืžืขื•ื ื™ื™ื ื™ื, ื”ื ื” ื”ื•ื ื”ืžื–ืœื’ ืฉืœื™ ื”ืคืจื•ื™ืงื˜ ื•ืื ื™ ื‘ืงืฉืช ืžืฉื™ื›ื”, ืฉื ืชื•ื›ืœ ืœืจืื•ืช ืžื” ืชื™ืงื ืชื™/ื”ื•ืกืคืชื™.
ื”ืชืคืชื—ื•ืช ื ืขื™ืžื” ืœื›ื•ืœื)

ื™ืฆื™ืจืช ื”ื’ื“ืจื•ืช ืขื‘ื•ืจ nginx, ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื‘ืงืฉืช ืžืฉื™ื›ื” ืื—ืช

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”