Flask'in 80 numaralı bağlantı noktasında çalışmasını nasıl sağlayabilirim?


212

5000 numaralı bağlantı noktasından çalışan bir Flask sunucum var ve sorun yok. Http://example.com:5000 adresinden erişebilirim

Ancak http://example.com adresinden kolayca erişmek mümkün mü? Bunun 5000'den 80'e bağlantı noktasını değiştirmek zorunda olduğum anlamına geldiğini varsayıyorum. Ama Flask'ta denediğimde, çalıştırdığımda bu hata mesajını alıyorum.

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

Çalışan lsof -i :80iadeler

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)

Önce bu süreçleri öldürmem gerekiyor mu? Bu güvenli mi? Veya Flask'ın 5000 numaralı bağlantı noktasında çalışmasını sağlamanın başka bir yolu var mı, ancak ana web sitesi alan adı bir şekilde yönlendiriliyor mu?


şişeyi apache ile kullanabilirsiniz .
Syed Habib M

3
sorunun başlığı soruya uymuyor. belki de 'liman 80'de başka şeylerin nasıl çalıştırılamayacağını' okumalıdır. Bu şişenin sorduğu liman şişesinin nasıl değiştirileceğini merak ediyorum, ama burada nasıl belirtileceğimi hiç
Elliot Woods

Yanıtlar:


76

apache280 numaralı bağlantı noktasında çalıştığınız için bu hata mesajını atıyor .

Bu geliştirme amaçlıysa, 5000 numaralı bağlantı noktasında olduğu gibi bırakırım.

Üretim içinse:

Tavsiye edilmez

  • apache2Önce dur ;

Belgelerde belirtildiği gibi önerilmez:

Geliştirme sırasında yerleşik sunucuyu kullanabilirsiniz, ancak üretim uygulamaları için tam bir dağıtım seçeneği kullanmalısınız. (Yerleşik geliştirme sunucusunu üretimde kullanmayın.)

Önerilen

  • Şişeye HTTPgiden vekil trafik apache2.

Bu şekilde, apache2tüm statik dosyalarınızı (Flask içine yerleştirilmiş hata ayıklama sunucusundan çok daha iyi) işleyebilir ve dinamik içeriğiniz için ters bir proxy işlevi görebilir ve bu istekleri Flask'a iletebilir.

İşte Fachek'i Apache + mod_wsgi ile kurma ile ilgili resmi belgelere bir bağlantı .

Düzenleme 1 - @Djack için Açıklama

Apache2 üzerinden Flask'a proxy HTTP trafiği

80 ( HTTP) veya 443 ( HTTPS) numaralı bağlantı noktasındaki sunucuya bir istek geldiğinde, Apache veya Nginx gibi bir web sunucusu, isteğin bağlantısını işler ve onunla ne yapacağını öğrenir. Bizim durumumuzda, alınan bir istek WSGI protokolünde Flask'a iletilecek ve Python kodu ile işlenecek şekilde yapılandırılmalıdır. Bu "dinamik" kısımdır.

dinamik içerik için ters proxy

Web sunucunuzu yukarıdaki gibi yapılandırmanın birkaç avantajı vardır;

  • SSL Sonlandırması - Web sunucusu, HTTPS isteklerini yalnızca küçük bir yapılandırma ile işleyecek şekilde optimize edilecektir. Karşılaştırmada muhtemelen çok güvensiz olan Python'da "kendiniz yuvarlamayın".
  • Güvenlik - İnternete bir liman açmak güvenliğin dikkatle ele alınmasını gerektirir. Flask'ın geliştirme sunucusu bunun için tasarlanmamıştır ve bu amaçla tasarlanmış bir web sunucusuna kıyasla açık hatalar veya güvenlik sorunları yaşayabilir. Kötü yapılandırılmış bir web sunucusunun da güvensiz olabileceğini unutmayın!
  • Statik Dosya İşleme - Yerleşik Flask web sunucusunun statik dosyaları işlemesi mümkündür, ancak bu önerilmez; Nginx / Apache, resimler, CSS, Javascript dosyaları gibi statik dosyaları işlemede çok daha verimlidir ve yalnızca Python kodu tarafından işlenmek üzere "dinamik" istekleri (içeriğin bir veritabanından sık sık okunduğu veya içerik değiştiğinde) iletir.
  • + Daha fazla. Bu, bu sorunun kapsamı ile sınırlıdır. Daha fazla bilgi istiyorsanız, bu alanda biraz araştırma yapın.

Bu gerçekten harika bir cevap! " Proxy HTTP traffic to Flask through apache2" Ve " reverse proxy for dynamic content" kullandığınız son derece teknik jargonu düz İngilizce olarak anlamlandırabilir misiniz ?
John Strood

2
@Djack - cevap güncellendi, ancak sorunun kapsamı sınırlıdır, bu nedenle lütfen daha fazla bilgi için çevrimiçi bir arama yapın.
Ewan

1
Anahtar kelimeleri sağladığınız için teşekkür ederiz. Kesinlikle çevrimiçi arama yapacağım.
John Strood

419

1- 80 numaralı bağlantı noktasını kullanan diğer uygulamaları durdurun. 2- 80 numaralı bağlantı noktasını kullanarak uygulamayı çalıştırın:

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

1
apache yokken, sadece Windows ortamında iyi çalışıyor .. :)
jOSe

