Os endereços IP do OSS mudam dinamicamente, o que pode invalidar listas de permissões de firewall ou integrações que dependem de IP fixo. Para acessar o OSS com um IP estável, implante um proxy reverso Nginx em uma instância ECS com um IP público fixo (EIP).
Como funciona
Instâncias ECS com IPs públicos fixos funcionam como pontos de entrada de tráfego. O Nginx encaminha as solicitações para o OSS da seguinte forma:
Um cliente solicita um recurso do OSS usando o IP público fixo (EIP) da instância ECS.
O Nginx na instância ECS recebe a solicitação.
O Nginx encaminha a solicitação para o bucket do OSS de destino.
O OSS processa a solicitação e retorna a resposta ao Nginx.
O Nginx devolve a resposta ao cliente.
Configure o proxy reverso no ECS
Etapa 1: Crie uma instância ECS
Crie uma instância ECS para hospedar o proxy reverso Nginx.
Faça login no console do ECS e clique em Create Instance.
-
Crie uma instância ECS com as configurações abaixo. Mantenha os padrões para os demais parâmetros.
Payment Option: Selecione Pay-As-You-Go.
Region: Selecione a mesma região do bucket do OSS que você deseja usar como proxy. Isso permite utilizar o endpoint interno para reduzir custos de tráfego.
Network and zone: Escolha a VPC e a zona de disponibilidade padrão.
-
Instance Type: Clique em All Instance Types, pesquise e selecione
ecs.e-c1m2.large.NotaSe esse tipo de instância estiver esgotado, escolha outro tipo disponível.
Image: Selecione Public Image > Alibaba Cloud Linux (Alibaba Cloud Linux 3.2104 LTS 64-bit).
System disk: Defina a capacidade do disco ESSD Entry como 40 GiB.
Public IP: Marque a opção Assign Public IPv4 Address.
Bandwidth Billing: Escolha Pay-by-traffic para reduzir custos.
Peak Bandwidth: Selecione 5 Mbps ou superior.
Security group: Escolha Create Security Group e, em Open IPv4 Ports/Protocols, marque HTTP (TCP:80) para liberar a porta de escuta do Nginx.
Logon Credentials: Selecione Custom Password, defina o nome de usuário como root e crie uma Logon Password. Armazene a senha em local seguro.
Etapa 2: Configure o proxy reverso Nginx
Instale o Nginx na instância ECS e configure as regras de proxy reverso.
-
Instale o Nginx.
yum install -y nginx -
Para facilitar a gestão, crie um arquivo de configuração separado no diretório
/etc/nginx/conf.d/, comooss_proxy.conf.vi /etc/nginx/conf.d/oss_proxy.confCopie o modelo de configuração abaixo para o arquivo e substitua os valores de exemplo conforme indicado nos comentários.
NotaAo acessar arquivos pelo endpoint interno do bucket, o navegador força o download em vez de exibir o conteúdo inline. Para habilitar a visualização inline, defina o cabeçalho
Hostcom um nome de domínio personalizado mapeado para o bucket.# Define the OSS backend and enable connection reuse for better performance. upstream oss_backend { # [Required] Replace with your bucket's internal endpoint. server your-bucket.oss-cn-hangzhou-internal.aliyuncs.com:80; # Recommended number of keep-alive connections. Adjust based on the number of concurrent requests. keepalive 64; } # Define a production-level log format that includes key information such as upstream response time. log_format production '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' 'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"'; server { listen 80; # [Required] Replace with the public IP address of the ECS instance or a domain name that resolves to the IP address. server_name your_ecs_public_ip_or_domain; # Access log path and format. access_log /var/log/nginx/oss_proxy.access.log production; error_log /var/log/nginx/oss_proxy.error.log; # Use a dynamic DNS resolver to ensure that Nginx is aware of IP address changes in the OSS backend. resolver 100.100.2.136 100.100.2.138 valid=60s; # Health check endpoint for load balancers or monitoring systems. location /health { access_log off; return 200 "healthy"; } location / { # Proxy requests to the upstream OSS backend defined above. proxy_pass http://oss_backend; # Key setting: Ensure that HTTP/1.1 and keep-alive connections are active. proxy_http_version 1.1; proxy_set_header Connection ""; # Key setting: Set the Host header to the bucket's internal endpoint to ensure that Signature V4 validation is successful. # [Required] Replace with your bucket's internal endpoint. proxy_set_header Host "your-bucket.oss-cn-hangzhou-internal.aliyuncs.com"; # Forward the client's real IP address. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; # Set proxy timeout values. proxy_connect_timeout 10s; proxy_send_timeout 30s; proxy_read_timeout 30s; # The maximum size of file uploads. 0 indicates no limit. Set this value based on your business requirements. client_max_body_size 1024m; } }Salve e saia do editor.
-
Verifique a sintaxe do arquivo de configuração do Nginx.
nginx -tSe a saída incluir
syntax is oketest is successful, a configuração é válida. -
Inicie o serviço Nginx para aplicar a configuração.
systemctl start nginx
Valide o proxy reverso
Teste o proxy de acordo com as permissões de acesso do seu bucket.
Buckets com leitura pública e leitura/escrita pública
No navegador, acesse http://ecs_public_ip/object_path. Substitua ecs_public_ip pelo IP público da instância ECS (obtido no console do ECS) e object_path pelo caminho do objeto no bucket. Por exemplo, para o arquivo dest.jpg no diretório exampledir, o object_path será exampledir/dest.jpg.
O navegador acessará o arquivo dest.jpg e abrirá a caixa de diálogo Save do sistema, permitindo salvar o arquivo no computador.
Buckets privados
Obtenha uma URL assinada para o objeto no console. Para detalhes sobre assinatura, consulte Signature Version 4 (recommended).
Acesse a lista de Buckets e clique no bucket desejado.
Para o objeto que deseja acessar, clique em View Details na coluna Actions.
Clique em Copy Object URL. Na URL copiada, substitua https por http e troque o nome de domínio do bucket pelo endereço IP público da sua instância ECS.
Acesse a URL modificada no navegador.
O navegador abrirá uma caixa de diálogo Save As para o arquivo dest, confirmando que a URL assinada acessou o objeto privado com sucesso e iniciou o download.
Recomendações para produção
Adote as práticas a seguir para garantir estabilidade, segurança e eficiência de custos em ambiente de produção.
Melhores práticas
Arquitetura de alta disponibilidade: Utilize SLB com múltiplas instâncias ECS distribuídas entre zonas de disponibilidade para eliminar pontos únicos de falha.
-
Habilite HTTPS: Force o uso de HTTPS para proteger dados em trânsito. Configure um certificado SSL no Nginx e redirecione HTTP para HTTPS. Exemplo de configuração:
NotaLibere a porta 443 no grupo de segurança da sua instância ECS. Consulte Add, modify, or delete security group rules.
# ... The upstream and log_format configurations remain unchanged. ... # HTTP server block: Redirect all HTTP requests to HTTPS. server { listen 80; # [Required] Replace with the public IP address of the ECS instance or a domain name that resolves to the IP address. server_name your_ecs_public_ip_or_domain; # Redirect all HTTP requests to HTTPS by using a 301 redirect. return 301 https://$host$request_uri; } # HTTPS server block: Handle the actual proxy services. server { # Listen on port 443 for SSL connections. listen 443 ssl http2; # [Required] Replace with the public IP address of the ECS instance or a domain name that resolves to the IP address. server_name your_ecs_public_ip_or_domain; # --- SSL certificate configuration --- # [Required] Replace with the paths to your SSL certificate and private key files. ssl_certificate /path/to/your/fullchain.pem; ssl_certificate_key /path/to/your/private.key; # --- SSL security enhancement --- ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # Access log path and format. access_log /var/log/nginx/oss_proxy.access.log production; error_log /var/log/nginx/oss_proxy.error.log; # Dynamic DNS resolution (same as in the previous configuration). resolver 100.100.2.136 100.100.2.138 valid=60s; # Health check endpoint (same as in the previous configuration). location /health { access_log off; return 200 "healthy"; } location / { # ... All proxy_* settings are the same as in the previous configuration. ... proxy_pass http://oss_backend; proxy_http_version 1.1; proxy_set_header Connection ""; # [Required] Replace with your bucket's internal endpoint. proxy_set_header Host "your-bucket.oss-cn-hangzhou-internal.aliyuncs.com"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; # Add the X-Forwarded-Proto header to inform the backend that the client used HTTPS. proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 10s; proxy_send_timeout 30s; proxy_read_timeout 30s; client_max_body_size 1024m; } } -
Configure buffers de proxy: Para transferências de arquivos grandes, ative o buffer de proxy para otimizar o uso de memória e evitar que clientes lentos mantenham conexões abertas com o backend. Adicione o seguinte ao bloco location:
location / { # ... other proxy_* configurations ... # Enable proxy buffering and set the number and size of buffers. proxy_buffering on; proxy_buffers 8 128k; proxy_buffer_size 128k; proxy_busy_buffers_size 256k; } Utilize um EIP: Associe um EIP ao seu ponto de entrada de proxy (SLB ou ECS) para garantir um endereço IP público estável.
Use um nome de domínio para acesso: Mapeie um domínio para o IP do proxy e sirva o tráfego através dele. Isso simplifica a operação e facilita o dimensionamento futuro.
Estratégias de tolerância a falhas
Verificações de integridade: Configure seu balanceador de carga para monitorar o endpoint
/healthdo Nginx e isolar automaticamente instâncias com falha.Configuração de timeouts: Ajuste
proxy_connect_timeouteproxy_read_timeoutpara evitar acúmulo de conexões quando as respostas do OSS forem lentas.Mecanismo de nova tentativa: Implemente retentativas na camada de aplicação para erros 5xx, caso seu cliente ofereça suporte.
Prevenção de riscos
Reforço de segurança: No grupo de segurança e na ACL de rede, permita apenas IPs e portas necessários. Considere implantar o WAF à frente do proxy para defesa contra ataques web.
Monitoramento e alertas: Acompanhe os logs do Nginx e métricas essenciais (latência de requisição, taxa de erro, CPU, memória e utilização de rede). Defina limiares de alerta para essas métricas.
Gestão de mudanças e rollback: Teste alterações de configuração antes da implantação. Mantenha versões históricas para permitir rollbacks rápidos.
Perguntas frequentes
Visualização de arquivos no navegador
O OSS força o download de imagens e arquivos web acessados pelo nome de domínio padrão. Para visualizar arquivos diretamente no navegador, mapeie um nome de domínio personalizado para o bucket e utilize-o na configuração do Nginx. Consulte Access OSS by using a custom domain name.
Resolução de erro 403 Forbidden
Um erro 403 geralmente indica problemas na validação de assinatura ou permissões. Verifique os itens abaixo:
Revise a configuração do Nginx: Certifique-se de que o valor definido pela diretiva
proxy_set_header Hostcorresponde exatamente ao endpoint interno do bucket.Verifique a geração da assinatura: Ao gerar a URL assinada, confirme se o cabeçalho
Hostusado no cálculo da assinatura é igual ao cabeçalhoHostconfigurado no Nginx.Analise as permissões do bucket: Confirme se a política do bucket ou uma política RAM autoriza as operações necessárias.
Verifique a autorização da função ECS: Se sua aplicação acessa o OSS usando uma função RAM da instância ECS, garanta que a função possua as permissões exigidas para o bucket de destino.
Resolução de erro 413 Request Entity Too Large
O Nginx retorna esse erro quando o arquivo enviado excede o limite de tamanho. Aumente o valor de client_max_body_size no bloco server ou location (por exemplo, client_max_body_size 2048m; para até 2 GB) e recarregue o Nginx.
Resolução de erro 502 Bad Gateway
Um erro 502 significa que o Nginx não conseguiu obter uma resposta válida do OSS. Causas possíveis:
Problemas de resolução DNS: Garanta que a configuração do Nginx inclua a diretiva
resolver. Sem ela, o Nginx pode usar um endereço IP desatualizado armazenado em cache.Conectividade de rede: Verifique as regras de saída do grupo de segurança e da ACL de rede da instância ECS. Assegure-se de que o tráfego para a porta 80 do endpoint do OSS esteja permitido.
Configuração incorreta de endpoint: Valide se o endpoint do OSS em
proxy_passeproxy_set_header Hostestá correto.
Proxy para múltiplos buckets com um único Nginx
Utilize a diretiva map do Nginx para selecionar dinamicamente o bucket de backend com base no cabeçalho Host da requisição.
# /etc/nginx/conf.d/multi_oss_proxy.conf
# Dynamically map the Host header to an OSS internal endpoint.
map $http_host $oss_backend_host {
# [Required] Map a.example.com to the internal endpoint of bucket-a.
"a.example.com" "bucket-a.oss-cn-hangzhou-internal.aliyuncs.com";
# [Required] Map b.example.com to the internal endpoint of bucket-b.
"b.example.com" "bucket-b.oss-cn-shenzhen-internal.aliyuncs.com";
# A default value. This can be left empty or can point to a default bucket.
default "";
}
server {
listen 80;
# Listen on multiple domain names.
server_name a.example.com b.example.com;
# ... Other settings such as logging, resolver, etc. ...
location / {
# If the mapped result is empty, return 404.
if ($oss_backend_host = "") {
return 404;
}
# Dynamically set the proxy_pass and Host header.
proxy_pass http://$oss_backend_host;
proxy_set_header Host $oss_backend_host;
# ... other proxy_* configurations ...
}
}