uwsgi补充内容
补充一:安装
网上查了又查。有几种uwsgi的方案安装。
pip 进行安装的uwsgi,说是python的包管理,
yum和编译安装是一种服务的态度安装。
博主进行对比相对比较少,今天就补充一下yum安装和编译安装。
一、yum安装
yum install uwsgi -y
然后查看各种插件的方法就是
yum install uwsgi* # 使用通配符进行查看。不要使用-y参数。因为有大部分的插件是不需要的。
yum安装比较简单,此处就不多做详解了。咱讨论一下编译安装
二、编译安装
编译安装,坑实在是多得可怕,因为网上的教程大部分是这样的,以及官网都比较简单。
wget https://projects.unbit.it/downloads/uwsgi-2.0.13.1.tar.gz tar xf uwsgi-2.0.13.1.tar.gz cd uwsgi-2.0.13.1 python uwsgiconfig.py --build
就这么几个步骤完事了。
但是需要说的有这几点。
和python结合是需要python插件的。
python uwsgiconfig.py --plugin plugins/http core
但是你会发现,报错在所难免,我研究了一天,没研究明白。
yum install python-devel # 需要这个安装包才能安装插件成功
可是,你会发现,我前面的代码都是用python2来进行编译的,那么基本每个步骤都能成功。
你要是使用python3的话,又报错。
个人估计,是因为编译安装python3的时候,缺少各种编译参数,少包。
博主正在寻找原因。。
博主正在查找以下几点: 时间:2017/09/22
一:uwsgi如何使用python3来进行解析。而不是使用python2。 二:uwsgi的如此之多的插件,有哪些是优化项目。 三:uwsgi的编译安装如此多的坑,都有那些。
解决:
一:uwsgi支持python3方法就是,安装python-devel之后然后用python3进行编译即可。即步骤以下: yum install python-devel # 无需理会版本,这点我就有点迷茫 python3 uwsgiconfig.py --build # 这点就好解释多了 python uwsgiconfig.py --plugin plugins/python core # 这个是不是更简单了。想要支持python,就得装个python插件
补充二:多实例
多实例,实乃无奈之举,博主遇见的pip安装uwsgi的假死状态。一怒之下启动了多实例。
多实例的方案就是,复制多个配置文件,启动文件。
一个启动文件对应一个配置文件。
即可多实例成功。
补充三:假死
表示至今没找到为什么。
所以准备使用编译方法安装uwsgi。防止出现差错。
补充四: 报ascii错误
由于代码多了一个print,然后就报出了python2经常报的错误。 ascii错误。
经研究许久,没发现问题所在。 博主的环境是: MySQL:utf8 Linux: utf8 python代码:utf8
然后我添加一个语句:
LANGUAGE=en_US.UTF-8
好像就好使了。
然后就修改了
/etc/locale.conf
[root@web01 ~]# vim /etc/locale.conf LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8
坐等后面不要再出现报错啦。
补充五:对于reload的时候一直失败。
笔者使用的方法是简单的重启:在lazy-apps模式重载worker
后来我用了别的重启方法,各种失败。不知道为什么--touch-workers-reload一直失败。
然后我就用了一个参数 py-autoreload = 2 来做测试环境。那么重载就一直能成功了。
对了。 对于 stop 再start的话,频率太高会导致启动失败。
然后我找啊找,找到另外一种方案, 用管道方法 FIFO。
uwsgi 1.9.17之后,就支持了FIFO的方式, 嗯, 说得一本正经,我也不知道管道是个什么东西。
然后 uwsgi的配置文件添加一个参数 master-fifo = /tmp/uwsgififo
必须在tmp下面,其他地方会出现权限问题。当然,权限你把我 也可以放
然后 该文件别自己创建。 应该用uwsgi启动程序自动创建。
紧接着。就用下面命令重启
echo w > /tmp/uwsgififo
当然,一切以官网为主,凡是复制粘贴的,只是在浪费搜索人的时间而已。
http://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/MasterFIFO.html FIFO网址
http://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/articles/TheArtOfGracefulReloading.html 优雅重启
补充六:多环境配置。
网上有一个方案是通过virtualenv的方法,可是我线上环境不想使用virtualenv。所以我就另寻方法了。
首先,讨论一下需求:本地环境,测试环境,生产环境 的配置文件都是不一样的。
比如MySQL经常使用自己本地的数据库做测试,然后测试环境的数据库又是一个测试库。 生产环境的库又是一个。
那么,解决方案如下:
一:使用sed命令修改。
优点:简单,可以让数据库的信息不暴露给开发。 缺点:容易改错,改不全等等原因。 不要告诉我你sed玩得多牛逼,不好意思,开发会经常修改他们的配置文件。 而且会出现你意想不到的原因,比如数据库明明修改,可是程序启动起来却。。。。窜库或许是因为这个原因导致的。
二:使用uwsgi的配置文件修改:
优点:运维可以自己搞定,即使不懂开发。 缺点:配置文件有太多的重复,有时候开发不知道自己是否修改。直接提交。 上线,崩盘。数据找不回等等。 配置不是特别麻烦,但是注意一个问题“.”代表路径。
三:使用代码程序实现。
优点:灵活方便。 缺点:运维不懂python语言不懂修改,即使懂你没加入业务开发,你也不知道如何修改。
综上,推荐第三总方案。
sed不讲解了。
第二种方案:http://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/tutorials/Django_and_nginx.html 里面查找
env = DJANGO_SETTINGS_MODULE=mysite.settings
该配置文件意思就是 django的配置文件在mysite下面settings 即,你可以把settings取名成生产环境和测试环境。
第三种方案:修改settings
就是使用下面的方法来获取环境变量。
os.environ.get()
或者
>>> import platform
>>> platform.node() # 获取主机名
具体写法 ,我记起来查找就写。
获取环境变量来实现多环境的使用
VUE可以配置环境变量
Dajngo的settings和uwsgi 同时配置环境变量, 外加配置一个主机的环境变量即可