欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

nginx+uwsgi部署实践和问题解决(二)

程序员文章站 2022-05-12 19:06:32
承接上一篇 nginx+uwsgi部署实践和问题解决(一) 这篇中将继续罗列我在配置nginx+uwsgi中踩过的坑。 如果在这篇中没有找到的问题可以去前一篇中查看。 1.一段非常常见的...

承接上一篇 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

亲测真的有效。


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