环境:
- 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 的问题? 请问该怎么解决呢?