it-swarm-pt.tech

Como faço para que o Flask seja executado na porta 80?

Eu tenho um servidor Flask em execução através da porta 5000 e está tudo bem. Eu posso acessá-lo em http://example.com:5000

Mas é possível simplesmente acessá-lo em http://example.com ? Eu estou supondo que isso significa que eu tenho que mudar a porta de 5000 para 80. Mas quando eu tento isso no Flask, recebo essa mensagem de erro quando eu executá-lo.

Traceback (most recent call last):
  File "xxxxxx.py", line 31, in <module>
app.run(Host="0.0.0.0", port=int("80"), debug=True)
   File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 772, in run
run_simple(Host, port, self, **options)
  File "/usr/local/lib/python2.6/dist-packages/werkzeug/serving.py", line 706, in run_simple
    test_socket.bind((hostname, port))
  File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

Executando lsof -i :80 retorna 

COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
Apache2   467     root    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2  4413 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2 14346 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2 14570 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2 14571 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
Apache2 14573 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)

Preciso matar esses processos primeiro? Isso é seguro? Ou existe outra maneira de manter o Flask rodando na porta 5000, mas o redirecionamento de domínio do site principal de alguma forma?

Obrigado.

137
quantumtremor

Então, está gerando essa mensagem de erro porque você tem Apache2 em execução na porta 80.

Se isso é para desenvolvimento, eu simplesmente deixaria como está na porta 5000.

Se é para produção:

Não recomendado

  • Pare primeiro o Apache2

Não recomendado conforme indicado na documentação:

Você pode usar o servidor interno durante o desenvolvimento, mas deve usar uma opção de implantação completa para aplicativos de produção. (Não use o servidor de desenvolvimento interno em produção.)

Recomendado

  • Proxy HTTP tráfego através de Apache2 para Flask.

Desta forma, Apache2 pode lidar com todos os seus arquivos estáticos (o que é muito bom - muito melhor do que o servidor de depuração embutido no Flask) e agir como um proxy reverso para o seu conteúdo dinâmico, passando esses pedidos para o Flask.

Aqui está um link para a documentação oficial sobre como configurar o Flask com o Apache + mod_wsgi.

Edit 1 - Esclarecimento para @Djack

Tráfego HTTP de proxy para o Flask por meio do Apache2

Quando uma solicitação chega ao servidor na porta 80 (HTTP) ou na porta 443 (HTTPS), um servidor da Web como Apache ou Nginx manipula a conexão da solicitação e descobre o que fazer com ela. Em nosso caso, uma solicitação recebida deve ser configurada para ser passada para o Flask no protocolo WSGI e manipulada pelo código Python. Esta é a parte "dinâmica". 

proxy reverso para conteúdo dinâmico

Existem algumas vantagens em configurar seu servidor da web como o acima; 

  • Terminação SSL - O servidor web será otimizado para lidar com solicitações HTTPS com apenas uma pequena configuração. Não "role o seu próprio" em Python, que é provavelmente muito inseguro em comparação.
  • Segurança - Abrir uma porta para a Internet requer uma análise cuidadosa da segurança. O servidor de desenvolvimento do Flask não foi projetado para isso e poderia ter problemas de segurança ou bugs abertos em comparação com um servidor da Web projetado para essa finalidade. Note que um servidor web mal configurado também pode ser inseguro! 
  • Tratamento de arquivo estático - É possível que o servidor da Web Flask incorporado manipule arquivos estáticos, embora isso não seja recomendado; O Nginx/Apache é muito mais eficiente no manuseio de arquivos estáticos como imagens, CSS, arquivos Javascript e somente passa por solicitações "dinâmicas" (aquelas em que o conteúdo é frequentemente lido de um banco de dados ou o conteúdo é alterado) pelo código Python. 
  • + mais Isso está chegando ao escopo dessa questão. Se você quiser mais informações, faça algumas pesquisas nessa área. 
53
Ewan

1- Pare outros aplicativos que estejam usando a porta 80. 2- execute o aplicativo com a porta 80:

if __== '__main__':
      app.run(Host='0.0.0.0', port=80)
307
Amir Mofakhar

Para servidores visíveis externamente, onde você não usa o Apache ou outro servidor da Web, basta digitar 

flask run --Host=0.0.0.0 --port=80
84
Harun-Ur-Rashid

Se você usar o seguinte para alterar a porta ou o host:

if __== '__main__':
  app.run(Host='0.0.0.0', port=80)

use o seguinte código para iniciar o servidor (minha entrada principal para o frasco é app.py):

python app.py

ao invés de usar:

flask run
7
muca

Seu problema é que você já tem um servidor Apache que já está usando a porta 80. Assim, você pode:

  1. Kill Apache: Você provavelmente deveria fazer isso via /etc/init.d/Apache2 stop, ao invés de simplesmente matá-los.

  2. Implante seu aplicativo de balão em seu processo Apache, como flask no Apache descreve.

6
sebastian

Se você quiser que seu aplicativo esteja na mesma porta, isto é, porta = 5000, apenas no seu terminal, execute este comando:

fuser -k 5000/tcp

e, em seguida, execute:

python app.py

Se você deseja executar em uma porta especificada, por exemplo Se você quer rodar em port = 80, no seu arquivo principal apenas mencione isto:

if __== '__main__':  
    app.run(Host='0.0.0.0', port=80)
5
Alok Singh

Você não precisa alterar o número da porta do seu aplicativo, basta configurar seu servidor www (nginx ou Apache) para consultas de proxy na porta do frasco. Preste attantion em uWSGI.

3
greg

set the port with app.run(port=80,debug=True) você deve setar debug para true quando estiver em dev

0
valentine

Eu tive que setar FLASK_RUN_PORT no meu ambiente para o número de porta especificado. A quando eu iniciei o aplicativo, peguei a porta que queria.

0
cathaldcronin1