The OpenNET Project / Index page

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



"Раздел полезных советов: Проксирование запросов к S3 с помощью nginx и angie "
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Проксирование запросов к S3 с помощью nginx и angie "  +/
Сообщение от auto_tips (??), 09-Дек-23, 14:38 
С помощью nginx/angie и встроенного модуля perl можно проксировать запросы напрямую к S3. Ниже приведён пример для реализации S3 от DigitalOcean (Spaces). Для Amazon AWS S3 пример тоже подходит. Для авторизации доступа можно использовать пример совместно с модулем [[http://nginx.org/ru/docs/http/ngx_http_secure_link_module.html 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;
        }
        ...
    }
    ...
   }

URL:
Обсуждается: http://www.opennet.me/tips/info/3237.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от Аноним (1), 09-Дек-23, 14:38   +1 +/
>встроенного модуля perl

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

>angie

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

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #10

2. Сообщение от Гаврила (?), 09-Дек-23, 19:28   +1 +/
https://artifacthub.io/packages/helm/oxyno-zeta/s3-proxy
Ответить | Правка | Наверх | Cообщить модератору

5. Сообщение от Аноним (5), 10-Дек-23, 00:07   +/
Вроде амазон всегда позволял бакет просто так в интернет выставить без всяких токенов. Можно привязать поддомен и давать напрямую, ну или проксировать без велосипедов.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #11

6. Сообщение от q (??), 10-Дек-23, 01:41   +1 +/
https://github.com/nginxinc/nginx-s3-gateway
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #9

9. Сообщение от Аноним (9), 11-Дек-23, 17:33   +/
Боже, и тут докер.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6 Ответы: #15

10. Сообщение от Я (??), 11-Дек-23, 19:09   +1 +/
Оуу… У вас хорошее предложение!

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1

11. Сообщение от Я (??), 11-Дек-23, 20:33   +/
Внезапно есть object storage, совместимый с S3, у yandex cloud.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5 Ответы: #12

12. Сообщение от Аноним (12), 13-Дек-23, 12:11   +1 +/
Да как бы есть селф хостед S3 - minio. Коммерческие хранилки почти все апи S3 поддерживают. Тут речь не об этом, а о том, что конкретно амазон позволял даже сайты с себя хостить. Не просто раздавать без авторизации, но и отдавать index какой скажешь при обращении на /. И заголовки настраивать. Чуть ли не в 2005 году все это уже было.
А тут какие-то феерические костыли. Неужели убрали возможность?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #11 Ответы: #13

13. Сообщение от Я (??), 14-Дек-23, 02:19   +/
Насколько понимаю, пример работает для private bucket, когда нельзя выставить s3 напрямую для всеобщего обозрения. А упоминание secure link подразумевает организацию авторизованного доступа на стороне nginx и какой-то части кода сайта, которая подписанные ссылки выдаёт.

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #12 Ответы: #14, #17

14. Сообщение от Я (??), 14-Дек-23, 02:21   +/
> (прокиснут через nginx)

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #13

15. Сообщение от Аноним (15), 15-Дек-23, 15:03   +/
Так ведь позволяет приколотить намертво бинари и не обновлять.

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #9

17. Сообщение от Аноним (12), 19-Дек-23, 12:51   +/
Бывает такая история, когда с бэка кидают X-Sendfile на S3. Все эти подписи делаются на уровне приложения, а nginx их только передает дальше. Никаких подписей на уровне nginx не нужно.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #13

18. Сообщение от Товарищ (?), 04-Фев-24, 10:50   +/
Ребята, пожалуйста, объясните, что происходит в листинге.

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

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

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #19, #20

19. Сообщение от Всем Анонимам Аноним (?), 27-Фев-24, 13:33   +/
Это так аутентификация работает в S3. Собираются определенные заголовки и запрос и подписываются.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #18

20. Сообщение от Аноним (20), 28-Фев-24, 21:17   +/
nginx в прокси умеет только в 1.1 и менять это разрабы не планируют. это база
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #18


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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