Bagaimana cara menjalankan Flask di port 80?

212

Saya memiliki server Flask yang berjalan melalui port 5000, dan tidak apa-apa. Saya dapat mengaksesnya di http://contoh.co.id/000

Tetapi apakah mungkin untuk mengaksesnya di http://example.com ? Saya berasumsi itu berarti saya harus mengubah port dari 5000 menjadi 80. Tetapi ketika saya mencobanya di Flask, saya mendapatkan pesan kesalahan ini ketika saya menjalankannya.

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

Menjalankan lsof -i :80pengembalian

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)

Apakah saya harus membunuh proses ini terlebih dahulu? Apakah itu aman? Atau adakah cara lain untuk menjaga Flask berjalan pada port 5000 tetapi entah bagaimana domain situs web redirect entah bagaimana?

quantumtremor
sumber
Anda dapat menggunakannya termos dengan apache .
Syed Habib M
3
judul pertanyaan tidak cocok dengan pertanyaan itu. mungkin harus membaca 'bagaimana tidak menjalankan hal-hal lain pada port 80'. Saya ingin tahu bagaimana cara mengubah flask port yang menjalankan pertanyaan ini, tetapi tidak pernah disebutkan bagaimana caranya di sini
Elliot Woods

Jawaban:

76

Jadi itu memunculkan pesan kesalahan karena Anda punya apache2 berjalan pada port 80.

Jika ini untuk pengembangan, saya hanya akan membiarkannya seperti pada port 5000.

Jika itu untuk produksi:

Tidak direkomendasikan

  • Berhenti apache2dulu;

Tidak direkomendasikan karena dinyatakan dalam dokumentasi:

Anda dapat menggunakan server builtin selama pengembangan, tetapi Anda harus menggunakan opsi penyebaran penuh untuk aplikasi produksi. (Jangan gunakan server pengembangan bawaan dalam produksi.)

Direkomendasikan

  • HTTPLalu lintas proxy melalui apache2ke Flask.

Dengan cara ini, apache2dapat menangani semua file statis Anda (yang sangat bagus - jauh lebih baik daripada server debug yang ada di Flask) dan bertindak sebagai proksi terbalik untuk konten dinamis Anda, meneruskan permintaan tersebut ke Flask.

Berikut tautan ke dokumentasi resmi tentang menyiapkan Flask dengan Apache + mod_wsgi.

Sunting 1 - Klarifikasi untuk @Djack

Lalu lintas HTTP proksi ke Flask melalui apache2

Ketika permintaan datang ke server pada port 80 ( HTTP) atau port 443 ( HTTPS) server web seperti Apache atau Nginx menangani koneksi permintaan dan mencari tahu apa yang harus dilakukan dengannya. Dalam kasus kami, permintaan yang diterima harus dikonfigurasi untuk diteruskan ke Flask pada protokol WSGI dan ditangani oleh kode Python. Ini adalah bagian "dinamis".

membalikkan proxy untuk konten dinamis

Ada beberapa keuntungan untuk mengkonfigurasi server web Anda seperti di atas;

  • Pengakhiran SSL - Server web akan dioptimalkan untuk menangani permintaan HTTPS dengan hanya sedikit konfigurasi. Jangan "roll your own" dengan Python yang mungkin sangat tidak aman dibandingkan.
  • Keamanan - Membuka port ke internet membutuhkan pertimbangan keamanan yang cermat. Server pengembangan Flask tidak dirancang untuk ini dan bisa memiliki bug terbuka atau masalah keamanan dibandingkan dengan server web yang dirancang untuk tujuan ini. Perhatikan bahwa server web yang dikonfigurasi dengan buruk juga tidak aman!
  • Penanganan File Statis - Dimungkinkan server web builtin Flask untuk menangani file statis namun ini tidak dianjurkan; Nginx / Apache jauh lebih efisien dalam menangani file statis seperti gambar, CSS, file Javascript dan hanya akan melewati permintaan "dinamis" (yang mana konten sering dibaca dari database atau perubahan konten) untuk ditangani oleh kode Python.
  • + lebih banyak. Ini berbatasan dengan ruang lingkup untuk pertanyaan ini. Jika Anda ingin info lebih lanjut lakukan riset di bidang ini.
Ewan
sumber
Itu memang jawaban yang bagus! Bisakah Anda menghilangkan dengan jelas bahasa Inggris jargon yang sangat teknis yang Anda gunakan " Proxy HTTP traffic to Flask through apache2" dan " reverse proxy for dynamic content"?
John Strood
2
@Jack - jawaban yang diperbarui namun berbatasan dengan ruang lingkup pertanyaan, jadi silakan cari online untuk info lebih lanjut.
Ewan
1
Terima kasih telah memberikan kata kunci. Saya pasti akan melakukan pencarian online.
John Strood
419

1- Hentikan aplikasi lain yang menggunakan port 80. 2- menjalankan aplikasi dengan port 80:

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)
Amir Mofakhar
sumber
1
berfungsi dengan baik, hanya di lingkungan windows., ketika apache tidak ada .. :)
jOSe
1
ini tidak bekerja untuk saya. seharusnya: flask run --host = 0.0.0.0
Harun-Ur-Rashid
1
@ JOSe Saya mencoba menggunakan PyCharm di Ubuntu, berfungsi dengan baik.
Bugs Buggy
@jOSe Apache tidak diperlukan untuk menjalankan linux, Anda dapat menghapus instalannya, atau mengubah porta itu.
nurettin
145

