Проксирование S3 через Nginx позволяет использовать ваш сервер в качестве посредника между клиентами и S3-хранилищем, предоставляя множество преимуществ. Вы можете скрыть прямой доступ к S3, обеспечить контроль кэширования для оптимизации трафика, настроить изменение заголовков для гибкой работы с запросами, а также ограничить доступ к контенту. Кроме того, прокси помогает объединить доступ к нескольким сервисам через единый домен, минимизировать затраты на трафик благодаря локальному кэшированию и вести детальное логирование запросов для анализа.
Для начала установим Nginx, если он ещё не установлен:
sudo apt update
sudo apt install nginx
После установки проверьте, что Nginx запущен, с помощью команды:
sudo systemctl status nginx
Если сервис не запущен, активируйте его:
sudo systemctl start nginx
sudo systemctl enable nginx
Для работы проксирования ваш бакет должен быть публичным или иметь настроенный доступ для IP-адреса вашего сервера.
Чтобы открыть доступ к бакету с IP сервера, задайте политику бакета с помощью AWS CLI. Для этого создайте файл bucket-policy.json
с содержимым:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::имя_бакета/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "IP_адрес_сервера"
}
}
}
]
}
Укажите параметры:
имя_бакета
— имя вашего бакета.IP_адрес_сервера
— внешний IP-адрес вашего сервера.Примените политику к бакету:
aws s3api put-bucket-policy --bucket имя_бакета --policy file://bucket-policy.json --endpoint-url https://s3.timeweb.cloud
Если нужно разрешить доступ нескольким IP-адресам, добавьте их в виде массива в поле IpAddress
, например:
"IpAddress": {
"aws:SourceIp": ["IP_адрес_1", "IP_адрес_2"]
}
Теперь ваш бакет будет доступен только для указанных IP-адресов.
Создайте конфигурационный файл для проксирования. Например, создадим файл s3_proxy.conf
в каталоге /etc/nginx/sites-available
:
sudo nano /etc/nginx/sites-available/s3_proxy.conf
Настройте конфигурацию следующим образом:
server {
listen 80;
server_name ваш_домен;
location / {
proxy_pass https://s3.timeweb.cloud/имя_бакета/;
proxy_set_header Host s3.timeweb.cloud;
proxy_ssl_server_name on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Authorization "";
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header Set-Cookie;
add_header Cache-Control "public, max-age=3600";
expires 1h;
}
}
Сохраните файл и создайте символическую ссылку на него в каталоге sites-enabled
:
sudo ln -s /etc/nginx/sites-available/s3_proxy.conf /etc/nginx/sites-enabled/
Проверьте конфигурацию на наличие ошибок:
sudo nginx -t
Если ошибок нет, перезапустите Nginx:
sudo systemctl restart nginx
Теперь файлы из бакета будут доступны по адресу http://ваш_домен/имя_файла
.
Для повышения безопасности настройте HTTPS с помощью Certbot. Установите Certbot и плагин для Nginx:
sudo apt install certbot python3-certbot-nginx
Сгенерируйте и установите сертификат:
sudo certbot --nginx -d ваш_домен
Certbot автоматически обновит конфигурацию Nginx для работы по HTTPS. После успешного выполнения команда certbot активирует сертификат, и прокси начнёт работать через защищённое соединение.