HOME AUTHORS

使用uWSGI和nginx在Centos7部署Django

2021年1月28日 19:18
owl
Tags django nginx sqlite3 uwsgi 版本

参照官方文档此篇文档部署Django,本来会很简单,但是多亏了CentOS的古老而诡异的软件包,事情变得非常“有趣”。

[update] 在比较久以前我就把VPS预安装的CentOS替换成平时用的Arch Linux,可喜可贺。 在Arch Linux上部署基于Django的服务非常简单娱悦。永别了,CentOS,希望你埋得深一点。

uWSGI无法解析--module参数

具体报错为uwsgi: unrecognized option '--module',此错误与CentOS7的包分割有关。 默认安装的uWSGI不包含python插件。

解决方法按照stackoverflow中某回答的提示,安装uwsgi-plugin-python36包。 除此之外,还要在uWSGI的启动参数中添加--plugin=python36, 或者在ini配置文件中加入plugin = python36

sqlite3版本过低

写下本文的时候,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

还需要增加或修改环境变量:

此方法对使用yum安装的uWSGI有效,对直接使用python运行Django有效,直接进入python导入sqlite3也可验证版本。 但是对使用pip install uwsgi安装的uWSGI无效

pip安装的uWSGI无法使用本地安装的高版本sqlite3

参考前两段,本打算使用pip安装uWSGI,但是此时Django无法通过sqlite3版本验证,其使用的仍是系统的低版本sqlite3。

我尝试使用在uWSGI的ini配置文件中加入环境变量配置,但是Django使用的依旧是低版本sqlite3。 故无奈继续切换回系统包管理器安装uWSGI。

以下为我使用的配置项,修改之后或许能起作用,现在已经用系统版本的uWSGI成功部署,就暂时不修改验证。

## 或许缺少了PATH,没做验证
env = env=LD_LIBRARY_PATH=/path/to/my/home/local/lib

Centos7安装的nginx版本(不优雅)配置方法

本文撰写时,nginx版本为1.12.2,使用开头提供的方法无法配置nginx。 故将原文中的配置文件段嵌入到/etc/nginx/nginx.conf中。

原文中的unix socket链接写法有错误,应该使用unix:/path/to/socket.sock,unix后面只需一个/。 (注意:我未按原文链接写法做验证,但是可以在一个stackoverflow的回答中找到参考)

unix socket文件权限及文件属主设置问题

在启动uWSGI的时候出现chown(): Operation not permitted错误,经检查此处有两个设置错误:

  1. 之前使用一个修改用户属组的命令错误,误将nginx用户加入我的用户组,而非将我的用户加入nginx组。 我不怎么用修改用户的命令,直接vipwvigr挺方便的。

  2. 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