Como Executar Aplicações Streamlit na Porta 80
Published on
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.