Nginx üçün konfiqurasiyaların yaradılması, bir çəkmə sorğusunun tarixçəsi

Salam, yoldaşlar. Döyüş serverlərimdə gözəl nginx 2006-cı ildən fəaliyyət göstərir və onun idarə olunduğu illər ərzində mən çoxlu konfiqurasiya və şablon topladım. Mən nginx-i çox təriflədim və birtəhər məlum oldu ki, mən hətta hubda bir nginx mərkəzi də işə saldım, m/
Dostlar məndən onlar üçün inkişaf ferması qurmağımı istədilər və onlara xüsusi şablonlarımı sürükləmək əvəzinə maraqlı bir layihə yadıma düşdü. nginxconfig.io, konfiqurasiyaları rəflərə səpələyən və hər şeyi şifrələməyə hazırlayan və s. Fikirləşdim ki, niyə olmasın? Bununla belə, nginxconfig-in zip arxivini wget/fetch/curl istifadə edərək birbaşa serverə yükləməyə icazə vermədən brauzerə yükləməyi təklif etməsi məni qəzəbləndirdi. Nə cəfəngiyatdır, brauzerdə niyə lazımdır, konsoldan serverdə lazımdır. Qəzəbləndim, layihənin bağırsaqlarını görmək üçün github-a getdim, bu da onun çəngəlinə və nəticədə bir çəkmə tələbinə səbəb oldu. Hansı ki, maraqlı olmasaydı, yazmazdım 😉

Nginx üçün konfiqurasiyaların yaradılması, bir çəkmə sorğusunun tarixçəsi

Əlbətdə ki, mənbələri araşdırmadan əvvəl Chrome-un yaradılan zip arxivini konfiqurasiyalarla hara çəkdiyinə baxdım və orada “blob:” ilə başlayan bir ünvan məni gözləyirdi, oops. Artıq aydın oldu ki, xidmət yol boyu heç bir şey yaratmır, əslində hamısı js tərəfindən edilir. Həqiqətən, zip arxivi müştəri, brauzer və javascript özü tərəfindən yaradılır. Bunlar. gözəllik layihənin olmasıdır nginxconfig.io sadəcə olaraq html səhifəsi kimi saxlanıla bilər, bəzilərinə yüklənə bilər narod.ru və işləyəcək) Bu, çox gülməli və maraqlı bir həlldir, lakin serverlərin qurulması üçün olduqca əlverişsizdir, əslində bu layihənin yaradıldığı üçün. Yaradılan arxivi brauzer vasitəsilə yükləyin və sonra 2019-cu ildə nc... istifadə edərək serverə köçürün? Mən özümə ortaya çıxan konfiqurasiyanı birbaşa serverə yükləmək üçün bir yol tapmaq vəzifəsini qoydum.
Layihəni çəngəldən keçirdikdən sonra mənim seçimlərimin nə olduğu barədə düşünməyə başladım. Tapşırıq ona görə çətinləşdi ki, mən layihənin heç bir arxa tərəfi olmayan, sırf front-end olaraq qalması şərtindən yayınmaq istəmədim. Əlbəttə ki, ən sadə həll nodej-ləri çıxarmaq və onu birbaşa bağlantılardan istifadə edərək konfiqurasiya ilə arxiv yaratmağa məcbur etmək olardı.
Əslində çox seçim yox idi. Daha doğrusu, ağlıma yalnız biri gəldi. Konfiqurasiyaları qurmalı və zip arxivini əldə etmək üçün server konsoluna kopyalaya biləcəyimiz bir keçid əldə etməliyik.
Nəticədə zip arxivindəki bir neçə mətn faylı kifayət qədər bir qədər, sözün əsl mənasında bir neçə kilobayt ağırlığında idi. Açıq həll, konsolda əmrlə serverdə olarkən yaradılan zip arxivindən base64 sətirini almaq və buferə atmaq idi.

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

biz bu eyni zip faylı yarada bilərik.

nginxconfig.io AngularJS-də yazılmışdır, müəllif reaktiv js çərçivəsini seçməsəydi, neçə kilometr kodun tələb olunacağını təsəvvür belə edə bilmirəm. Ancaq bütün bunların VueJS-də nə qədər sadə və daha gözəl həyata keçirilə biləcəyini mükəmməl təsəvvür edə bilərəm, baxmayaraq ki, bu tamamilə fərqli bir mövzudur.
Layihə resurslarında zip arxivi yaratmaq üçün bir üsul görürük:

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

kitabxanadan istifadə etməklə hər şey olduqca sadədir jszip Konfiqurasiya fayllarının yerləşdirildiyi yerdə bir zip yaradılır. Zip arxivini yaratdıqdan sonra js kitabxanadan istifadə edərək onu brauzerə ötürür FileSaver.js:

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

burada məzmun zip arxivinin nəticədə blob obyektidir.

Tamam, mənə başqa bir düymə əlavə etməli idim və üzərinə kliklədikdə nəticədə yaranan zip arxivini brauzerdə saxlamazdım, ondan base64 kodunu alırdım. Bir az dolaşdıqdan sonra bir downloadZip əvəzinə 2 üsul əldə etdim:

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

Diqqət etdiyiniz kimi, mən zip arxivinin özünün nəslini şəxsi generatorZip metoduna köçürdüm və s. Bu AngularJS-dir və müəllif özü geri çağırışlara sadiq qalır və vədlər vasitəsilə həyata keçirmir. downloadBase64 bir qədər fərqli bir şey edərkən downloadZip hələ də bir çıxış olaraq saveAs etdi. Biz html5-də bizə gələn və artıq tam olan FileReader obyekti yaradırıq əlçatan istifadə üçün. Hansı ki, bir anda blobdan base64 sətri yarada bilər, daha doğrusu, DataURL sətrini düzəldə bilər, lakin bu bizim üçün o qədər də vacib deyil, çünki DataURL bizə lazım olanı ehtiva edir. Bingo, bütün bunları buferə yerləşdirmək istəyəndə məni bir az tıxac gözləyirdi. Layihədə müəllif kitabxanadan istifadə edib clipboardjs, seçilmiş mətn əsasında flaş obyektləri olmadan mübadilə buferi ilə işləməyə imkan verir. Əvvəlcə base64-ü displey:none; olan elementə yerləşdirmək qərarına gəldim, lakin bu halda onu mübadilə buferinə yerləşdirə bilmədim, çünki ayrılıq baş vermir. Buna görə də, display:none yerinə; etdim

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

bu mənə həm elementi görünüşdən gizlətməyə, həm də onu səhifədə buraxmağa imkan verdi. Voila, tapşırıq tamamlandı, düyməni tıkladığımda buferə belə bir xətt yerləşdirildi:

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

Mən sadəcə serverdəki konsola yapışdırdım və dərhal bütün konfiqurasiyaları olan bir zip arxivi aldım.
Və təbii ki, mən müəllifə çəkmə sorğusu göndərdim, çünki... layihə aktiv və canlıdır, müəllifdən yenilikləri görmək istərdim və öz düyməm olsun) Maraqlananlar üçün budur mənim çəngəlim layihə və özü xahişi çəkin, nəyi düzəltdiyimi/əlavə etdiyimi görə bilərsiniz.
Hər kəsə uğurlar)

Nginx üçün konfiqurasiyaların yaradılması, bir çəkmə sorğusunun tarixçəsi

Mənbə: www.habr.com

Добавить комментарий