django+uwsgi+nginx+tomcat部署后上传文件为什么会失败?

环境:

  • Ubuntu16.04
  • python3.6
  • django1.11
  • uwsgi
  • nginx
  • tomcat(部署前端页面)

我的 nginx 配置文件:

user root;
worker_processes auto;
pid /run/nginx.pid;
# 如果是非root用户,user设为nobody

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        # backend_nginx.conf

        # the upstream component nginx needs to connect to
        upstream bookmanager {
            server unix:/home/serverend/comengine/comengine/comengine.sock; #读取uwsgi生成的socket文件中的socket信息
            # server 127.0.0.1:8000; # sever信息,有上边sock文件,这个就可以注掉了
        }
        # configuration of the server,最重要的部分
        server {
            # 你的服务站点挂载的端口号
            listen      7080;
            # the domain name it will serve for
            server_name 192.168.100.18; # 一般写你服务器的ip或你的域名
            charset     utf-8;

            access_log      /home/serverend/nginxsetting/log/nginx_access.log;
            error_log       /home/serverend/nginxsetting/log/nginx_error.log;

            # max upload size
            client_header_buffer_size 40890k;
            client_max_body_size 75M;   # adjust to taste
            client_body_buffer_size 80240k;

            # Finally, 设置总目录,实际就是映射到uwsgi的socket
            location / {
                            uwsgi_pass  bookmanager;
                include     /etc/nginx/uwsgi_params; # the uwsgi_params file you install
                uwsgi_ignore_client_abort on;
                proxy_send_timeout 300;
                proxy_read_timeout 300;
                proxy_buffer_size 512k;
                proxy_buffers 64 128k;
                proxy_busy_buffers_size 1024k;
                proxy_temp_file_write_size 512k;
                proxy_connect_timeout 70s;
            }

            # 如果有media或者静态文件需要挂载就加上,前后端各自分开的,不加或者注掉就行
            # Django media
            # location /media  {
            #     alias /path/to/your/mysite/media;  # your Django project's media files - amend as required
            # }

            # location /static {
            #    alias /home/yangtz/webback/backend/static; # your Django project's static files - amend as required
            # }
        }


}

在 nginx 里我已经设置了上传文件最大限制:75M

我的 uwsgi 配置文件:

# backend_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /home/serverend/comengine

# Django's wsgi file
module          = comengine.wsgi


# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 20
# the socket (use the full path to be safe),将socket写入sock文件,安全又便捷
socket          = /home/serverend/comengine/comengine/comengine.sock
# ... with appropriate permissions - may be needed
chmod-socket    = 666
# clear environment on exit
vacuum          = true

#ignore-sigpipe  = true
#ignore-write-errors = true
#disable-write-exception = true

daemonize = /home/serverend/nginxsetting/log/uwsgi.log

我的 tomcat 的 server.xml 文件

  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->


    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="9090" protocol="HTTP/1.1"
               connectionTimeout="5000000"
               maxPostSize="0"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the BIO implementation that requires the JSSE
         style configuration. When using the APR/native implementation, the
         OpenSSL style configuration is required as described in the APR/native
         documentation -->

在 tomcat 里也已经加上了 maxPostSize。

可是部署上线后,我在前端上传的文件基本不能超过 5M 或 6M,只要超过 5M 或 6M,后端就接收不到。这是怎么回事?我在该配置的地方都配置了啊,为什么会有这种问题?(django 程序里没有限制)


当只使用 uwsgi 时上传大文件会报这种错误:

[uwsgi-body-read] Error reading 49152 bytes. Content-Length: 14582139 consumed: 6373376 left: 8208763 message: Client closed connection
Internal Server Error: /temrule/uploadocrpdf/
Traceback (most recent call last):
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/http/request.py", line 331, in read
    return self._stream.read(*args, **kwargs)
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 53, in read
    result = self.buffer + self._read_limited(size - len(self.buffer))
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 41, in _read_limited
    result = self.stream.read(size)
OSError: error during read(65536) on wsgi.input

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/serverend/comengine/templaterule/views/ocrpdf_views.py", line 51, in upload_ocr_pdf
    sessionid = request.POST.get('sessionid')
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 126, in _get_post
    self._load_post_and_files()
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/http/request.py", line 299, in _load_post_and_files
    self._post, self._files = self.parse_file_upload(self.META, data)
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/http/request.py", line 258, in parse_file_upload
    return parser.parse()
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/http/multipartparser.py", line 238, in parse
    for chunk in field_stream:
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/http/multipartparser.py", line 384, in __next__
    output = next(self._producer)
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/http/multipartparser.py", line 517, in __next__
    for bytes in stream:
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/http/multipartparser.py", line 384, in __next__
    output = next(self._producer)
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/http/multipartparser.py", line 448, in __next__
    data = self.flo.read(self.chunk_size)
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/http/request.py", line 333, in read
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 53, in read
    result = self.buffer + self._read_limited(size - len(self.buffer))
  File "/home/yangtao/miniconda3/envs/compoengine/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 41, in _read_limited
    result = self.stream.read(size)
django.http.request.UnreadablePostError: error during read(65536) on wsgi.input
Fri Jan  5 19:25:45 2018 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /temrule/uploadocrpdf/ (ip 192.168.10.3) !!!
Fri Jan  5 19:25:45 2018 - uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 331] during POST /temrule/uploadocrpdf/ (192.168.10.3)
OSError: write error

难道是 uwsgi 的问题? 请问该怎么解决呢?

阅读 4.4k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题