webknjaz
@webknjaz
Python Hacker @ Persha Studia / Wargaming.net

Nginx + uWSGI + Python 3 (upload файлов)?

ситуация

python3 через uwsgi подключен к nginx.

проблема

при попытке послать файл на сервер нет вывода от uWSGI (см. логи ниже), в связи с чем nginx показывает 500 ошибку. а мне как раз нужно как-то организовать upload.

(обычный POST проходит нормально)

логи
nginx
2011/05/30 09:15:22 [error] 3258#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "POST /upload HTTP/1.1", upstream: "uwsgi://127.0.0.1:3031", host: "localhost", referrer: "http://localhost/"


uwsgi
SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) !!!<br/>
write(): Broken pipe [plugins/python/wsgi_subhandler.c line 128]<br/>
[pid: 3275|app: 0|req: 1/1] 127.0.0.1 () {48 vars in 959 bytes} [Mon May 30 09:14:22 2011] POST /upload =&gt; generated 0 bytes in 60000 msecs (HTTP/1.1 200) 3 headers in 92 bytes (0 switches on core 7)


конфиги
nginx
nginx.conf
worker_processes 1;<br/>
<br/>
events {<br/>
 worker_connections 1024;<br/>
}<br/>
<br/>
http {<br/>
 include uwsgi_params;<br/>
 include mime.types;<br/>
 default_type application/octet-stream;<br/>
<br/>
log_format main '$remote_addr - $remote_user [$time_local] &quot;$request&quot; '<br/>
 '$status $body_bytes_sent &quot;$http_referer&quot; '<br/>
 '&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;';<br/>
<br/>
access_log logs/access.log main;<br/>
<br/>
sendfile on;<br/>
 tcp_nopush on;<br/>
<br/>
keepalive_timeout 65;<br/>
<br/>
gzip on;<br/>
<br/>
server {<br/>
 listen 80;<br/>
 server_name localhost;<br/>
<br/>
charset utf-8;<br/>
<br/>
access_log logs/host.access.log main;<br/>
<br/>
location ~ ^/static/(.+)$ {<br/>
 root /home/webknjaz/py/wKSocialNetwork/media/;<br/>
 #index index.html index.htm; <br/>
 }<br/>
<br/>
location /static {<br/>
 root /home/webknjaz/py/wKSocialNetwork/media/static/;<br/>
 }<br/>
<br/>
location / {<br/>
 uwsgi_pass 127.0.0.1:3031; #/home/webknjaz/py/wsgi.py;<br/>
 }<br/>
<br/>
location ~ ^/images/u[0-9]+/(.+\.(?:gif|jpe?g|png))$ {<br/>
 root /home/webknjaz/py/wKSocialNetwork/media;<br/>
 }<br/>
<br/>
location ~ ^/images/u[0-9]+/+$ {<br/>
 root /home/webknjaz/py/wKSocialNetwork/media;<br/>
 }<br/>
<br/>
location ~ ^/images/+$ {<br/>
 root /home/webknjaz/py/wKSocialNetwork/media;<br/>
 }<br/>
<br/>
location ~ /id[0-9]+$ {<br/>
 uwsgi_pass 127.0.0.1:3031;<br/>
 #root html; #just for testing regex<br/>
 }<br/>
 location ~ /upload(.*)+ {<br/>
 uwsgi_pass 127.0.0.1:3031;<br/>
 }<br/>
<br/>
# redirect server error pages to the static page /50x.html<br/>
 #<br/>
 error_page 500 502 503 504 /50x.html;<br/>
 location = /50x.html {<br/>
 root html;<br/>
 }<br/>
 }<br/>
}<br/>

