Насли конфигуратсияҳо барои nginx, таърихи як дархости кашидан

Салом, рафикон. Зебо дар серверҳои ҷангии ман 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 ва он кор хоҳад кард) Ин як ҳалли хеле хандовар ва ҷолиб аст, аммо он барои насб кардани серверҳо бениҳоят нороҳат аст, дар асл, маҳз барои он ки ин лоиҳа офарида шудааст. Архиви тавлидшударо бо браузер зеркашӣ кунед ва сипас онро бо истифода аз nc... дар соли 2019 ба сервер интиқол диҳед? Ман дар назди худ вазифа гузоштам, ки роҳи дарёфти роҳи зеркашии конфигуратсияи натиҷагириро мустақиман ба сервер пайдо кунам.
Пас аз анҷом додани лоиҳа, ман фикр мекардам, ки имконоти ман чӣ гунаанд. Вазифа аз он сабаб мураккаб шуд, ки ман аз шарти он ки лоида бояд пештараи соф, бе акибмонда бошад, дур шудан намехостам. Албатта, ҳалли соддатарин ин кашидани nodejs ва маҷбур кардани он барои тавлиди бойгонӣ бо конфигуратсияҳо бо истифода аз истинодҳои мустақим хоҳад буд.
Дар асл, имконоти зиёде набуд. Аниқтараш, танҳо як нафар ба ёдам омад. Мо бояд конфигуратсияҳоро насб кунем ва пайвандеро гирем, ки мо метавонем онро ба консоли сервер нусхабардорӣ кунем, то бойгонии ZIP-ро ба даст орем.
Якчанд файлҳои матнӣ дар бойгонии zip-и натиҷавӣ каме вазн доштанд, аслан чанд килобайт. Ҳалли равшан ин буд, ки сатри base64 аз бойгонии zip-и тавлидшуда гирифта шавад ва онро ба буфер партояд, дар ҳоле ки дар сервер бо фармони консол

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');

ки дар он мундариҷа объекти blob-и натиҷавии бойгонии zip мебошад.

Хуб, танҳо ба ман лозим буд, ки тугмаи дигареро дар паҳлӯи он илова кунам ва вақте ки ман онро пахш кардам, ман бойгонии zip-ро дар браузер захира намекунам, балки рамзи base64-ро аз он мегирам. Пас аз каме овора шудан, ман 2 усул гирифтам, ба ҷои танҳо як 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',
	});
};

Тавре ки шумо пайхас кардаед, ман худи насли бойгонии zip-ро ба усули хусусии GeneratZip кӯчонидам ва ғайра. Ин AngularJS аст ва худи муаллиф ба зангҳои бозпас часпидааст ва онро тавассути ваъдаҳо иҷро накардааст. downloadZip то ҳол saveA-ро ҳамчун баромад анҷом дод, дар ҳоле ки downloadBase64 чизи каме дигар кард. Мо як объекти FileReader месозем, ки дар html5 ба мо омадааст ва аллакай хеле хуб аст дастрас барои истифода. Ки дар як вақт метавонад сатри base64-ро аз blob созад, ё дурусттараш, он сатри DataURL месозад, аммо ин барои мо он қадар муҳим нест, зеро DataURL маҳз он чизеро, ки ба мо лозим аст, дар бар мегирад. Bingo, вақте ки ман кӯшиш кардам, ки ҳамаи инҳоро дар буфер гузорам, маро каме банд интизор буд. Муаллиф дар лоиҳа аз китобхона истифода кардааст clipboardjs, ки ба шумо имкон медиҳад, ки бо буфер бе объектҳои флешдор дар асоси матни интихобшуда кор кунед. Дар аввал, ман қарор додам, ки base64-и худро дар як унсури дорои display:none; гузорам, аммо дар ин ҳолат ман онро дар буфер ҷойгир карда натавонистам, зеро ҷудошавӣ ба амал намеояд. Аз ин рӯ, ба ҷои Display:none; ман кардам

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

ки ба ман имкон дод, ки ҳам унсурро аз назар пинҳон кунам ва ҳам онро дар саҳифа гузорам. Voila, вазифа иҷро шуд, вақте ки ман тугмаи худро пахш кардам, дар буфер як сатри монанди ин ҷойгир карда шуд:

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

ки ман танҳо ба консол дар сервер часпондам ва фавран бойгонии zip-ро бо ҳама конфигуратсияҳо гирифтам.
Ва, албатта, ман ба муаллиф дархост фиристодам, зеро... лоиҳа фаъол ва зинда аст, ман мехоҳам навсозиҳои муаллифро бубинам ва тугмаи худро дошта бошам) Барои онҳое, ки таваҷҷӯҳ доранд, ин ҷост чанголи ман лоиҳа ва худам дархостро кашед, ки дар он шумо метавонед бинед, ки ман чӣ ислоҳ / илова кардам.
Рушди ҳама муборак)

Насли конфигуратсияҳо барои nginx, таърихи як дархости кашидан

Манбаъ: will.com

Илова Эзоҳ