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

212

Eu tenho um servidor Flask executando a 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 ? Estou assumindo que isso significa que tenho que alterar a porta de 5000 para 80. Mas quando tento isso no Flask, recebo essa mensagem de erro ao 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

lsof -i :80Retornos em execução

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 em execução na porta 5000, mas redirecionar o domínio principal do site de alguma forma?

quantumtremor
fonte
você pode usá-lo balão com apache .
Syed Habib M
3
o título da pergunta não se encaixa na pergunta. talvez devesse ler 'como não executar outras coisas na porta 80'. Estou curioso para saber como alterar a porta frasco é executado em que é o que esta questão pede, mas nunca é mencionado como aqui
Elliot madeiras

Respostas:

76

Portanto, está apache2exibindo essa mensagem de erro porque você está executando na porta 80.

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

Se for para produção:

Não recomendado

  • Pare apache2primeiro;

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 na produção.)

Recomendado

  • HTTPTráfego de proxy apache2até o Flask.

Dessa forma, apache2pode lidar com todos os seus arquivos estáticos (nos quais é muito bom - muito melhor do que o servidor de depuração incorporado ao Flask) e atuar como um proxy reverso para o seu conteúdo dinâmico, passando essas solicitações para o Flask.

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

Edição 1 - Esclarecimento para @Djack

Tráfego HTTP de proxy para o Flask através do apache2

Quando uma solicitação chega ao servidor na porta 80 ( HTTP) ou 443 ( HTTPS), um servidor da Web como Apache ou Nginx lida com a conexão da solicitação e decide o que fazer com ela. No nosso caso, uma solicitação recebida deve ser configurada para ser transmitida ao 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 acima;

  • Terminação SSL - O servidor web será otimizado para lidar com solicitações HTTPS com apenas um pouco de configuração. Não "role o seu próprio" em Python, o 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 pode ter bugs abertos ou problemas de segurança em comparação com um servidor da Web projetado para essa finalidade. Observe que um servidor Web mal configurado também pode ser inseguro!
  • Manuseio de arquivos estáticos - É possível que o servidor da Web interno do Flask manipule arquivos estáticos, mas isso não é recomendado; O Nginx / Apache é muito mais eficiente no manuseio de arquivos estáticos, como imagens, CSS, arquivos Javascript, e só passará solicitações "dinâmicas" (aquelas em que o conteúdo é frequentemente lido em um banco de dados ou o conteúdo é alterado) para serem manipuladas pelo código Python.
  • + mais. Isso está próximo do escopo desta pergunta. Se você quiser obter mais informações, faça uma pesquisa nesta área.
Ewan
fonte
Essa é realmente uma ótima resposta! Você pode desmistificar em inglês simples o jargão altamente técnico que você usou " Proxy HTTP traffic to Flask through apache2" e " reverse proxy for dynamic content"?
John Strood
2
@Djack - resposta atualizada, no entanto, está próximo do escopo da pergunta. Por isso, faça uma pesquisa on-line para obter mais informações.
Ewan
1
Obrigado por fornecer as palavras-chave. Certamente vou fazer uma pesquisa online.
John Strood
419

1- Interrompa outros aplicativos que estão usando a porta 80. 2- execute o aplicativo com a porta 80:

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)
Amir Mofakhar
fonte
1
funciona bem, apenas em ambiente Windows, quando apache está ausente .. :).
José
1
Não está funcionando para mim. deve ser: flask run --host = 0.0.0.0
Harun-Ur-Rashid
1
@jOSe Tentei usar o PyCharm no Ubuntu, funciona muito bem.
Bugs Buggy
@jOSe O Apache não é necessário para o Linux funcionar, você pode desinstalá-lo ou alterar sua porta.
Nurettin
145

Para servidor visível externamente, onde você não usa apache ou outro servidor web, basta digitar