uwsgi_params
uwsgi_param QUERY_STRING $query_string;<br/>
uwsgi_param REQUEST_METHOD $request_method;<br/>
uwsgi_param CONTENT_TYPE $content_type;<br/>
uwsgi_param CONTENT_LENGTH $content_length;<br/>
<br/>
uwsgi_param REQUEST_URI $request_uri;<br/>
uwsgi_param PATH_INFO $document_uri;<br/>
uwsgi_param DOCUMENT_ROOT $document_root;<br/>
uwsgi_param SERVER_PROTOCOL $server_protocol;<br/>
<br/>
uwsgi_param REMOTE_ADDR $remote_addr;<br/>
uwsgi_param REMOTE_PORT $remote_port;<br/>
uwsgi_param SERVER_PORT $server_port;<br/>
uwsgi_param SERVER_NAME $server_name;<br/>
<br/>
#uwsgi_param SCRIPT_NAME $app;<br/>
#uwsgi_param UWSGI_MODULE $app;<br/>
#uwsgi_param UWSGI_CALLABLE &quot;${app}_handler&quot;;<br/>
#uwsgi_param UWSGI_PYHOME $document_root;<br/>
#uwsgi_param UWSGI_CHDIR $document_root;<br/>
#uwsgi_modifier1 30; #properly sets PATH_INFO variable<br/>
<br/>
uwsgi_pass_request_body off;<br/>


uwsgi
uwsgi.conf
127.0.0.1:3031<br/>
 &lt;enable-threads /&gt;<br/>
 4<br/>
 8<br/>
 &lt;master /&gt;<br/>
 &lt;harakiri-verbose /&gt;<br/>
 60<br/>
 /usr/lib/python3.1/<br/>
 /usr/lib/python3.1/site-packages/<br/>
 /usr/lib/python3.1/wsgiref/<br/>
 /home/webknjaz/py/wKSocialNetwork/<br/>
 /home/webknjaz/py/wKSocialNetwork/engine/<br/>
 /home/webknjaz/py/wKSocialNetwork/engine/adapter/<br/>
 /home/webknjaz/py/wKSocialNetwork/engine/model/<br/>
 /home/webknjaz/py/wKSocialNetwork/engine/view/<br/>
 /home/webknjaz/py/wKSocialNetwork/logs/uwsgi.log<br/>
 &lt;upload-progress&gt;/home/webknjaz/py/wKSocialNetwork/media/upload/progress&lt;/upload-progress&gt;<br/>
 &lt;buffer-size&gt;32768&lt;/buffer-size&gt;<br/>
 &lt;post-buffering&gt;8192&lt;/post-buffering&gt;<br/>
 &lt;post-buffering-bufsize&gt;65536&lt;/post-buffering-bufsize&gt;<br/>
 &lt;limit-post&gt;6553600&lt;/limit-post&gt;<br/>
  <br/>
 <br/>
<br/>
  • Вопрос задан
  • 6334 просмотра
Пригласить эксперта
Ответы на вопрос 6
@rhangelxs
Может попробовать через сокет их соединить? У меня похожая проблема была но там упиралось в объем разрешенного POST.
Отдельный вопрос что за директива upload-progress.
Ответ написан
@rhangelxs
Еще как вариант: вернуть default: uwsgi_pass_request_body on
Ответ написан
VBart
@VBart
Ну а что вы хотели добиться изменив uwsgi_pass_request_body на off?
wiki.nginx.org/HttpUwsgiModule#uwsgi_pass_request_body

Теперь у вас файл который вы POST-ом отправляете вообще не передается в uwsgi, и далее происходит банальная ситуация: uwsgi ждет когда ему передадут содержимое POST запроса, а nginx не передает, но ждет когда ему отдадут заголовки ответа. Так они друг друга и не дожидаются.
Ответ написан
@rhangelxs
Есть еще такой вариант: убрать харакири и посмотреть что будет. Такое чувство что у вас внутренняя логика питонового скрипта не успевает ничего в вывод выплюнуть.
Ответ написан
может и глупый вопрос, но мултипарт в форм есть?
Ответ написан
@rhangelxs
Не могу удержаться.
Это все из-за плохой кармы. Писать аналог контакта зло еще то.
location ~ /id[0-9]+$ {
uwsgi_pass 127.0.0.1:3031;
#root html; #just for testing regex
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект