Skip to content
Tutoriais
Streamlit
How to Run Streamlit Applications on Port 80

Como Executar Aplicações Streamlit na Porta 80

Streamlit é uma ferramenta poderosa que permite que os desenvolvedores criem aplicações web interativas com o mínimo de esforço. No entanto, não é sem seus desafios, especialmente quando se trata de configuração. Um dos problemas mais comuns é executar aplicações na porta 80. Neste guia abrangente, mergulhamos no assunto, utilizando experiências de usuários, insights de especialistas e exemplos práticos para ajudá-lo a lidar com esse desafio com confiança.

Deseja criar gratuitamente um aplicativo de análise e visualização de dados usando o Streamlit?

O PyGWalker (opens in a new tab) é uma biblioteca em Python que ajuda a incorporar facilmente uma interface semelhante ao Tableau em seu próprio aplicativo Streamlit, sem esforço. Confira este incrível vídeo produzido por Sven do Coding is Fun (opens in a new tab) que demonstra os passos detalhados para potencializar seu aplicativo Streamlit com essa poderosa biblioteca de visualização de dados em Python!


Um agradecimento especial ao Sven e sua grande contribuição (opens in a new tab) para a comunidade do PyGWalker!

Além disso, você também pode conferir a página do PyGWalker no GitHub (opens in a new tab) para mais exemplos do PyGWalker.

Parte 1: O Desafio de Configurar o Streamlit para Executar na Porta 80

Em maio de 2022, um usuário da comunidade do Streamlit, chamado Nom_ji, encontrou um problema ao tentar executar uma aplicação na porta 80. Apesar de seguir as etapas de configuração adequadas, conforme detalhado na documentação oficial do Streamlit, Nom_ji encontrou um PermissionError: [Errno 13] ao implantar o aplicativo na porta 80.

Curiosamente, o aplicativo rodou perfeitamente nas portas 8051 e 8080. Isso nos leva ao primeiro ponto-chave:

  • Nem todas as portas são iguais. Portas abaixo de 1024, incluindo a porta 80, são consideradas privilegiadas em sistemas operacionais do tipo Unix e geralmente exigem acesso de superusuário (ou root).

Em resposta ao problema de Nom_ji, Randyzwitch, ex-chefe de relações com desenvolvedores do Streamlit, sugeriu verificar se a porta 80 não estava ocupada por outra instância. Verificar a existência de instâncias em uma porta pode ser feito usando o comando netstat no terminal:

sudo netstat -tuln | grep :80

Este comando lista quaisquer serviços atualmente em execução na porta 80. Se o comando retornar alguma saída, significa que a porta 80 já está em uso e você precisará parar o outro serviço antes de poder executar sua aplicação Streamlit nesta porta.

Parte 2: Aprofundando na Atribuição de Porta no Streamlit

Outro problema que os usuários do Streamlit podem encontrar é executar várias aplicações Streamlit simultaneamente, cada uma exigindo sua própria porta única. O moderador da comunidade Streamlit, BeyondMyself, forneceu uma solução direta para isso: especifique o parâmetro --server.port ao iniciar o aplicativo.

Por exemplo, o comando streamlit run myapp.py --server.port 8080 vai executar o aplicativo Streamlit definido em myapp.py na porta 8080. Você pode usar qualquer número de porta disponível no lugar de 8080, desde que não esteja em uso.

Portanto, ao planejar executar vários aplicativos Streamlit, certifique-se de:

  • Atribuir números de porta exclusivos para cada aplicativo.
  • Certificar-se de que a porta escolhida não está sendo usada por outro serviço.

Parte 3: Fazendo com que os Apps Streamlit Pareçam Rodar em Portas Padrão

Embora você possa escolher executar seus aplicativos Streamlit em qualquer porta disponível, pode haver cenários em que você gostaria que o aplicativo parecesse ser executado em uma porta padrão (como a 80) ao ser acessado por meio de um domínio. É aqui que o conceito de proxy reverso entra em jogo.

Um proxy reverso pode redirecionar solicitações de um servidor web, como Apache ou Nginx, para a porta onde seu aplicativo Streamlit está sendo executado. Isso pode ser configurado de várias maneiras:

  • Encaminhar todas as solicitações do seu domínio para o aplicativo Streamlit.
  • Configurar o servidor web para encaminhar solicitações para subdiretórios específicos para diferentes aplicativos Streamlit.

Por exemplo, se você tiver vários aplicativos Streamlit executando em portas diferentes, você pode ter meudominio.com/app1 redirecionado para o aplicativo Streamlit em execução na porta 8000 e meudominio.com/app2 redirecionado para o aplicativo na porta 8080. Essa configuração faz com que pareça que os aplicativos estão sendo executados na porta 80 do ponto de vista do usuário.

Parte 4: Configurando um Número de Porta Fixo para Aplicações Streamlit

Por fim, você pode querer fixar o número de porta para seus aplicativos Streamlit, permitindo que você compartilhe um link estável com membros da sua equipe ou usuários. É aí que entra o arquivo ./streamlit/config.toml.

No arquivo config.toml, você pode especificar o número de porta fixo. Por exemplo:

[server]
port = 8501

Essa configuração instrui o Streamlit a sempre usar a porta 8501 ao executar seu aplicativo. Observe que essa porta não deve estar em uso por outro serviço, caso contrário, o aplicativo não será executado.

Para resumir:

  • Certifique-se de ter acesso de superusuário para portas privilegiadas.
  • Verifique se existem instâncias em uma porta usando o netstat.
  • Use o parâmetro --server.port para executar vários aplicativos.
  • Use proxies reversos para fazer com que os aplicativos pareçam ser executados na porta 80.
  • Use o arquivo config.toml para fixar o número de porta.

Parte 5: Lidando com Erros Comuns

Apesar de seguir as etapas descritas acima, você ainda pode encontrar erros, como o erro “porta está reservada”. Esse erro geralmente aparece quando outro processo não foi encerrado corretamente ou algo mais está sendo executado na porta que você está tentando usar.

Para verificar se uma porta está ocupada, você pode utilizar o comando netstat. Abaixo está um exemplo de código simples que permite verificar se uma porta específica (neste caso, a porta 80) está em uso:

netstat -tuln | grep :80

Na saída, se você ver o número da porta desejada listado, significa que a porta está ocupada. Em sistemas Linux, você também pode usar o comando lsof para descobrir qual processo está usando uma determinada porta:

sudo lsof -i :80

Uma vez que você identificar o processo, você pode encerrá-lo usando o comando kill.

kill -9 PID

Substitua PID pelo ID do processo que você obteve no comando anterior.

Se você tem certeza de que nada está usando a porta e ainda está enfrentando o erro, pode ser devido a um problema nas configurações de rede do seu sistema operacional. Nesse caso, considere pedir ajuda a um profissional de TI ou à comunidade do Streamlit.

Parte 6: Mantendo as Aplicações Streamlit Atualizadas

Outro desafio que você pode enfrentar é garantir que o seu aplicativo Streamlit sempre exiba dados atualizados. Isso é especialmente importante se o seu aplicativo estiver exibindo dados ao vivo ou atualizados com frequência. A solução para esse desafio está no cache do Streamlit.

O mecanismo de cache do Streamlit permite que o seu aplicativo armazene dados na memória, para que eles não precisem ser carregados do disco ou buscados de um servidor remoto toda vez que o aplicativo é executado.

Ao usar o decorador @st.cache em suas funções de carregamento de dados, você pode melhorar significativamente a velocidade e a responsividade do seu aplicativo. Por exemplo, se você tem uma função que busca dados de um servidor remoto, adicione o decorador @st.cache acima da função desta forma:

@st.cache
def obter_dados():
    # buscar dados do servidor remoto
    return dados

Com isso, o Streamlit irá armazenar os dados retornados em seu cache. Quando a função for chamada novamente, o Streamlit verificará primeiro se os dados estão em seu cache. Se estiverem, o Streamlit utilizará os dados em cache em vez de chamar a função novamente.

Além disso, o Streamlit permite o uso do parâmetro ttl para especificar por quanto tempo os dados devem ser armazenados em cache. Se você definir o ttl para um determinado número de segundos, o Streamlit atualizará automaticamente os dados em cache após essa duração.

Aqui está um exemplo de como utilizar o parâmetro ttl em sua função:

@st.cache(ttl=60*60*2)
def obter_dados():
    # buscar dados do servidor remoto
    return dados

Neste exemplo, o ttl está definido para duas horas (60 segundos * 60 minutos * 2), o que significa que o Streamlit atualizará automaticamente os dados a cada duas horas.

Conclusão

Executar aplicativos Streamlit na porta 80 não é tão simples como pode parecer, devido à natureza privilegiada da porta e a outros problemas potenciais como portas ocupadas ou permissões. Mas com as informações que discutimos neste guia, você estará bem preparado para lidar com esses desafios.

Lembre-se, quando encontrar dificuldades, não hesite em buscar a comunidade Streamlit. Ela é composta por pessoas experientes que provavelmente já enfrentaram problemas semelhantes e estão mais do que dispostas a ajudar.

Perguntas Frequentes

1. Por que não consigo executar meu aplicativo Streamlit na porta 80?

As portas abaixo de 1024, inclusive a porta 80, são consideradas privilegiadas em sistemas operacionais semelhantes ao Unix e normalmente exigem acesso de superusuário (ou root). Certifique-se de ter as permissões necessárias e de que a porta não está em uso.

2. Como posso executar vários aplicativos Streamlit simultaneamente?

Você pode executar vários aplicativos Streamlit especificando números de porta diferentes para cada aplicativo usando o parâmetro --server.port ao iniciar o aplicativo.

3. Como posso manter os dados do meu aplicativo Streamlit atualizados?

Você pode usar o decorador @st.cache em suas funções de carregamento de dados para armazenar os dados na memória, melhorando a velocidade e a responsividade do seu aplicativo. O Streamlit também fornece o parâmetro ttl para especificar por quanto tempo os dados devem ser armazenados em cache.