Untuk server yang terlihat secara eksternal, di mana Anda tidak menggunakan apache atau server web lain yang Anda ketikkan

flask run --host=0.0.0.0 --port=80
Harun-Ur-Rashid
sumber
Apakah perintah ini dapat dijalankan menggunakan env vars? Saya terus mencoba di CMD flask run --host=0.0.0.0 --port=$PORTdalam Dockerfile saya (untuk alasan heroku) dan saya terus mendapatkan kesalahan tentang membutuhkan integer untuk port saya
Smokin Joe
Ini bekerja dengan baik pada laptop saya (lokal) tetapi ketika saya menggunakannya pada contoh AWS EC2 saya, ia mengatakan "Izin ditolak". Jika saya menambahkan "sudo" di awal, itu mengatakan "flask" perintah tidak dikenali ...
user3768495
1
@ user3768495 Mungkin flask tidak diinstal pada pengguna root (sudo)
Harun-Ur-Rashid
2
Hai @ Harun-Ur-Rashid, mungkin itu masalahnya - saya menginstalnya di lingkungan virtual. Saya akan memeriksa cara memperbaikinya. Terima kasih untuk balasan Anda.
user3768495
22

Jika Anda menggunakan yang berikut untuk mengubah port atau host:

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

gunakan kode berikut untuk memulai server (pintu masuk utama saya untuk labu adalah app.py):

python app.py

alih-alih menggunakan:

flask run
muca
sumber
10

Jika Anda ingin aplikasi Anda pada port yang sama yaitu port = 5000 maka hanya di terminal Anda jalankan perintah ini:

fuser -k 5000/tcp

lalu jalankan:

python app.py

Jika Anda ingin menjalankan pada port yang ditentukan, misalnya jika Anda ingin menjalankan pada port = 80, dalam file utama Anda cukup sebutkan ini:

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

Cara yang mudah digunakan adalah menggunakan paket python-dotenv: Ia membaca .flaskenvfile tempat Anda dapat menyimpan variabel lingkungan untuk labu.

  • pip install python-dotenv
  • buat file .flaskenvdi direktori root aplikasi Anda

Di dalam file yang Anda tentukan:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

Setelah itu Anda hanya perlu menjalankan aplikasi Anda flask run dan dapat mengakses aplikasi Anda di port itu.

Harap perhatikan bahwa FLASK_RUN_HOSTdefault ke 127.0.0.1dan FLASK_RUN_PORTdefault ke 5000.

Jorop
sumber
8

Ini adalah satu-satunya solusi yang bekerja untuk saya di Ubuntu-18.

Di dalam file app.py, gunakan:

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

Kode di atas akan memberikan kesalahan izin yang sama kecuali sudodigunakan untuk menjalankannya:

sudo python3 app.py
Ibrahim
sumber
6

Masalah Anda adalah, bahwa Anda memiliki server web apache yang sudah berjalan yang sudah menggunakan port 80. Jadi, Anda bisa:

  1. Bunuh apache: Anda mungkin harus melakukan ini melalui /etc/init.d/apache2 stop, daripada hanya membunuh mereka.

  2. Menyebarkan aplikasi labu Anda dalam proses apache Anda, seperti yang dijelaskan oleh labu di apache .

sebastian
sumber
5

Saya harus mengatur FLASK_RUN_PORTdi lingkungan saya ke nomor port yang ditentukan. Lain kali Anda memulai aplikasi, Flask akan memuat variabel lingkungan itu dengan nomor port yang Anda pilih.

Cathal Cronin
sumber
3

Anda tidak perlu mengubah nomor port untuk aplikasi Anda, cukup konfigurasikan server www Anda (nginx atau apache) ke kueri proxy ke flask port. Perhatikan uWSGI.

greg
sumber
3

atur port dengan app.run(port=80,debug=True) Anda harus mengatur debug ke true ketika di dev

valentine
sumber
2

Solusi termudah dan terbaik

Simpan file .py Anda di folder. Kasus ini nama folder saya sedang diuji. Di command prompt jalankan yang berikut ini

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

----------------- Mengikuti akan dikembalikan ----------------

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

Sekarang pada jenis browser Anda: http://127.0.0.1:8000 . Terima kasih

Jagannath Banerjee
sumber
Dia perlu menjalankannya di 80 yang merupakan port khusus. Dia harus menghentikan hal-hal lain terlebih dahulu.
Ahmedn1
1

Dalam skenario saya, langkah-langkah berikut ini berfungsi seperti pesona:

  • Menginstal paket:

    pip install --upgrade pip
    pip install python-dotenv
  • Membuat file tersembunyi di direktori aplikasi saya "flaskr / .flaskenv"

  • Menambahkan konten berikut:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • Terakhir, jalankan perintah labu sekali lagi:

    flask run
  • Versi yang saya kerjakan adalah:

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