centos7.4+Python3.6.8+Django2.1.5+Nginx1.12.2+uWSGI2.0.17.1搭建部署PythonWeb项目

转载大家请注明出处:小成吉思汗的创作世界
(https://www.jianshu.com/p/cafe0bf74fad)

第一次写博客大家不要见笑,说一下写这篇文章的初衷,这段时间自己用Python搞了一个Web项目需要部署到服务器,那么问题来了,如何部署?

老办法,百度一下,搜出来的答案五花八门并且不全。

本片文章会给大家分享从0到1的过程,并把在这个过程中遇到的问题和解决办法分享给大家,有不妥之处,欢迎留言指正。

Python3.6.8的安装

1、为了保险起见,在安装Python之前,需要先安装一些依赖包,如果你不确定你机器上有没有安装,执行下面命令。

yum groupinstall 'Development Tools'
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

2、对系统自带的Python2.7.5进行备份,

cd /usr/bin
mv python python.bak

3、下载python3.6.8的源码压缩文件和pip工具

#创建安装路径,也可以换成你自己创建的目录
mkdir -p /usr/local/python/python3
#操作路径 /usr/local
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
wget https://bootstrap.pypa.io/get-pip.py

4、解压源码压缩包

#操作路径  /usr/local
tar -zxvf Python-3.6.8.tgz

5、编译安装环境

#操作路径 /usr/local/Python-3.6.8/
./configure --prefix=/usr/local/python/python3

6、进行安装

#操作路径要在/usr/local/Python-3.6.8
make && make install

7、设置Python软连接

ln -s /usr/local/python/python3/bin/python3 /usr/bin/python

8、验证是否安装成功

python -V
输出下方信息,证明成功了
Python 3.6.8

9、安装pip

#操作路径 /usr/local
python get-pip.py

10、设置pip软链接

ln -s /usr/local/python/python3/bin/pip3 /usr/bin/pip

注意:由于centos7的yum要使用到python2.7.5的环境,我们要指定yum使用的版本,使用3.6.8会导致yum命令无法使用,需要修改以下两个文件。vi命令可以自行百度。

#第一个:
vi /usr/bin/yum
#把文件头部的#!/usr/bin/python改成#!/usr/bin/python2.7保存退出即可。
#第二个
vi /usr/libexec/urlgrabber-ext-down
#同样把文件头部的#!/usr/bin/python改成#!/usr/bin/python2.7保存退出即可。

到此Python3.6.8就安装完成了。我们准备进入下一个环节。

Django的安装

pip3 install Django

Ngnix安装

1、安装Nginx存储库

sudo yum install epel-release

2、 安装Nginx

sudo yum install nginx

3、启动Nginx,如果有防火墙请关闭。

sudo systemctl start nginx

#以下为停止,重启命令
systemctl stop nginx
systemctl restart nginx

如果要实现开机启动使用以下命令

sudo systemctl enable nginx

uWgsi安装

pip3 install uwsgi

在追加几个uwgsi的常用命令

uwgsi --ini name.ini
uwgsi --reload name.ini
uwgsi --stop name.pid

因为我使用的市MySql数据库,所以还需要安装一个库

pip3 install PyMySQL

到目前为止所有的安装工作基本告一段落,当然每个人项目所用的python库不一样,项目所需要的库都需要进行安装。

下面进入环境配置环节

uWsgi配置,配置uwsgi启动django的参数

我的操作习惯是这样,先假设设Django项目名字是mysite,里面模块叫myapp,已经把mysite项目上传到服务器的/var/local目录下。
在此目录下新建一个配置文件:uwsgi_mysite.ini,编辑文件为如下内容。

vi uwsgi_mysite.ini

[uwsgi]
# 通过uwsgi访问Django项目需要配置成http
# 通过nginx请求uwsgi来访问Django项目 需要配置成socket
# 9000 是Django项目的端口号
socket = :9000

# web项目根目录
chdir = /var/local/mysite

# module指定项目自带的的wsgi配置文件位置
module = mysite.wsgi

# 允许存在主进程
master = true

# 开启进程数量
processes = 3

# 服务器退出时自动清理环境
vacuum = true

#下面两条配置用于生成.status和.pid文件,后续关闭uwsgi时,会用到pid文件
stats=/var/local/uwsgi_forest.status           
pidfile=/var/local/uwsgi_forest.pid 

Nginx配置

nginx默认使用的是80端口,可以修改成你自己喜欢的端口,比如8089

#修改配置文件
vi /etc/nginx/nginx.conf

server {
    listen 8089;
    listen [::]:8089;
    ...
    ...
}

systemctl restart nginx 重启nginx,直接访问http://ip:8089 ,看到nginx欢迎界面说明成功。

继续配置Nginx

vi /etc/nginx/nginx.conf

···
server {
        listen       8089 default_server;
        listen       [::]:8089 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:9000;
        
        }


        location /static/ {
            alias /var/local/mysite/myapp/static;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
    ···

8089 是对外的端口号。
server_name是nginx代理uwsgi对外的ip,保持默认就ok。
uwsgi_pass 127.0.0.1:9000;即当nginx收到8089端口的请求时,直接将请求转发给 127.0.0.1:9000。

uwsgi启动django

# 进入项目根目录
cd /var/local/mysite

# 启动
uwsgi --ini /var/local/uwsgi_mysite.ini

重启Nginx

systemctl restart nginx

到现在可以说项目可以正常运行了,但是,但是,但是,会有一个bug,就是当你访问http://ip:8089/admin时,admin模块的样式全部丢失了,这是为什么,经过研究,找到了解决办法。

在mysite项目的配置文件: setting.py 中新增配置 STATIC_ROOT , 然后执行 python manage.py collectstatic命令

#此时关于static的配置如下:
#我习惯把static与mysite项目放在同一级目录
···
STATIC_ROOT = '/var/local/static/'
STATIC_URL = '/static/'
···

执行 python manage.py collectstatic 命令

#进入到项目根路径/var/local/mysite
python manage.py collectstatic 

可以看出 python manage.py collectstatic 的作用是收集Django项目,也就是mysite项目中所有涉及到的静态资源,统一放到 路径STATIC_ROOT 管理访问。

注意:此时还有一处需要修改,就是ngnix中配置静态文件的目录。

修改结果如下:

vi /etc/nginx/nginx.conf

···
server {
        listen       8089 default_server;
        listen       [::]:8089 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:9000;
        
        }


        location /static/ {
            alias /var/local/static;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
    ···

location /static/改为/var/local/static,就是刚刚我们配置的路径。

到这里可以说我们所有的配置就已将完成了。在我配置的过程中,我重启了服务器,发生了一个小插曲,就是mysql的1017错误
ERROR 1017 (HY000): Can't find file: './data_db/tabls.frm' (errno: 13 - Permission denied)

#不是表不见了,而是权限的问题
#需要切换到 tabls.frm 这个目录下面去,我这里是 /var/lib/mysql
#进入到这个目录后 可以看到所有数据库,然后进入到mysite项目的数据库,加入叫mysiteDB,然后进行以下操作 

chown mysql.mysql *
ok,今天的分享与记录就到此结束了,这是我的第一篇博客,我自己都不太相信,哈哈。

你可能感兴趣的:(centos7.4+Python3.6.8+Django2.1.5+Nginx1.12.2+uWSGI2.0.17.1搭建部署PythonWeb项目)