1
benim için çalışmıyor. olması gereken: flask run --host = 0.0.0.0
Harun-Ur-Rashid

1
@jOSe Ubuntu'da PyCharm'ı kullanmayı denedim, gayet iyi çalışıyor.
Bugs Buggy

@jOSe Linux'un çalışması için Apache gerekmez, kaldırabilir veya portunu değiştirebilirsiniz.
nurettin

145

Apache veya başka bir web sunucusu kullanmadığınız harici olarak görünen sunucu için

flask run --host=0.0.0.0 --port=80

Bu komut env vars kullanılarak çalıştırılabilir mi? CMD flask run --host=0.0.0.0 --port=$PORTDockerfile'ım (heroku nedenleriyle) içinde denemeye devam ediyorum ve limanım için bir tamsayıya ihtiyaç duyma konusunda hatalar almaya devam ediyorum
Smokin Joe

Bu, yerel (dizüstü bilgisayarımda) iyi çalıştı, ancak AWS EC2 örneğimde kullandığımda, "İzin Reddedildi" yazıyor. Başlangıçta "sudo" eklerseniz, "flask" komutu tanınmadı diyor ...
user3768495

1
@ user3768495 Belki şişe kök (sudo) kullanıcısına yüklenmemiş
Harun-Ur-Rashid

2
Merhaba @ Harun-Ur-Rashid, muhtemelen böyle - sanal bir ortama kurdum. Nasıl düzelteceğimi kontrol edeceğim. Cevabın için teşekkürler.
user3768495

22

Bağlantı noktasını veya ana bilgisayarı değiştirmek için aşağıdakileri kullanırsanız:

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

Sunucuyu başlatmak için aşağıdaki kodu kullanın (flask için ana girişim app.py):

python app.py

kullanmak yerine:

flask run

10

Uygulamanızı aynı bağlantı noktasında yani port = 5000 istiyorsanız, sadece terminalinizde bu komutu çalıştırın:

fuser -k 5000/tcp

ve sonra çalıştırın:

python app.py

Belirli bir bağlantı noktasında, örneğin ana bağlantı noktanızda = 80 bağlantı noktasında çalıştırmak istiyorsanız, şunu belirtin:

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

8

Uygun bir yol paketi kullanmaktır python-dotenv: .flaskenvŞişe için ortam değişkenlerini depolayabileceğiniz bir dosya okur .

  • pip install python-dotenv
  • .flaskenvuygulamanızın kök dizininde bir dosya oluşturun

Belirttiğiniz dosyanın içinde:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

Bundan sonra uygulamanızı çalıştırmanız yeterlidir flask runve uygulamanıza bu bağlantı noktasından erişebilirsiniz.

FLASK_RUN_HOSTVarsayılan olarak 127.0.0.1ve FLASK_RUN_PORTvarsayılan olarak ayarlandığını lütfen unutmayın 5000.


8

Ubuntu-18'de benim için çalışan tek çözüm bu.

Dosyanın içinde app.pyşunları kullanın:

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

Yukarıdaki kod sudo, çalıştırmak için kullanılmadığı sürece aynı izin hatasını verecektir :

sudo python3 app.py

6

Sorununuz, halihazırda 80 numaralı bağlantı noktasını kullanan bir apache web sunucunuz olması. Böylece, aşağıdakilerden birini yapabilirsiniz:

  1. Apache'yi öldür: Bunu muhtemelen /etc/init.d/apache2 stoponları öldürmek yerine yapmalısın .

  2. Apache'deki balonun açıkladığı gibi, balon uygulamanızı apache işleminize dağıtın .


5

Ben ayarlamak zorunda FLASK_RUN_PORTbelirtilen port numarasına benim ortamında. Uygulamanızı bir sonraki başlatışınızda, Flask bu ortam değişkenini seçtiğiniz bağlantı noktası numarasıyla yükleyecektir.


3

Uygulamanız için bağlantı noktası numarasını değiştirmeniz gerekmez, sadece www sunucunuzu (nginx veya apache) flask bağlantı noktasına proxy sorgularına yapılandırın. Üzerinde dikkat edin uWSGI.


3

app.run(port=80,debug=True) dev ile bağlantı noktasını ayarlayın geliştirmede hata ayıklamayı true olarak ayarlamalısınız


2

En Kolay ve En İyi Çözüm

.Py dosyanızı bir klasöre kaydedin. Bu durumda klasör adım test edildi. Komut isteminde aşağıdakileri çalıştırın

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

----------------- Aşağıdaki iade edilecektir ----------------

 * 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 -

Şimdi tarayıcınızda: http://127.0.0.1:8000 . Teşekkürler


Özel bir liman olan 80'de çalıştırması gerekiyor. Önce diğer şeyleri durdurması gerekiyor.
Ahmedn1

1

Benim senaryomda aşağıdaki adımlar bir cazibe gibi çalıştı:

  • Paketi yükleme:

    pip install --upgrade pip
    pip install python-dotenv
  • "Flaskr / .flaskenv" uygulama dizinimde gizli dosya oluşturma

  • Aşağıdaki içeriği ekleme:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Son olarak, flask komutunu bir kez daha çalıştırın:

    flask run
  • Üzerinde çalıştığım sürüm:

    pip freeze |grep -i flask
    Flask==1.1.1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.