环境: nginx, uwsgi(flask), mongodb 各运行在独立的docker容器中。
问题: 本地测试一切正常,部署到服务器(腾讯云)之后,无法连接到mongodb数据库。
uwsgi日志如下:
[pid: 8|app: 0|req: 2/3] 117.27.149.14 () {42 vars in 610 bytes} [Mon Sep 12 03:37:26 2016] HEAD / => generated 0 bytes in 30019 msecs (HTTP/1.1 500) 2 headers in 0 bytes (0 switches on core 1)
[2016-09-12 03:37:56,255] ERROR in app: Exception on / [HEAD]
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 1988, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 1641, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 1544, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.5/dist-packages/flask/_compat.py", line 33, in reraise
raise value
File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 1639, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 1625, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python3.5/dist-packages/flask/views.py", line 84, in view
return self.dispatch_request(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/flask/views.py", line 149, in dispatch_request
return meth(*args, **kwargs)
File "./app/main/views.py", line 17, in get
list_categories = get_categories(Post.objects)
File "/usr/local/lib/python3.5/dist-packages/mongoengine/queryset/manager.py", line 37, in __get__
queryset = queryset_class(owner, owner._get_collection())
File "/usr/local/lib/python3.5/dist-packages/mongoengine/document.py", line 176, in _get_collection
db = cls._get_db()
File "/usr/local/lib/python3.5/dist-packages/mongoengine/document.py", line 169, in _get_db
return get_db(cls._meta.get("db_alias", DEFAULT_CONNECTION_NAME))
File "/usr/local/lib/python3.5/dist-packages/mongoengine/connection.py", line 173, in get_db
source=conn_settings['authentication_source'])
File "/usr/local/lib/python3.5/dist-packages/pymongo/database.py", line 1018, in authenticate
connect=True)
File "/usr/local/lib/python3.5/dist-packages/pymongo/mongo_client.py", line 439, in _cache_credentials
writable_preferred_server_selector)
File "/usr/local/lib/python3.5/dist-packages/pymongo/topology.py", line 210, in select_server
address))
File "/usr/local/lib/python3.5/dist-packages/pymongo/topology.py", line 186, in select_servers
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: mongodb_1:27017: [Errno 111] Connection refused
Mon Sep 12 03:37:56 2016 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) !!!
Mon Sep 12 03:37:56 2016 - uwsgi_response_write_headers_do(): Broken pipe [core/writer.c line 238] during HEAD / (117.34.28.13)
[pid: 10|app: 0|req: 1/4] 117.34.28.13 () {42 vars in 609 bytes} [Mon Sep 12 03:37:26 2016] HEAD / => generated 0 bytes in 30061 msecs (HTTP/1.1 500) 2 headers in 0 bytes (0 switches on core 0)
但是,我进入uwsgi容器,在代码目录下执行 python3 manage.py deploy
完全没问题(这个命令会往数据库里插入一条数据),所以貌似是这样的:flask可以和mongodb正常通信,但是uwsgi不行。
简直蛋疼得紧!
uwsgi配置如下:
[uwsgi]
# 提供http和socket两种通信方式
http = 0.0.0.0:8080
socket = /tmp/%n.sock
# socket 文件权限
chmod-socket = 666
# 网站主目录
chdir = /var/www/chriscafe.me
# 程序启动文件
wsgi-file = manage.py
# 程序内启动 application 的变量名
callable = app
# 日志文件路径
logto = /var/log/uwsgi/%n.log
# 处理器数
processes = 4
# 线程数
threads = 2
#状态检测地址(本地地址,只有管理员才可以查看)
stats = 127.0.0.1:9191
应用和数据库是在同一台机器,还是不同机器,如果是不同机器,检查一下防火墙端口是否开放