基于Ubuntu+Flask+uWSGI+Nginx部署Python项目

前言

前几天,我使用Python的Flask框架写了一个简单的API接口,没有写前端页面,只是返回一个json数据,基本就是实现一个网课题目查询答案的功能,用到了MySQL数据库用来存放题库,在本地测试运行正常,于是在这个清明假期期间,就想把这个项目部署到服务器,其主要目的就是想学习体验下如何将本地的代码部署到服务器去运行

为了自己后期可以参考此次实践的经验,于是就想写篇文章详细记录一下部署的整个过程,希望这篇文章也可以帮助到你,同时更希望大佬对部署过程中的问题给我提出宝贵意见。

在开始之前,我再次说明一下这篇文章的主要目的是体验学习如何将本地的Python项目部署到服务器上,即使没有项目,就写个Hello World!也可以按照这篇文章尝试实践!

话不多说,开干!

项目准备

1.自己使用Flask框架编写的Python代码,也就是需要部署到服务器的项目.

2.服务器准备,在这里推荐阿里云的ECS服务器,或是腾讯云,百度智能云的都可以。ps:几乎每个服务器的厂商对于大学生都有一定的优惠活动,差不多百元之内就可以买到一台云服务器。

3.Xshell 工具 用于远程连接服务器发送Linux命令

 

友情提示:由于我们的主要目的是要学习如何将本地编写的python flask项目代码去部署到云服务器去运行这一个过程,所以对项目、服务器性能配置没有太高要求。

演示环境

服务器环境:Linux Ubuntu_18.04_64

数据库环境:MySQL

Python环境:Python 3.6

过程步骤

0.几点提示
1.将本地项目文件推送到远程仓库
2.Xshell连接至服务器
3.配置服务器环境
4.配置MySQL
5.下载远程仓库项目文件至服务器
6.运行项目
7.问题处理
8.配置uwsgi
9.个人体会

0.几点提示

  • 1.演示服务器为Linux Ubuntu_18.04_64,如果你的服务器环境与此不同,在按照以下步骤进行部署时容易出现各种问题
  • 2.对于完全不会使用的新手,输入完一个命令记得按一下回车键
  • 3.端正心态,遇到问题不要慌,大不了重新开始就行

1.将本地项目文件推送到远程仓库

这里我使用的国内的gitee码云平台,也可以使用GitHub。
首先去注册一个码云账号,并创建一个仓库,在这里具体实现过程不再赘述。
然后就是要将本地的文件推送到远程的Gitee仓库首先就需要安装Git。
安装分为以下几个步骤:
1.下载Git
下载地址:https://git-scm.com/
2.安装
Mac OS和Windows下都是安装程序,直接安装就行了,Linux下可以通过命令直接从仓库安装(PS:Linux不同发行版本安装命令不一样,这里不再赘述)。
安装完成之后在终端输入git --version,如果输出了版本号,那么就表示安装成功了。

git安装验证

安装git工具后在项目文件夹内右键找到Git Bash Here点击即可打开git命令输入窗口。如下图:
打开git命令输入窗口

然后依次输入以下git命令:

git init  #在本地项目文件夹中使用git命令初始化为git仓库
git add .  #添加至暂存区
git commit -m 'first commit'  #提交到本地仓库
git remote add origin http://你的远程仓库地址  #关联远程仓库
git push origin master  #推送至远程仓库的master分支

此时刷新你的码云远程仓库,已经有了你的项目文件。 暂时不需要管他了,下面去连接服务器部署各种环境。

2.Xshell连接至服务器

在这里我选择连接远程服务器的软件是Xshell,你也可以使用其他的,或者是阿里云等平台提供在线的远程连接。我这里以Xshell作为演示。
首先去下载安装Xshell软件,在这里不再赘述。安装完毕后打开软件,进行连接远程服务器。
然后去阿里云平台找到你的服务器公网IP复制下来,打开Xshell->文件新建->输入会话名称、主机(也就是刚才复制的公网IP)点击确定。在左侧会话列表找到它右键打开,按照提示输入名称(一般为root)密码即可进行连接。
最后确认连接服务器成功!出现以下界面:
linkserver

