新手玩家在Linux(centOS7)下部署Django项目的过程

自己在云服务器搭了个小项目,把过程和踩的坑都记录下来。

操作系统:centOS 7

python版本:3.7.4

Django版本:2.2

mysql版本:5.7

还有:uwsgi + nginx

 

目录

一、服务器环境的搭建 

(1)更新系统软件包

(2)安装软件管理包和可能使用到的依赖

(3)安装python3

(4)安装 django 

(5)安装 uwsgi 和 虚拟环境

1.安装 uwsgi

2. 安装virtualenv

3.在虚拟环境里再安装一次 uwsgi

(6)安装 nginx

(7)安装mysql

1.下载 rpm 包

2.mysql版本的选择和修改

3.正式安装 mysql 

4. 修改数据库的默认密码

二、将本地项目搬迁到服务器上

(1)导出项目依赖txt文件

(2)本地的项目打包,上传到云服务器

(3)解压项目,安装依赖

三、配置nginx代理转发和uwsgi

1.配置nginx

2. 配置uwsgi

 

一、服务器环境的搭建 

(1)更新系统软件包

yum update -y

(2)安装软件管理包和可能使用到的依赖

上面那一步执行完了之后,接着按顺序执行以下命令

yum -y groupinstall "Development tools"
yum install yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel

这一步完成之后,系统的配置就完了。接下来开始项目的搭建。

(3)安装python3

linux主要是用命令行操作的,常用的文件操作命令:

ls    // 用于显示当前目录下的所有文件和文件夹
cd    // 进入文件夹,如: cd /usr/home 
      // 特殊的:  cd / 是回到根目录下, cd ../ 是返回上一层

mkdir + 文件名    // 创建文件夹, 如:mkdir test (命令和内容中间要加空格)
rm    + 文件名或者文件夹名    // 删除文件或者文件夹
                             // 文件 rm -f /usr/local/log.txt -f是直接强行删除的意思
                             // 文件夹 rm -rf /usr/local/test -r是不管里面有多少级目录都删除

进入 local目录

cd /usr/local/

下载python3的安装包

wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz

完毕之后解压

tar -zxvf Python-3.7.4.tgz    // 注意Python是大写开头

解压完成之后,在当前目录会生成对应的文件夹,可使用 ls 查看,然后进入到刚才解压的文件夹里

cd Python-3.7.4

编译到指定的路径(路径可自己指定,但是要记得)

./configure --prefix=/usr/local/python3  // 后面的路径自己一定要记得, 后面需要和这里保持一致

这里 ./configure --prefix的意思是将该软件安装在 /usr/local/python3 下面。

make 执行编译
make install 执行安装
make clean 清除产生的临时文件
ln  创建软连接,相当创建快捷命令,可以直接调用

然后按顺序执行命令安装python3,此时的还是在 Python-3.7.4的目录下进行的。

编译并安装

make && make install

完成之后,建立一下软链接,这里的/usr/local/python3/就是上面指定好的路径了。这样就可以在终端中使用python3命令啦!

ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3

完成之后,检查一下 pip3 是否安装完成,并且一定要检查版本,pip3的版本号要和你本地项目的pip3版本要一致,或者高于本地的版本。否则可能会导致它不能去下载一些你在使用的依赖包。可以使用 -V 去查看对应的程序版本号。

新手玩家在Linux(centOS7)下部署Django项目的过程_第1张图片

可以看到,python3 和 pip3 的版本号分别为:3.7.4 和 20.0.2 和我本地使用的是一样的。

注意一点:centOS系统是自带了python的,版本可以自己查看,千万不要把他卸了!第一次搭建的时候,我脑抽把python卸了,就因为它和我的python3我觉得会冲突,但没想到它是yum的依赖。

(4)安装 django 

pip3 install django==2.2  // 指定django的2.2版本

安装完成之后,可以查看一下版本号是否正确

(5)安装 uwsgi 和 虚拟环境

1.安装 uwsgi

pip3 install uwsgi

// 完成后建立软链接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

接着,用cd命令返回到根目录下

创建两个新的文件夹,一个用于运行虚拟环境,一个用于存放自己的项目

mkpir -p /myself/virtual/    // 虚拟环境
mkpir -p /myself/website/    // 项目目录

2. 安装virtualenv

virtualenv用于创建虚拟环境,用来进行不同版本的项目管理

pip3 install virtualenv

建立软链接

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

进入到 /myself/virtual/ 目录下,创建虚拟环境

virtualenv --python=/usr/bin/python3 pyweb

完成之后会生成一个 pyweb文件夹,然后进入到文件夹里面,再进入  bin 文件夹里,启动虚拟环境:

source activate  // 退出虚拟环境的命令为 deactivate

看到如下,就已经启动了虚拟环境:

3.在虚拟环境里再安装一次 uwsgi

即系统上安装一次,在虚拟环境里也安装一次。

pip3 install uwsgi

(6)安装 nginx

找到一个目录,这里用的是home目录,下载nginx

wget http://nginx.org/download/nginx-1.13.7.tar.gz

下载完之后,解压:

tar -zxvf nginx-1.13.7.tar.gz

用 ls 看一下解压完成之后的文件夹,然后进入到文件夹里,依次执行

./configure
make && make install

nginx安装好了以后,一般默认的路径为/usr/local/nginx。

(7)安装mysql

1.下载 rpm 包

同样,这里还是进入 home 目录下(就是上面下载nginx的那个目录,可以自己指定别的),下载mysql

wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

注意,这是一个 rpm 的包,使用如下命令安装

rpm -ivh mysql80-community-release-el7-1.noarch.rpm

安装完了之后,就可以使用yum去安装mysql了。

2.mysql版本的选择和修改

在yum库中,有多个版本的MySQL,一般都是默认最新版本的mysql,其它版本的是禁用的。但是我们可以通过下面的命令来查看,有哪些版本。

yum repolist all | grep mysql

然后就可以看到下面的内容:

新手玩家在Linux(centOS7)下部署Django项目的过程_第2张图片

可以看到现在支持的mysql版本,并且8.0是属于enabled启用状态(红色部分),如果我们想要安装8.0版本直接安装即可。不过现在我们要安装的是5.7版本的,所以我们需要修改一下配置文件。

vim /etc/yum.repos.d/mysql-community.repo

用上面的命令打开配置文件之后,找到5.7 和 8.0 

新手玩家在Linux(centOS7)下部署Django项目的过程_第3张图片

按下键盘上的INSERT键 ,光标移动到5.7下面的enabled=0改为enabled=1,把8.0的enabled=1修改为enabled=0。然后按下键盘ESC,输入 :wq 回车,就保存了编辑之后的配置文件。然后,我们可以验证一下状态

yum repolist enabled | grep mysql

3.正式安装 mysql 

sudo yum install mysql-community-server

安装成功之后,启动Mysql:

sudo service mysqld start

结果:

然后查看一下启动状态:

sudo service mysqld status

新手玩家在Linux(centOS7)下部署Django项目的过程_第4张图片

说明启动成功了。

4. 修改数据库的默认密码

mysql在启动的时候,自动进行了初始化。密码比较复杂,建议修改一下,你能记住也行

通过命令:

sudo grep 'temporary password' /var/log/mysqld.log

可以看到系统默认的登录密码:

然后再输入命令:

mysql -u root -p

输入前面红圈圈起来的初始密码登录之后,再输入以下的命令:BY 后面跟着的是你自己修改后的密码

注意:密码必须是 大小写字母、数字、和特殊符号混合,不然会提示不符合要求。

ALTER USER 'root'@'localhost' IDENTIFIED BY 'NanFenggood.520';

mysql全部安装完毕!!!

二、将本地项目搬迁到服务器上

(1)导出项目依赖txt文件

在本地的项目目录下,就是可以看到manage.py的那一层,调出控制台,输入命令:

pip freeze > requirements.txt

(2)本地的项目打包,上传到云服务器

我是通过控制台的 scp 命令(好像是win10内置的,不知道10以下有没有)把文件上传到服务器的,要是有别的什么更好用的方式也可以交流一下嗷(secureCRT?Xshell?)。我暂时是这么用的...

// scp -r 需要上传的文件所在的路径 root@服务器的公网ip:上传到那个文件夹下
// 如:

scp -r D:/PythonTest/freeSite.zip root@服务器的公网ip:/myself/website

这里应该是会有个提示的,具体内容忘记了,大概是生成一个密钥之类的,yes一下就好了

然后输入登录服务器的密码。就上传成功了

如果后期重置了自己的服务器,这里再使用scp命令传输文件的时候,会报错,因为密钥不一致了。 

密钥在本地:C:\Users\你电脑的用户名\.ssh\known_hosts 里

打开文件可以看到某一行有自己的服务器ip地址,还有后面一长串奇奇怪怪的东西

这一行直接删掉,然后再去重新执行一下scp命令就好了

(3)解压项目,安装依赖

cd /myself/website/ 进入到压缩包所在目录,解压

unzip freeSite.zip    // 后面是你自己项目压缩包的文件名

然后cd进入到项目文件夹目录下,安装依赖

