基于Python3.7搭建CentOS+Django+uwsgi 环境(超详细图文教程)

CentOS默认是安装的py2.7,我的本地django依赖是2.0+版本,同时views中很多方法都是用的py3中的依赖模块,必须使用python3+版本。

目前为写本日志已重置系统盘,为全新环境演示。

Step1.安装扩展包管理工具

a.扩展包管理工具—— yum-utils ,它的功能是主要是针对repository及扩展包的工具 

b.yum-builddep

sudo yum install yum-utils
sudo yum-builddep python

上述出现任何错误均可忽略。一般也就是第二条有错误。如下图:

第一条执行是,会有二次确认,直接y即可。

Step2. 下载python3.7

这里我们以安装3.7.0为例,具体的细节版本可以去https://www.python.org/ftp/python/ 自行查看。虽然官方最新版是3.7.2但是源码包目录已经可以看到3.7.2后已经出现了python3.8.0的目录,也就是说python3.8正事公布也不远了。确定好自己的版本后,用curl命令将之下载下来:

curl -O https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz

如下图,等待下载完成:

 

Step3. 编译Python3.7

通过ls命令查看当前文件夹下的内容:

[root@iZ2zecsh1i1b8dkukshepyZ ~]# ls
Python-3.7.0.tgz

编译安装Python3.7,使用以下命令解压:

tar xf Python-3.7.0.tgz

 然后分别执行以下命令,作用是进入python目录及编译。

cd Python-3.7.0
./configure
make
sudo make install

注意,在执行sudo make install时,可能出现一些模块不可用而失败的问题,就比如我在编译时就遇到了2个情况:

PS:后面启动django时还遇到一个错误,大家在用的时候,可以先安装3个错误情况的模块后,最后再打包python,这样python只需要编译一次即可!

1)zipimport.ZipImportError: can't decompress data; zlib not available

安装对应的包即可,然后在重新编译python。

sudo yum -y install zlib*

2)ModuleNotFoundError: No module named '_ctypes'

解决办法:

sudo yum install libffi-devel -y

上述情况,都要分别执行一次:

./configure
make
sudo make install

最终编译成功,如图:

将python3设置为默认

在/etc/profile.d/目录下新建python.sh文件,文件内容为:

alias python='/usr/local/bin/python3.7'

设置完毕后,修改文件权限:

chmod 755 /etc/profile.d/python.sh

然后重启会话让修改生效:

source /etc/profile.d/python.sh

Step4. 检查Python

检查python/pip

直接输入python,即可进入3.7下,说明ok了。

ctrl+c退出py命令行,执行pip3,没出错说明也没有问题。

Step5. 安装django2.X、uswgi

 

记得,使用pip3命令!而不是pip!

1)安装django

pip3 install django

安装好后进入python检查一下django的版本号,命令和执行图如下:

可以看到安装的是最新的2.1.7版本。

建立一个简单名字为lizenghai_com的django项目,并进入项目目录。

django-admin.py startproject lizenghai_com
cd lizenghai_com

测试django能否成功运行。

因为阿里云的主机,主机的本地IP不是127.0.0.1或者192开头的,需要在后台自己看。而且,端口记得在安全组开放!!!

python manage.py runserver 172.XXX.XXX.XX:8000

启动失败,遇到错误:

ModuleNotFoundError: No module named '_sqlite3'

原因: 未安装sqlite 模块,解决: 

sudo yum install sqlite-devel

重新编译python。。前文中有描述。

python manage.py runserver 172.XXX.XXX.XX:8000,已经执行ok,

但有红色警告提示:

You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
 

实际是因为只创建了项目,项目相关数据库并没有对应创建,使用以下命令即可,第一条是扫描变动,第二条是生成变动对应数据库:

python manage.py makemigrations
python manage.py migrate

再次启动通过runserver那条命令启动项目,通过外网ip:8000来访问,可以访问,但有权限错误,需要修改setting.py,将IP添加进去。

DisallowedHost at /

Invalid HTTP_HOST header: 'xxx.xxx.xxx.xxx:8000'. You may need to add 'xxx.xxx.xxx.xxx' to ALLOWED_HOSTS.

我们放行任意IP:

将ALLOWED_HOSTS = []修改为ALLOWED_HOSTS = ['*'],重新启动项目即可。

2)安装uswgi

pip3 install uwsgi

使用uwsgi启动django项目:

uwsgi --http :8000 --file lizenghai_com/wsgi.py

用外网iP:8000访问没问题!

再进后台看一下http://xxx.xxx.xx.xx:8000/admin/login/?next=/admin/

后台所有样式文件都失效了,这是因为我们用uwsgi驱动django的缘故,如果用比较专业的语句描述就是:

IIS或Apache部署Django项目时,Admin后台管理CSS样式丢失

需要指定静态目录文件。

在settings.py中加入:

STATIC_ROOT = os.path.join(BASE_DIR, "static")

然后把后台的静态文件全部复制过来:

python manage.py collectstatic
 uwsgi --http :8000 --file lizengi_com/wsgi.py --static-map=/static=static

 

尝试将uwsgi以ini配置文件启动:

在django项目根目录下建立uwsgi.ini配置文件,内容填充如下:

# myweb_uwsgi.ini file
[uwsgi]
# Django-related settings
#直接对外
http-socket = :8000
#内部调用
socket = :8001
# the base directory (full path)
# 下面是你自己项目路径的绝对路径
chdir = /root/Python-3.7.0/lizenghai_com/
# Django s wsgi file
module = lizenghai_com.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
# 最大进程数量,根据自己CPU来
processes = 2
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true

以命令:uwsgi --ini uwsgi.ini启动。没有问题~

至此,本部分教程就结束了。