参照官方文档和此篇文档部署Django,本来会很简单,但是多亏了CentOS的古老而诡异的软件包,事情变得非常“有趣”。
[update] 在比较久以前我就把VPS预安装的CentOS替换成平时用的Arch Linux,可喜可贺。 在Arch Linux上部署基于Django的服务非常简单娱悦。永别了,CentOS,希望你埋得深一点。
--module
参数具体报错为uwsgi: unrecognized option '--module'
,此错误与CentOS7的包分割有关。
默认安装的uWSGI不包含python插件。
解决方法按照stackoverflow中某回答的提示,安装uwsgi-plugin-python36包。
除此之外,还要在uWSGI的启动参数中添加--plugin=python36
, 或者在ini配置文件中加入plugin = python36
。
写下本文的时候,CentOS7的官方sqlite3的版本为3.7.17,低于Django要求的最低版本3.8.3。 我本人倾向于只使用包管理工具管理系统范围的软件,但是相比于Arch Linux,我对CentOS7的包管理系统不是很熟悉,也就没自己打包。
到官网下载新版的autoconf版源码包,按照下面的安装使用autoconf的软件的普通步骤即可安装到指定目录。
我选择直接安装到~/local/
目录,不干扰系统文件。
## VERSION=你下载的版本号
tar xvfz sqlite-autoconf-$VERSION.tar.gz
cd sqlite-autoconf-$VERSION
./configure --prefix=$HOME/local
make
make install
还需要增加或修改环境变量:
使用export PATH=$HOME/local/bin:$PATH
直接配置当前shell或者写入.bashrc
或者.zshrc
中以固化设定。
对LD_LIBRARY_PATH
也是是如法炮制,使用export LD_LIBRARY_PATH="$HOME/local/lib"
。
ld.so
。此方法对使用yum安装的uWSGI有效,对直接使用python运行Django有效,直接进入python导入sqlite3也可验证版本。
但是对使用pip install uwsgi
安装的uWSGI无效。
参考前两段,本打算使用pip安装uWSGI,但是此时Django无法通过sqlite3版本验证,其使用的仍是系统的低版本sqlite3。
我尝试使用在uWSGI的ini配置文件中加入环境变量配置,但是Django使用的依旧是低版本sqlite3。 故无奈继续切换回系统包管理器安装uWSGI。
以下为我使用的配置项,修改之后或许能起作用,现在已经用系统版本的uWSGI成功部署,就暂时不修改验证。
## 或许缺少了PATH,没做验证
env = env=LD_LIBRARY_PATH=/path/to/my/home/local/lib
本文撰写时,nginx版本为1.12.2,使用开头提供的方法无法配置nginx。
故将原文中的配置文件段嵌入到/etc/nginx/nginx.conf
中。
原文中的unix socket链接写法有错误,应该使用unix:/path/to/socket.sock
,unix后面只需一个/
。
(注意:我未按原文链接写法做验证,但是可以在一个stackoverflow的回答中找到参考)
在启动uWSGI的时候出现chown(): Operation not permitted
错误,经检查此处有两个设置错误:
之前使用一个修改用户属组的命令错误,误将nginx用户加入我的用户组,而非将我的用户加入nginx组。
我不怎么用修改用户的命令,直接vipw
、vigr
挺方便的。
socket文件所在目录权限与属主设置错误。将/run/uwsgi
目录的权限设置为770
,属主设为USER:nginx
即可解决问题。
具体有关的设置参考如下部分配置项:
username = USER
uid = %(username)
gid = nginx
socket = /run/uwsgi/owlsome.sock
pidfile =/run/uwsgi/uwsgi.pid
chown-socket = %(username):nginx
chmod-socket = 664