Flask项目部署记录!




部署基于ubuntu 16.04系统,使用 Gunicorn + Nginx 进行布署,云服务器为阿里云

匆匆忙忙敲完了这个 新经资讯 的项目, 经过一番折腾,终于把项目部署到了服务器上,这里来记录一下部署流程以及踩的坑。




配置服务器

在这里使用了阿里云的免费的一个月的服务器,毕竟穷,而且这也不是什么大项目,等以后再弄好的

申请完服务器,进入控制台, 查看实例创建情况

1540466092390

给安全组配置规则,添加5000端口(一并加上5001端口),应该就是设置哪些端口可以访问

注意:要添加上 80 端口,不然无法访问


登录

使用命令行进行远程登录

ssh 用户名@ip地址

不同公司的服务器有不同的用户名,阿里的默认是 root,ip 地址在服务器实例详情页就可以看见。

登录会提示输入密码,但是此时并没有配置密码,所以会一直登录失败,需要去设置一个密码:

设置了密码可能需要在控制台中重启服务器再进行远程登录

重新登录;

这就是个远程的 linux 服务器,没有图形界面,纯命令行操作




配置环境

连接上服务器后就需要对项目运行的环境进行相关的配置

  • 先更新 apt 相关源
sudo apt-get update
  • mysql安装
apt-get install mysql-server
apt-get install libmysqlclient-dev
  • redis安装
sudo apt-get install redis-server
  • 安装虚拟环境
pip install virtualenv
pip install virtualenvwrapper
  • 使得安装的virtualenvwrapper生效,编辑~/.bashrc文件,内容如下:
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh
  • 使编辑后的文件生效
source ~/.bashrc

在这里其实可以不用创建虚拟环境,直接使用就行,但是为了区别还是创建一下,注意一定要指定 python3 这个版本,不然在后面运行时会出错

# 创建虚拟环境
mkvirtualenv -p python3 py3_flask
workon py3_flask



上传项目

因为项目是使用的 git 进行了管理,也在 GitHub 和 Gitee 上进行了上传,直接克隆一份即可

  • 安装 git
sudo apt-get install git
  • 克隆仓库:
git clone https://gitee.com/QYFabc/Information.git



requirements文件

运行项目需要很多配置库,但是一个个下载又很慢,使用下面的方法可以快速对配置库进行下载安装。

Python 项目中可以包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号,以便在新环境中进行部署操作。

  • 在虚拟环境使用以下命令将当前虚拟环境中的依赖包以版本号生成至文件中:
pip freeze > requirements.txt
  • 当需要创建这个虚拟环境的完全副本,可以创建一个新的虚拟环境,并在其上运行以下命令:
pip install -r requirements.txt
  • 在安装 Flask-MySQLdb 的时候可能会报错,可能是依赖包没有安装,执行以下命令安装依赖包:
sudo apt-get build-dep python-mysqldb
遇到的问题

因为项目是在 windows 环境中进行开发的,所有有些库不一样,在安装 Flask-MySQLdb 和 mysqlclient 这两个库时报错,在这里我谷歌了下,使用了下面两个命令来解决

sudo apt-get install python-dev libmysqlclient-dev
sudo apt-get install python3-dev



数据的准备

  • 进入 mysql 数据库,创建新闻仓库
mysql -u用户名 -p密码

show databases;

create database information04 charset utf8;
  • 执行数据库迁移:

先退出数据库,进入项目的文件路径,执行下面的命令进行数据库迁移,创建数据表

python manage.py db init

python manage.py db migrate -m"initial"

python manage.py db upgrade
  • 查看数据库表是否创建完成
show tables;
  • 拷贝本地文件到远程
scp -r 本地文件路径 [email protected]:远程保存路径

将测试数据 sql 文件使用该命令上传到服务器中

使用命令 source 文件路径 , 将数据添加到数据库中

source 路径/information_info_category.sql
source 路径/information_info_news.sql



负载均衡 Nginx

  • 采用 C 语言编写
  • 实现分流、转发、负载均衡
相关操作
  • 安装
$ sudo apt-get install nginx
  • 运行及停止
/etc/init.d/nginx start #启动
/etc/init.d/nginx stop  #停止
  • 配置文件
      • 编辑文件:/etc/nginx/sites-available/default
# 如果是多台服务器的话,则在此配置,并修改 location 节点下面的 proxy_pass 
upstream flask {
        server 127.0.0.1:5000;
        server 127.0.0.1:5001;
}
server {
        # 监听80端口
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # 请求转发到gunicorn服务器
                proxy_pass http://127.0.0.1:5000;
                # 请求转发到多个gunicorn服务器
                # proxy_pass http://flask;
                # 设置请求头,并将头信息传递给服务器端 
                proxy_set_header Host $host;
                # 设置请求头,传递原始请求ip给 gunicorn 服务器
                proxy_set_header X-Real-IP $remote_addr;
        }
}



Gunicorn

  • Gunicorn(绿色独角兽)是一个Python WSGI的HTTP服务器
  • 从Ruby的独角兽(Unicorn )项目移植
  • 该Gunicorn服务器与各种Web框架兼容,实现非常简单,轻量级的资源消耗
  • Gunicorn直接用命令启动,不需要编写配置文件
相关操作
  • 安装
pip install gunicorn
  • 查看选项
gunicorn -h
  • 运行
# -w: 表示进程(worker) -b:表示绑定ip地址和端口号(bind)
# 如果想在服务器运行起来后不影响其他操作,加上参数 -D  即可 
gunicorn -w 2 -b 127.0.0.1:5000 运行文件名称:Flask程序实例名

gunicorn -w 2 -b 127.0.0.1:5000 manage:app
  • 碰见的错误

在执行完命令后一直运行不起来,观察后发现是 gunicorn 找没有找到 python3 执行程序,一直在以 python2 来执行程序。

谷歌了半天,也没有找到合适的解决方案,最后重新创建虚拟环境来解决了这个问题,创建虚拟环境时一定要注意指定 python3 这个版本!




Nginx、Gunicorn在服务器中分别起什么作用?

Nginx 是专业的服务器,性能更好,更专业,并发更高,可以做负载均衡,可以做静态文件缓存,还可以限制 ip 访问的频率等等。


Gunicorn 一般用来管理多个进程,有进程挂了Gunicorn可以把它拉起来,防止服务器长时间停止服务,还可以动态调整 worker 的数量,请求多的时候增加 worker 的数量,请求少的时候减少,这就是所谓的 pre-fork 模型,这貌似就是它的主要优点。(worker 貌似就是进程,不是很确定,因为我们在使用的过程中没有发现进程数量有变化。。。)
也可以用 supervisor 来启动 Gunicorn,这样即使Gunicorn 的管理进程挂了也可以自动起来




网站的 ip 地址是 [http://39.107.233.84], 想着加个域名,折腾半天申请了域名,也就使用了 10 分钟,就告诉我需要备案,而且服务器必须买了三个月以上才行,好气啊!!!

就不写域名如何申请了。。。

至此,项目算是完整结束了,也可以通过外网访问了,总的来说还算可以吧,毕竟也算是一个完整的项目。

不过感觉还是不是很到位,很多东西并没有记住,得好好搞一下。

猜你喜欢

转载自blog.csdn.net/qyf__123/article/details/83387220