The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Проксирование запросов к S3 с помощью nginx и angie
С помощью nginx/angie и встроенного модуля perl можно проксировать запросы
напрямую к S3. Ниже приведён пример для реализации S3 от DigitalOcean (Spaces).
Для Amazon AWS S3 пример тоже подходит. Для авторизации доступа можно
использовать пример совместно с модулем secure_link.


   http {
	...
	perl_set $date
	'sub {
		use POSIX qw(strftime);
		return strftime("%Y%m%d", gmtime());
	}';

	perl_set $datetime
	'sub {
		use POSIX qw(strftime);
		return strftime("%Y%m%dT%H%M%SZ", gmtime());
	}';

	### yum install perl-Digest-SHA
	perl_set $signed_digest
	'sub {
		use Digest::SHA qw(hmac_sha256 hmac_sha256_hex sha256_hex);

		my $r = shift;

		my $data_key = hmac_sha256($r->variable(date), "AWS4" . $r->variable(aws_access_secret));
		my $region_key = hmac_sha256($r->variable(aws_region), $data_key);
		my $service_key = hmac_sha256($r->variable(aws_service), $region_key);
		my $signing_key = hmac_sha256("aws4_request", $service_key);

		my $hash = sha256_hex($r->variable(canonical_request));
		my $str =
			"AWS4-HMAC-SHA256" . "\n" .
			$r->variable(datetime) . "\n" .
			$r->variable(date) . "/" .
			$r->variable(aws_region) . "/" .
			$r->variable(aws_service) .
			"/aws4_request" . "\n" .
			$hash;

		return hmac_sha256_hex($str, $signing_key);
	}';
	...
	server {
		...
		location @s3 {
			set $provider 'digitaloceanspaces.com';
			set $bucket 'my-bycket-name';
			set $aws_access_key 'my-key';
			set $aws_access_secret 'my-secret';
			set $aws_region 'ams3';
			set $aws_service 's3';

			### perl -e 'use Digest::SHA qw(sha256_hex); my $s = sha256_hex(""); print $s, "\n"'
			set $empty_hash 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';

   set $canonical_request 'GET\n$uri\n\nhost:$bucket.$aws_region.$provider\nx-amz-content-sha256:$empty_hash\nx-amz-date:$datetime\n\nhost;x-amz-content-sha256;x-amz-date\n$empty_hash';

			proxy_buffering off;
			proxy_buffer_size 1m;
			proxy_buffers 64 64k;

			proxy_connect_timeout 11s;
			proxy_send_timeout 14s;
			proxy_read_timeout 17s;

   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503
http_504 http_403 http_404;
			proxy_next_upstream_timeout 30s;
			proxy_next_upstream_tries 3;

			proxy_hide_header Strict-Transport-Security;
			proxy_hide_header x-amz-request-id;
			proxy_hide_header x-amz-meta-s3cmd-attrs;

			proxy_http_version 1.1;

			proxy_set_header Host '$bucket.$aws_region.$provider';
			proxy_set_header x-amz-date '$datetime';
   proxy_set_header Authorization 'AWS4-HMAC-SHA256 Credential=$aws_access_key/$date/$aws_region/$aws_service/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=$signed_digest';
			proxy_set_header x-amz-content-sha256 '$empty_hash';
			proxy_set_header Range '$http_range';

			proxy_pass_request_headers off;
			proxy_pass_request_body off;

			proxy_pass https://$bucket.$aws_region.$provider;
		}
		...
	}
	...
   }
 
08.12.2023 , Автор: umask
Ключи: s3, amazon, nginx, angie, proxy / Лицензия: CC-BY
Раздел:    Корень / Администратору / Сетевые сервисы / WWW, Apache httpd / Редирект, mod_rewrite

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Аноним (1), 14:38, 09/12/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >встроенного модуля perl

    А чому не jit-компилируемого JavaScript?

    >angie

    Раз вы западозамещаете, то зачем вам Amazon S3?

     
     
  • 2.10, Я (??), 19:09, 11/12/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Оуу… У вас хорошее предложение!

    Может быть выложите свою реализацию, чтобы без докера и прямо сходу в установленном Nginx заработало?

     

  • 1.2, Гаврила (?), 19:28, 09/12/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    https://artifacthub.io/packages/helm/oxyno-zeta/s3-proxy
     
  • 1.5, Аноним (5), 00:07, 10/12/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вроде амазон всегда позволял бакет просто так в интернет выставить без всяких токенов. Можно привязать поддомен и давать напрямую, ну или проксировать без велосипедов.
     
     
  • 2.11, Я (??), 20:33, 11/12/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Внезапно есть object storage, совместимый с S3, у yandex cloud.
     
     
  • 3.12, Аноним (12), 12:11, 13/12/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Да как бы есть селф хостед S3 - minio. Коммерческие хранилки почти все апи S3 поддерживают. Тут речь не об этом, а о том, что конкретно амазон позволял даже сайты с себя хостить. Не просто раздавать без авторизации, но и отдавать index какой скажешь при обращении на /. И заголовки настраивать. Чуть ли не в 2005 году все это уже было.
    А тут какие-то феерические костыли. Неужели убрали возможность?
     
     
  • 4.13, Я (??), 02:19, 14/12/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Насколько понимаю, пример работает для private bucket, когда нельзя выставить s3 напрямую для всеобщего обозрения. А упоминание secure link подразумевает организацию авторизованного доступа на стороне nginx и какой-то части кода сайта, которая подписанные ссылки выдаёт.

    В принципе, пример пригодился бы мне какое-то время назад, когда переезжали с собственного файлохранилища на S3, чтобы прозрачно сохранить старые ссылки рабочими, но данные по факту уже раздавать с s3 (прокиснут через nginx), а не из локальной ФС.

     
     
  • 5.14, Я (??), 02:21, 14/12/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > (прокиснут через nginx)

    проксируя через nginx

     
  • 5.17, Аноним (12), 12:51, 19/12/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Бывает такая история, когда с бэка кидают X-Sendfile на S3. Все эти подписи делаются на уровне приложения, а nginx их только передает дальше. Никаких подписей на уровне nginx не нужно.
     

  • 1.6, q (??), 01:41, 10/12/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    https://github.com/nginxinc/nginx-s3-gateway
     
     
  • 2.9, Аноним (9), 17:33, 11/12/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Боже, и тут докер.
     
     
  • 3.15, Аноним (15), 15:03, 15/12/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Так ведь позволяет приколотить намертво бинари и не обновлять.

    И никакие авто-обновляторы ничего тебе не ломают, плохих изменений не приносят.

    Очень удобно... Чё.

     

  • 1.18, Товарищ (?), 10:50, 04/02/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ребята, пожалуйста, объясните, что происходит в листинге.

    Базовый конфиг nginx я написать могу, здесь же ничего не понятно.

    Зачем прыжки с http2 на http1?
    Зачем perl-Digest-SHA?
    Что вообще в целом делает конфиг?
    Зачем манипуляции с заголовками?

     
     
  • 2.19, Всем Анонимам Аноним (?), 13:33, 27/02/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Это так аутентификация работает в S3. Собираются определенные заголовки и запрос и подписываются.
     
  • 2.20, Аноним (20), 21:17, 28/02/2024 [^] [^^] [^^^] [ответить]  
  • +/
    nginx в прокси умеет только в 1.1 и менять это разрабы не планируют. это база
     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру