nginx+uwsgi部署实践的踩坑总结(二)

承接上一篇 nginx+uwsgi部署实践的踩坑总结(一)
这篇中将继续罗列我在配置nginx+uwsgi中踩过的坑。
如果在这篇中没有找到的问题可以去前一篇中查看。

1.一段非常常见的nginx报错

在启动nginx后,查看日志,会看到这么一段报错

[error] 1198#1198: *224 connect() to unix:///home/myproject/myproject.sock failed (111: Connection refused) while connecting to upstream, client: 37.102.213.142, server: 37.102.213.142, request: "GET /common/page_contents/ HTTP/1.0", upstream: "uwsgi://unix:///home/myproject/myproject.sock:", host: "37.102.213.142:8000", referrer: "http://37.102.213.142/main"

我在google上直接搜索这段报错,得到了各种各样的原因分析和解决方案。
从报错信息来看,错因是nginx 向uwsgi转发请求,然后这个请求被uwsgi拒绝。
基本上,错误的原因不在于nginx, 而在于uwsgi服务器内部发生了错误,导致转发的请求被拒绝。
所以,应该去检查uwsgi的日志。
检查uwsgi的日志,发现是python有了一段报错,就这样发现了另一个坑,这个坑如下。

2. python ImportError : No module named ‘encodings’

正如标题,完整的报错如下:

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

经过查找大量的资料,出现这个报错的原因大部分都是由于 python的虚拟运行环境配置错误。
python虚拟运行环境又是什么?
在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.6。所有第三方的包都会被pip安装到Python3的site-packages目录下。
如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的Python 3。如果应用A需要django 1.11.9,而应用B需要django 2.1怎么办?
这种情况下,每个应用可能需要各自拥有一套“独立”的Python运行环境。virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。

但是我并没有使用python 虚拟运行环境,为什么还会报错? 后来,发现在 uwsgi的 .ini配置文件中有 home = … 这一项,用于指定虚拟环境变量随意,而我的这一项在配置时不懂,随意填了个值,导致了麻烦的错误。
对于单python应用,或者没有使用python 虚拟运行环境,uwsgi 中的home 这一项就不用再赋值了。

3.no python application found 的报错

unable to load app 0 (mountpoint='') (callable not found or import error)
--- no python application found, check your startup logs for errors ---

这个也是一个比较常见的错误, 错因一般是 某个module或者app 没有 __init__.py这个文件,导致Python无法识别这个应用或模块。只要添加添加上,就不会报错。
如果__init__.py这个文件的内容为空,需要用touch 命令去创建这个空文件。
__init__.py这个文件作用是对一个python应用或模块进行初始化操作的,道理可以理解为一个类的构造函数,构造函数可以为空,但是一个类不能没有构造函数。

4.Error: That IP address can’t be assigned-to.

这个是在使用django 时,输入

python manage.py runserver http://192.168.1.XX:8080/

时,报的错误
stack overflow 上给出的解决方案是

python manage.py runserver  0:8000

亲测真的有效。

5.错误的命令导致服务器内存暴增

在更改django项目内容后,需要重新reload uwsgi,以更新更改的内容。
但是我之前都是用的 uwsgi –ini /etc/uwsgi/uwsgi.ini 来重启
一段时间后发现服务器内存使用率暴增,一看进程,uwsgi有大几十个进程,
原来,我用的命令是新开进程,不会把原来的进程kill
所以,使用

uwsgi --reload /etc/uwsgi/uwsgi.pid

就可以更新项目了。


踩完这些坑后,我的nginx和uwsgi 都可以完美运行了,希望这些分享可以对广大读者和将来某一天 好了伤疤忘了疼的自己 一些帮助。

猜你喜欢

转载自blog.csdn.net/Clark_Fitz817/article/details/79846883