远程服务器连接成功后,准备工作结束,开始头疼的服务器环境搭建的环节吧

3.配置服务器环境

在开始之前,首先告诉大家在这个环节极易出现各种问题,可能是服务器镜像系统版本不一致造成,也可能是个人操作不当造成,大家一定要及其小心,不过在遇到问题时,千万不要慌,大不了重装镜像系统重新再来就是!开始吧
因为我是以root用户进行登录的,所以在执行以下部分命令时可以不加sudo
1.检查当前所在目录是否在家目录

pwd

通常Linux系统在连接后均是在家目录即:
root@1Hl0GO4WLS:~# 波浪线目录

2.检查系统自带python环境

python 
python3

python环境
可以看到我的服务器安装的是python3.5.

3.检查是否安装有pip包管理工具

pip3 list # 查看安装的包
或
pip3 -V # 查看版本

如果提示没有安装,输入安装命令进行安装包管理工具。

sudo apt install python3-pip

中间如果报错:

安装pip3报错

输入命令进行升级软件源

sudo apt-get update

update

更新之后重新安装pip3包管理工具,安装后检查是否正确安装,如下图所示,表示安装成功。
pip3

4.安装virtualenv包

sudo pip3 install virtualenv

virtualenv
5.安装virtualenvwrapper包

sudo pip3 install virtualenvwrapper

virtualenvwrapper

6.确认安装包及其位置
此命令非必要执行,仅用于查看安装包的位置及其信息。

pip3 show virtualenvwrapper # virtualenvwrapper为包名

show

7.为项目配置python虚拟环境
1.首先需要编辑家目录下的.bashrc文件,使用vi编辑器编辑,具体vi编辑相关内容在这里不再赘述。
使用vi编辑器打开.bashrc文件:

vi .bashrc

打开后按键i开启输入模式,ctrl+f键下一页至最后一页,在最后添加以下内容:

export WORKON_HOME=$HOME/.virtualenvs
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

输入后按键esc,键入:x保存退出即可
2.执行配置信息

source ~/.bashrc

出现以下内容为配置虚拟环境成功。

vi配置虚拟环境

8.创建虚拟环境目录

mkvirtualenv --python=/usr/bin/python3 wkct

创建后进入虚拟环境文件夹,出现以下信息:

mkdir创建虚拟环境

9.启动虚拟环境

cd virtualenvs/
workon wkct

workon启动虚拟环境

10.创建项目文件夹
进入/srv目录,创建项目文件夹demo

cd /srv
mkdir demo

intosrv

创建后进入demo目录:

cd demo

intodemo

到这里,服务器python环境配置完成,接下来要进行配置MySQL数据库.

4.配置MySQL

如果你的项目没有用到MySQL数据库,则可以跳过这一步,在这里是给服务器进行安装MySQL数据库环境。
1.安装MySQL

sudo apt install mysql-server

安装mysql

2.配置MySQL

sudo mysql_secure_installation

具体配置内容及选项见下图:

配置mysql

3.root用户登录MySQL

sudo mysql -u root -p

-u 表示选择登陆的用户名, -p 表示登陆的用户密码,输入后就能够进入mysql数据库。
然后通过 show databases; 就可以查看当前的所有数据库。

连接mysql

4.创建query数据库

create database query;

creaate database

5.添加题库数据表

# 使用数据库
use query;
# 查看数据库中的数据表
show tables;
# 添加.sql数据库文件到query数据库
source /srv/demo/tk.sql;

到这里MySQL数据库就配置完成了,并且将题库添加到了数据库query中。

5.下载远程仓库项目文件至服务器

首先cd到刚才创建的项目文件夹。

cd /srv/demo

使用git工具下载远程仓库的项目文件,此时因为服务器还没有安装git工具,所以先安装git.

apt install git

安装后在demo项目文件夹内依次执行以下命令即可克隆远程仓库至服务器。

git init # 把demo 初始化为git仓库
git remote add origin http://你的远程仓库地址 #添加远程仓库地址 
git pull origin master #拉远程仓库到本地

克隆远程仓库