pip3 install -r requirements.txt

如果不报错,皆大欢喜,如果报错了(反正我自己在安装的时候就报错了),大概报错的是:

complate output from command python setup.py egg_info

.......

OSError: mysql_config not found

原因是linux需要mysql相关的一些依赖包,安装一下:

yum install mysql-devel gcc gcc-devel python-devel

这几个依赖安装完成之后,再重新安装requirements.txt里的依赖就好了。

如果还报错,错误里有 mysqlclient 这类的字样,应该就是只是mysqlclient版本资源的问题,实在不行,安装的时候,指定一下mysqlclient版本号再试试。

由于我是自己在本地新写的项目,再部署上去的,数据库没什么东西,只需要在服务器上新建一个同名数据库,然后在项目目录下执行下面的命令,更新一下模板就好了。

python manage.py makemigrations
python manage.py migrate

把settings.py文件里面的数据库配置一下,把账号和密码还有端口都填一下就好了。

再把settings.py文件里几个配置项修改一下:

1、关闭debug模式。

DEBUG = False 

2、ALLOWED_HOSTS设置为* 表示任何IP都可以访问网站。

ALLOWED_HOSTS = ['*']

然后尝试着跑一下项目试一试。

python manage.py runserver

如果报错了,先排除看看是不是数据库的原因,找到项目下的 settings.py 文件,把里面DATABASES配置连接数据库的代码先注释掉 ,再运行一下,如果可以运行,那就是数据库的问题,再去处理。如果注释掉也不能运行,往上去找,看哪一步有问题。

如果成功运行,能够看到项目运行在那个地址和端口下,最后就只需要再配置一下 nginx 和 uwsgi 就可以让外网通过自己的服务器ip地址来访问项目了。

三、配置nginx代理转发和uwsgi

1.配置nginx

之前已经下载好了nginx,它被默认安装在了 /usr/local/nginx 下,现在进入到这个目录下,再进入到conf目录下,打开nginx.conf文件,把所有内容都删除,重新输入以下内容:

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen 80;
        server_name  127.0.0.1:80; #有域名的话用域名, 没域名修改为127.0.0.1:80
        charset utf-8;
        location / {
           include uwsgi_params;
           uwsgi_pass 127.0.0.1:8050;  #这里的端口要和后面配置uwsgi.xml里配置的一样
           uwsgi_param UWSGI_SCRIPT freeSite.wsgi;  #wsgi.py所在的目录名.wsgi
           uwsgi_param UWSGI_CHDIR /myself/website/freeSite/; #项目路径
           
        }
        location /static/ {
            alias /myself/website/freeSite/static/; #静态资源路径
        }
    }
}

配置的时候注意看后面的注释。配置完之后,进入到  /usr/local/nginx/sbin/  目录下,执行命令:

./nginx

如果终端没有提示什么的话,就算是nginx启动成功。

2. 配置uwsgi

我们可以通过 XML  文件来进行配置

进入到自己的项目目录下,就是有manage.py的那一层,创建一个  uwsgi.xml 文件,输入一下的内容:

    
   127.0.0.1:8050  
   /myself/website/freeSite/             
   freeSite.wsgi   
   4      
   uwsgi.log 

保存,然后启动uwsgi

#启动uwsgl
uwsgi -x uwsgi.xml

#uwsgi有没有启动成功,可以用下面的命令查看
ps -ef|grep uwsgi
#如果想重启uwsgi,先使用下面的命令杀掉进程,再启动uwsgi
killall -9 uwsgi

看到如下这样的状态就是成功启动了的。

最后一步!

在阿里云服务器的实例安全组里,配置一下安全组规则,如下:

新手玩家在Linux(centOS7)下部署Django项目的过程_第5张图片

大功告成!!

文章比较长,可能会有不足的地方或者bug,还请多多指教,一起交流


2020.4.10 新增:linux 修改 mysql 字符集为 utf8 的方法

虽然上面网站搭建成功了,但是在进行接口数据传输的时候,发生了向后台发送中文字符时无法写入数据库的问题,解决如下:

1. 登录mysql之后,通过命令 show variables like "%character%"; 可以查看当前使用的数据库的字符集,查看 character_set_server 字段是否是 utf-8;若不是则需要修改。(ps: 如果是,那就看下py文件首行是否声明了ecoding: utf-8 之类的)

2、找到 my.cnf 文件,然后在[mysqld]那一块的最下面添加一行:
character-set-server = utf8;

3、重启数据库服务 service mysqld restart

4、修改表的字符集 alter table 表名 convert to character set utf8 collate utf8_general_ci;

你可能感兴趣的:(python自学)