Saya menjalankan server Flask sederhana di Heroku:
web: gunicorn --worker-class eventlet -w 1 app:app --log-file=-
Ini menggunakan Python 2.7.15 untuk kompatibilitas dengan berbagai paket lainnya.
Sepertinya saya telah mengalami duplikat masalah ini sejak lama sejak Heroku pindah ke v. 19.8.1. Beberapa gambar (berukuran mulai dari beberapa kb hingga beberapa mb) tidak dapat dimuat; Saya memiliki situs dengan banyak gambar (kebanyakan lembar sprite untuk animasi) dan tampaknya pilihan acak dari mereka tidak akan memuat setiap kali, masing-masing melemparkan kesalahan berikut (jika gambar di-cache dari versi sebelumnya, itu dimuat tanpa masalah) :
2018-05-29T09:24:36.216949+00:00 app[web.1]: [2018-05-29 09:24:36 +0000] [10] [ERROR] Socket error processing request.
2018-05-29T09:24:36.216969+00:00 app[web.1]: Traceback (most recent call last):
2018-05-29T09:24:36.216971+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 66, in handle
2018-05-29T09:24:36.216972+00:00 app[web.1]: six.reraise(*sys.exc_info())
2018-05-29T09:24:36.216974+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 56, in handle
2018-05-29T09:24:36.216976+00:00 app[web.1]: self.handle_request(listener_name, req, client, addr)
2018-05-29T09:24:36.216978+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 129, in handle_request
2018-05-29T09:24:36.216980+00:00 app[web.1]: six.reraise(*sys.exc_info())
2018-05-29T09:24:36.216981+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 112, in handle_request
2018-05-29T09:24:36.216983+00:00 app[web.1]: resp.write_file(respiter)
2018-05-29T09:24:36.216985+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 403, in write_file
2018-05-29T09:24:36.216987+00:00 app[web.1]: if not self.sendfile(respiter):
2018-05-29T09:24:36.216989+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 393, in sendfile
2018-05-29T09:24:36.216990+00:00 app[web.1]: sent += sendfile(sockno, fileno, offset + sent, count)
2018-05-29T09:24:36.216992+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/_sendfile.py", line 66, in sendfile
2018-05-29T09:24:36.216994+00:00 app[web.1]: raise OSError(e, os.strerror(e))
2018-05-29T09:24:36.216996+00:00 app[web.1]: OSError: [Errno 11] Resource temporarily unavailable
ini adalah versi lain di requirements.txt:
Flask==0.12.2
gunicorn==19.8.1
pymongo==3.6.1
flask_socketio==2.9.6
flask_cors==3.0.3
eventlet==0.22.1
gevent==1.2.2
Mengubah gunicorn ke 19.7.1 tampaknya menyelesaikan masalah; itu bertahan dengan 19.8.0.
Seperti masalah serupa dari 2012, ini bukan masalah batas waktu permintaan karena kesalahan yang ditimbulkannya cukup cepat. Mengembalikan ke 19.7.1 telah memperbaikinya, jadi untuk saat ini saya akan tetap menggunakannya, tetapi akan lebih baik jika menggunakan versi terbaru. Sepertinya ini bisa menjadi masalah khusus Heroku; Saya hanya memperhatikan sekitar sebulan terakhir, tetapi tidak dapat menemukan informasi tentang kapan mereka mengubah versi.
Saya berjuang dengan masalah yang sama hari ini, sepanjang hari. Dan saya _think_ akhirnya saya perbaiki. Saya menggunakan nginx, Flask, gunicorn w/ eventlet, dan buruh pelabuhan.
Output pip freeze
saya (relevan):
eventlet==0.23.0
Flask==1.0.2
greenlet==0.4.14
gunicorn==19.9.0
Perintah gunicorn saya:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app
Gejala pertama adalah beban file statis besar melemparkan ERR_CONTENT_LENGTH_MISMATCH
di browser. Jelas ini merusak aplikasi, karena lib JS statis besar tidak dimuat.
Gejala kedua adalah nginx mencatat yang berikut ke error.log: upstream prematurely closed connection while reading upstream
Akhirnya, saya menelusurinya kembali ke item log gunicorn:
Socket error processing request. - [in /usr/local/lib/python2.7/dist-packages/gunicorn/glogging.py:277]
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 66, in handle
six.reraise(*sys.exc_info())
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 56, in handle
self.handle_request(listener_name, req, client, addr)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 129, in handle_request
six.reraise(*sys.exc_info())
File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 112, in handle_request
resp.write_file(respiter)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 403, in write_file
if not self.sendfile(respiter):
File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 393, in sendfile
sent += sendfile(sockno, fileno, offset + sent, count)
File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/_sendfile.py", line 66, in sendfile
raise OSError(e, os.strerror(e))
OSError: [Errno 11] Resource temporarily unavailable
Solusi terakhir saya adalah memulai gunicorn dengan flag --no-sendfile
, dan masalahnya hilang. Mengapa? Tidak yakin... Aku hanya senang itu berhasil.
Juga layak disebutkan, selama pemecahan masalah saya, saya melakukan yang terbaik untuk membuat nginx.conf saya menyerupai contoh yang ditemukan di sini: http://docs.gunicorn.org/en/stable/deploy.html
Saya menemui masalah ini juga, 19.7.0 berfungsi dengan baik
Apakah ini terjadi segera atau setelah respons yang lama dikirim sebagian?
Mungkin melayani penyebab file statis
Ada pembaruan tentang ini? Saya menghadapi masalah yang sama di 19.9.0
Semuanya bekerja dengan baik dan tiba-tiba itu mulai terjadi.
@tilgovi beri tahu saya jika Anda memerlukan info tentang ini. Tiba-tiba masalah ini mulai muncul
Bagi saya masalahnya adalah karena pekerja eventlet. Saya menghapus eventlet dan semuanya baik-baik saja sekarang.
Saya menemui masalah yang sama. Dan saran dari @SaintSimmo bekerja dengan baik untuk saya. Masalah ini segera terjadi ketika mulai mengunduh file besar. Saya menggunakan labu dan eventlet. Dan pekerjaan pengunduhan dilakukan oleh send_from_directory dari Flask.
Gunicorn dimulai dengan perintah berikut:
gunicorn --event kelas pekerja -w 1 -b 0.0.0.0:4000 unggah: aplikasi
yang akan memberikan kesalahan.
jika "--no-sendfile" ditambahkan dalam perintah, tidak ada pesan kesalahan yang dikirim. Jika pekerjaan pengunduhan dapat dilakukan tanpa "sendfile", jadi kapan "sendfile" ini harus digunakan?
gunicorn (versi 19.9.0) masalah yang sama dengan eventlet
Pada 19.9.0, rekomendasi @SaintSimmo tentang pengaturan --no-sendfile
juga berfungsi untuk saya.
Yap, masalah yang sama dan setelah menghapus pekerja eventlet itu berfungsi dengan baik.
Ketika saya memulai server dengan perintah ini (gunicorn -w 1 -k eventlet -b 127.0.0.1:5000 wsgi:app) saya menerima pengecualian di bawah dan gambar saya terpotong pada respons klien.
[ERROR] Permintaan pemrosesan kesalahan soket.
...
BlockingIOError: [Errno 11] Sumber daya tidak tersedia untuk sementara
Menghapus definisi kelas pekerja, itu berhasil.
gunicorn -w 1 -b 127.0.0.1:5000 wsgi:app
@jacebrowning dan @SaintSimmo , saya mengonfirmasi bahwa --no-sendfile parameter ekstra ke perintah gunicorn efektif.
Hal ini biasanya karena nproc terlalu sedikit, Anda dapat menambah jumlah nproc untuk pengguna yang menjalankan program tersebut dengan mengedit file ' /etc/security/limits.conf '.
Apakah Anda menderita masalah ini? Jika Anda menggunakan Python 3.4 atau lebih tinggi, perbarui versi Gunicorn Anda.
Saya memiliki masalah yang sama dengan --worker-class. Saya memperbarui gunicorn ke 20.0.4 dan masalahnya terpecahkan.
Mengubah kelas pekerja menjadi gevent berhasil untuk saya. --worker-class gevent
Komentar yang paling membantu
Saya berjuang dengan masalah yang sama hari ini, sepanjang hari. Dan saya _think_ akhirnya saya perbaiki. Saya menggunakan nginx, Flask, gunicorn w/ eventlet, dan buruh pelabuhan.
Output
pip freeze
saya (relevan):Perintah gunicorn saya:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app
Gejala pertama adalah beban file statis besar melemparkan
ERR_CONTENT_LENGTH_MISMATCH
di browser. Jelas ini merusak aplikasi, karena lib JS statis besar tidak dimuat.Gejala kedua adalah nginx mencatat yang berikut ke error.log:
upstream prematurely closed connection while reading upstream
Akhirnya, saya menelusurinya kembali ke item log gunicorn:
Solusi terakhir saya adalah memulai gunicorn dengan flag
--no-sendfile
, dan masalahnya hilang. Mengapa? Tidak yakin... Aku hanya senang itu berhasil.Juga layak disebutkan, selama pemecahan masalah saya, saya melakukan yang terbaik untuk membuat nginx.conf saya menyerupai contoh yang ditemukan di sini: http://docs.gunicorn.org/en/stable/deploy.html