本来在Mac上配置了Nginx + uWSGI, uWSGI里根据uWSGI官网的参考,配置了log-route :

daemonize = logs/uwsgi-daemon.log
logger = errlog file:%(project_folder)/logs/uwsgi-err.log
log-route = errlog (Traceback)|(HTTP/1.\d 500)

这样一般的log都会放到uwsgi-daemon.log里,当log里含有Traceback或者(HTTP/1.1 500)的字符时,会被记录到uwsgi-err.log里。测试有效后,把同样的配置部署到正式机(Ubuntu 18.04)上,但是发现Traceback或者500的log仍然会被记录到uwsgi-daemon.log中。

比对uWSGI在本地和服务器上的版本,都是2.0.18;使用uwsgi --plugins-list列出enabled的plugins,本地和服务器上的版本也相同。

搜了好久找到这篇Enabling internal routing in uWSGI ,这个时候回去看服务器上uwsgi-daemon.log里,果然在启动之初有警告:

!!! no internal routing support, rebuild with pcre support !!!

这说明uwsgi启动时检测到log-route的设置,当时发现自己并不支持log-route里的正则匹配,所以提示需要pcre这个库的支持。

根据上面Stackoverflow文章的提示,需要先安装:

apt install libpcre3 libpcre3-dev -y

然后重新安装uWSGI。

1,什么是libpcre3-dev:

Old Perl 5 Compatible Regular Expression Library - development files

2,重新安装uWSGI时需要注意,不能使用 pip install uWSGI,否则pip还是会使用之前cache的版本。要让它不使用cache的版本,两个方法:
1)删除cached wheels: rm -rf ~/.cache/pip/wheels,然后使用pip install uWSGI
2)强制pip不使用cache的版本:pip install -I --no-cache-dir uwsgi

TL;DR Solution

apt install libpcre3 libpcre3-dev -y
pip install -I --no-cache-dir uwsgi