此时去查看demo文件下已经有了自己的项目文件。

6.运行项目

如果此时去访问你的服务器IP会出现这种页面:

404

在运行项目之前需要开启nginx服务:

sudo apt install nginx

安装好Nginx后,系统会默认创建一个目录“/var/www/html”,若通过公网ip地址能够看到一个大写的Nginx界面就说明成功了

nginx

然后cd 到demo目录下使用python3 解释器执行项目。

cd /srv/demo
python3 wkct.py

此时你会发现报错了,并没有启动成功,是因为你的项目代码里的依赖包没有安装,使用pip3依次下载安装各种依赖包即可。

# 安装代码所需要的python第三方库
pip3 install pymysql
pip3 install flask

安装代码所需要的python第三方库

安装成功后重新运行项目!

运行项目

项目运行成功后,却发现在自己电脑还不可以进行访问,这时需要修改项目文件wkct.py

vi wkct.py

将代码修改为:

if __name__ == '__main__':
   app.run(host='0.0.0.0')

表示任何主机IP都可以访问。重新运行项目即可:

运行项目2

7.问题处理

问题1
在运行项目时如果出现以下错误,原因可能是未能连接到数据库。

bug1

以上问题解决办法:

sudo mysql -u root # 以root身份进入MySQL
mysql> USE mysql;  #使用mysql数据库
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root'; # 修改为不需要密码
mysql> FLUSH PRIVILEGES;
mysql> exit;
service mysql restart  #重新启动mysql

依次执行完成后,需要再修改一下项目文件的代码:

conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',  # 用户名
    password='',  # 密码
    database='query',  # 数据库的名字
    charset='utf8')

即把密码修改为“”,重新运行项目即可

问题2

项目部署完成运行后,本地访问发现返回数据错误!

bug2

通过检查运行日志发现问题是数据库连接失败!
解决办法:

linux的mysql区分大小写,数据库中的表名与输入的sql语句中的使用的表名大小写不一致导致的

需要把代码里的数据库表名修改为小写即可!

8.配置uwsgi

项目跑起来后你会发现是这样的提示信息:

root@1Hl0GO4WLS:/srv/demo# python3 wkct.py 
 * Serving Flask app "wkct" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

WARNING: This is a development server. Do not use it in a production deployment.
警告:这是一个开发服务器。不要在生产部署中使用它。
此时我们需要去使用uswgi服务器。
flask未使用 WSGI 启动,所以使用wsgi启动就行了

pip install uwsgi

uswgi

通过以上命令安装uwsgi,然后需要在项目文件夹里新建一个uswgi配置文件

cd /srv/demo
touch uswgi.ini

完成创建后需要使用vi编辑器进行写入配置信息

[uwsgi]

#项目的路径
chdir = /srv/demo/
# Flask的uwsgi文件
wsgi-file = /srv/demo/wkct.py
#回调的app对象
callable =app
#Python虚拟环境的路径
home = /root/.virtualenvs/wkct
#进程相关的设置
#主进程
master=true
#最大数量的工作进程
processes = 10
http = :5000

写入完成后,启动uswgi服务
uswgi2

# 启动运行uwsgi
uwsgi --ini uwsgi.ini

启动uwsgi

 

到这里,恭喜你,你的项目部署工作就结束啦!

9.个人体会

第一次的项目部署实战体验,中间遇到了许许多多的问题,直到部署运行跑起来,应该也还有许多没有发现的问题,在程序员编程这条路上,这也才是刚刚开始,通过这次的实战部署项目,使我感到了自己的基础知识太过于薄弱,在以后的时间里要加强理论与实践相结合,努力提高自己的编程能力,在实践过程中,心情只有两种:0和1;0代表崩溃,1代表惊喜。最后就是写的这篇文章可能有表达不清晰的地方,甚至有出错的地方,欢迎大佬给我指正,WX 2410685763

写在最后

感谢你的阅读,希望这篇文章对你有所帮助!
推荐关注:青年之学
我的博客:https://yjs0612.gitee.io/
我的站点:http://dh.imyjs.xyz/

推荐关注

微信公众平台:青年之学

阅读剩余
THE END