Недійсний розмір блоку запиту uwsgi


142

Я запускаю uwsgi в режимі імператора

uwsgi --emperor /path/to/vassals/ --buffer-size=32768

і отримати цю помилку

invalid request block size: 21327 (max 4096)...skip

Що робити?? Я також спробував -b 32768


1
Розмір буфера, очевидно, як і раніше значення за замовчуванням (4096), переконайтеся, що ви працюєте над правильним екземпляром. Ви також можете написати "-b 32k". Також переконайтеся, що ця опція (розмір буфера) вже не встановлена ​​в якомусь файлі конфігурації.
zakinster

Немає файлу конфігурації. Ще не працює :(
Картік Рокде

8
uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html ви намагаєтеся підключитися до uwsgi сокет з використанням протоколу HTTP, на додаток до цього варіанти , зазначені імператору не успадковується, це тільки менеджер процесів
roberto

@zakinster Чомусь формат значення kдля мене не працював. Довелося надати повну кількість. Не вдається знайти вказівники на формати, які ви можете використовувати тут.
знаменитийГаркін

Відповіді:


207

Я також стикався з тим же питанням, дотримуючись деякого підручника. Проблема полягала в тому, що я встановив варіант socket = 0.0.0.0:8000замість http = 0.0.0.0:8000. socketваріант, призначений для використання з деяким стороннім маршрутизатором (наприклад, nginx), тоді як при встановленні httpпараметра uwsgi може приймати вхідні HTTP-запити та відправляти їх самостійно.


5
Я просто хотів би прокоментувати це: uwsgi має параметри "http", "http-socket" та "socket". Я хотів зателефонувати cgi python-скриптам; "socket" була відповіддю.
NuclearPeon

У файлі конфігурації Nginx ми можемо захотіти використовувати це: include / etc / nginx / uwsgi_params; uwsgi_pass django_upstream;
mennanov

3
Це не правильне рішення. Що робити, якщо ми хочемо Unix розетки?
Farsheed

2
@Farsheed, я щойно описав, чому ОП бачить цю помилку. Як це виправити, повністю залежить від вас. Це може бути socket = /tmp/myapp.sockабо http = 0.0.0.0:8000будь-яке, залежно від ваших потреб.
Паласати

1
Хоча ця відповідь може вирішити проблему в деяких ситуаціях, я думаю, що правильна відповідь у загальному випадку - це відповідь, надана нижче @Farsheed.
Августо Дестреро

142

Правильне рішення - не переходити на протокол HTTP. Вам просто потрібно збільшити розмір буфера в налаштуваннях uWSGI.

buffer-size=32768

або в режимі командного рядка:

-b 32768

Цитата з офіційної документації:

За замовчуванням uWSGI виділяє дуже невеликий буфер (4096 байт) для заголовків кожного запиту. Якщо ви почнете отримувати "недійсний розмір блоку запиту" у своїх журналах, це може означати, що вам потрібен більший буфер. Збільште його (до 65535) за допомогою параметра розміру буфера.

Якщо ви отримаєте "21573" як розмір блоку запиту у своїх журналах, це може означати, що ви використовуєте протокол HTTP для розмови з екземпляром, що говорить протокол uwsgi. Не робіть цього.

Звідси: https://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html


1
Іноді доводиться використовувати протокол http, оскільки Unix-сокети доступні лише на локальній машині. Розгляньте ситуацію, коли у вас є кілька машин і окремий балансир поверх них - вам тут доведеться користуватися http-socket.
Паласати

@Palasaty або IP-розетка та uwsgiпротокол, тоді ви також можете отримати ту ж помилку, що і OP
Андрій

2
@Palasaty, з будь-якої причини, виправлення розміру буфера вирішить проблему!
Farsheed

При використанні nginx як зворотного проксі я повинен був використовувати http-socket. Все інше дало "502 Bad Gateway", навіть коли розмір буфера був збільшений.
Hubro

Що стосується цитованої документації "Якщо ви отримуєте" 21573 "як розмір блоку запиту у своїх журналах, це може означати, що ви використовуєте протокол HTTP для розмови з екземпляром, який говорить протокол uwsgi. Не робіть цього". Тож зрозуміло, що пропозиція неправильна .... Також користувач @Kartic вже спробував використати "-b" варіант ...
LittleEaster

14

Я зіткнувся з тією ж проблемою, намагаючись запустити її під nginx і слідкував за документами тут . Важливо зауважити, що після переходу на nginx ви повинні переконатися, що ви не намагаєтеся отримати доступ до програми на порту, визначеному парамером --socket, а, швидше, порту "прослухати" в nginx.conf. Хоча ваша проблема описується по-різному, заголовок відповідає саме тій проблемі, яку я мав.


так, я наткнувся на те саме. Іншими словами, я отримав помилку, коли я згорнув порт локально, тоді як я міг успішно перейти до "місця розташування" свого wsgi-зворотного проксі-сервера, як зазначено в моєму "nginx.conf", оскільки протокол сервера wsgi на мій вибраний сокет був wsgi, а не http
danyamachine

14

Я міг би це виправити, додаючи --protocol = http до uwsgi


2
Як я можу це налаштувати у файлі ini налаштувань uWSGI? Моя конфігурація працює з вашою пропозицією, але лише в командному рядку.
Генрі Лінкс

2
@HenryLynx, просто додай protocol=httpу свій .iniфайл
151291

7

Ця помилка відображається, коли сервер uWSGI використовує uwsgiпротокол і намагається отримати доступ до нього через httpпротокол через curlвеб-браузер безпосередньо. Якщо ви можете, спробуйте налаштувати ваш сервер uWSGI на використання httpпротоколу, щоб ви могли отримати доступ до нього через веб-браузер або згортання.

Якщо ви не можете (або не хочете) її змінити, ви можете використовувати зворотний проксі (наприклад nginx) перед локальним або віддаленим сервером uWSGI, див. Https://uwsgi-docs.readthedocs.org/en/latest/Nginx .html

Якщо вам здається, що це занадто багато роботи, спробуйте uwsgi-toolsпакет python:

$ pip install uwsgi-tools

$ uwsgi_curl 10.0.0.1:3030

Існує також простий зворотний проксі - сервер , uwsgi_proxyякщо вам необхідно отримати доступ додатки (и) з допомогою веб - браузера і т.д. Див більш розгорнуту відповідь https://stackoverflow.com/a/32893520/179581


2

Як вказувалося в іншому коментарі док.

Якщо ви отримаєте "21573" як розмір блоку запиту у своїх журналах, це може означати, що ви використовуєте протокол HTTP для розмови з екземпляром, що говорить протокол uwsgi. Не робіть цього.

Якщо ви використовуєте Nginx, це станеться, якщо у вас є ця конфігурація (або щось подібне дивним):

proxy_pass http://unix:/path/to/socket.sock

це говорить HTTP до uWSGI (що робить його бурхливим). Замість цього використовуйте:

uwsgi_pass unix:/path/to/socket.sock;

0

людина ім Хавін те саме питання; так що я це зробив ... дивіться за допомогою UWSGI + DJANGO + NGINX + REACT +

1 - nano /etc/uwsgi/sites/app_plataform.ini [uwsgi]

DJANGO_SETTINGS_MODULE = app_plataform.settings env = DJANGO_SETTINGS_MODULE settings.configure ()

chdir = / home / app_plataform home = / root / app_plataform module = prometheus_plataform.wsgi: додаток

master = істинні процеси = 33 розмір буфера = 32768

socket = /home/app_plataform/app_plataform.sock chmod-socket = 777 вакуум = вірно

2 - зробити серйозне оновлення продуктивності на nginx ... користувацьких www-даних;

auto_process авто; робочий_процес 4; pid /run/nginx.pid; включати /etc/nginx/modules-enabled/*.conf;

події {worker_connections 4092; multi_accept увімкнено; }

http {## ОНГРАДНІ КОНФІГИ

client_body_buffer_size 16K; client_header_buffer_size 16k; client_max_body_size 32м; #large_client_header_buffers 2 1k;

client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15; send_timeout 10; access_log вимкнено;

## # Основні налаштування ##

sendfile on; tcp_nopush увімкнено; tcp_nodelay увімкнено; #keepalive_timeout 65; type_hash_max_size 2048; server_tokens вимкнено;

сервер_імена_гаш_букет_размер 64; # ім'я_сервера_в_посередку вимкнено;

включати /etc/nginx/mime.types; application_type application / octet-stream;

## # Налаштування SSL ##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Випадання SSLv3, ref: POODLE ssl_prefer_server_ciphers увімкнено;

## # Налаштування журналу ##

access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;

## # Налаштування Gzip ##

gzip на; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied
закінчився приватний auth no-cache no-store; gzip_types text / plain application / x-javascript text / xml text / css application / xml; gzip_vary на;

#gzip_proxied будь-який; #gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; #gzip_types text / text text / css application / json application / javascript text / xml application / xml application / xml + rss text / javascript;

## # Налаштування віртуального хоста ##

включати /etc/nginx/conf.d/ .conf; включити / etc / nginx / включено сайти / ; }

3 - потім ... перезапуск послуг або сервер reebot ...

systemctl перезапуск uwsgi & systemctl перезапуск nginx

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.