flask run --host=0.0.0.0 --port=80
Harun-Ur-Rashid
fonte
Este comando pode ser executado utilizando env vars? Eu continuo tentando CMD flask run --host=0.0.0.0 --port=$PORTdentro do meu Dockerfile (por razões Heroku) e eu continuo recebendo erros sobre a necessidade de um inteiro para o meu porto
Smokin Joe
Isso funcionou bem no meu local (laptop), mas quando o usei na minha instância do AWS EC2, ele diz "Permissão negada". Se eu adicionar "sudo" no começo, o comando "flask" não será reconhecido ...
user3768495 9/19/19
1
@ user3768495 Talvez o balão não esteja instalado no usuário root (sudo) #
Harun-Ur-Rashid
2
Oi @ Harun-Ur-Rashid, esse é provavelmente o caso - eu instalei em um ambiente virtual. Vou verificar como consertar. Obrigado pela sua resposta.
User3768495
22

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

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=80)

use o código a seguir para iniciar o servidor (minha entrada principal para o balão é app.py):

python app.py

ao invés de usar:

flask run
muca
fonte
10

Se você deseja que seu aplicativo seja na mesma porta, ou seja, port = 5000, execute apenas este comando no seu terminal:

fuser -k 5000/tcp

e então execute:

python app.py

Se você deseja executar em uma porta especificada, por exemplo, se você deseja executar na porta = 80, em seu arquivo principal, mencione isso:

if __name__ == '__main__':  
    app.run(host='0.0.0.0', port=80)
Alok Singh
fonte
8

Uma maneira conveniente é usar o pacote python-dotenv: ele lê um .flaskenvarquivo onde você pode armazenar variáveis ​​de ambiente para o balão.

  • pip install python-dotenv
  • crie um arquivo .flaskenvno diretório raiz do seu aplicativo

Dentro do arquivo que você especificar:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

Depois disso, você só precisa executar o aplicativo flask rune acessá-lo nessa porta.

Observe que o FLASK_RUN_HOSTpadrão é 127.0.0.1e o FLASK_RUN_PORTpadrão é 5000.

jorop
fonte
8

Esta é a única solução que funcionou para mim no Ubuntu-18.

Dentro do arquivo app.py, use:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

O código acima dará o mesmo erro de permissão, a menos que sudoseja usado para executá-lo:

sudo python3 app.py
Ibrahim
fonte
6

Seu problema é que você já possui um servidor web apache em execução que já usa a porta 80. Portanto, você pode:

  1. Mate o apache: você provavelmente deve fazer isso via /etc/init.d/apache2 stop, em vez de simplesmente matá-los.

  2. Implante seu aplicativo de balão no processo do apache, como descrito no balão do apache .

sebastiano
fonte
5

Eu tive que definir FLASK_RUN_PORTno meu ambiente o número da porta especificado. Da próxima vez que você iniciar o aplicativo, o Flask carregará essa variável de ambiente com o número da porta que você selecionou.

Cathal Cronin
fonte
3

Você não precisa alterar o número da porta do seu aplicativo, basta configurar o servidor www (nginx ou apache) para consultas de proxy na porta do balão. Preste atenção uWSGI.

greg
fonte
3

defina a porta com app.run(port=80,debug=True) você, defina debug como true quando estiver no dev

namorados
fonte
2

Solução mais fácil e melhor

Salve seu arquivo .py em uma pasta. Nesse caso, o nome da minha pasta é test. No prompt de comando, execute o seguinte

c:\test> set FLASK_APP=application.py
c:\test> set FLASK_RUN_PORT=8000
c:\test> flask run

----------------- O seguinte será retornado ----------------

 * Serving Flask app "application.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
127.0.0.1 - - [23/Aug/2019 09:40:04] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [23/Aug/2019 09:40:04] "[33mGET /favicon.ico HTTP/1.1[0m" 404 -

Agora, no seu navegador, digite: http://127.0.0.1:8000 . obrigado

Jagannath Banerjee
fonte
Ele precisa executá-lo no 80, que é um porto especial. Ele precisa parar outras coisas primeiro.
Ahmedn1
1

No meu cenário, as seguintes etapas funcionaram como um encanto:

  • Instalando o pacote:

    pip install --upgrade pip
    pip install python-dotenv
  • Criando um arquivo oculto no diretório do meu aplicativo "flaskr / .flaskenv"

  • Adicionando o seguinte conteúdo:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Por fim, execute o comando flask mais uma vez:

    flask run
  • A versão em que estou trabalhando é:

    pip freeze |grep -i flask
    Flask==1.1.1
Manuel Lazo
fonte