部署基于ubuntu 16.04系统,使用 Gunicorn + Nginx 进行布署,云服务器为阿里云
匆匆忙忙敲完了这个 新经资讯 的项目, 经过一番折腾,终于把项目部署到了服务器上,这里来记录一下部署流程以及踩的坑。
在这里使用了阿里云的免费的一个月的服务器,毕竟穷,而且这也不是什么大项目,等以后再弄好的
- 选择云服务器:阿里云服务器 https://www.aliyun.com
- 个人免费获取 [https://free.aliyun.com/]
- 创建服务器选择ubuntu16.04 64位的操作系统
申请完服务器,进入控制台, 查看实例创建情况
给安全组配置规则,添加5000端口(一并加上5001端口),应该就是设置哪些端口可以访问
注意:要添加上 80 端口,不然无法访问
使用命令行进行远程登录
ssh 用户名@ip地址
不同公司的服务器有不同的用户名,阿里的默认是 root,ip 地址在服务器实例详情页就可以看见。
登录会提示输入密码,但是此时并没有配置密码,所以会一直登录失败,需要去设置一个密码:
设置了密码可能需要在控制台中重启服务器再进行远程登录
重新登录;
这就是个远程的 linux 服务器,没有图形界面,纯命令行操作
连接上服务器后就需要对项目运行的环境进行相关的配置
sudo apt-get update
apt-get install mysql-server
apt-get install libmysqlclient-dev
sudo apt-get install redis-server
pip install virtualenv
pip install virtualenvwrapper
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 上进行了上传,直接克隆一份即可
sudo apt-get install git
git clone https://gitee.com/QYFabc/Information.git
运行项目需要很多配置库,但是一个个下载又很慢,使用下面的方法可以快速对配置库进行下载安装。
Python 项目中可以包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号,以便在新环境中进行部署操作。
pip freeze > requirements.txt
pip install -r requirements.txt
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 -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
- 采用 C 语言编写
- 实现分流、转发、负载均衡
$ sudo apt-get install nginx
/etc/init.d/nginx start #启动
/etc/init.d/nginx stop #停止
# 如果是多台服务器的话,则在此配置,并修改 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;
}
}
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 是专业的服务器,性能更好,更专业,并发更高,可以做负载均衡,可以做静态文件缓存,还可以限制 ip 访问的频率等等。
Gunicorn 一般用来管理多个进程,有进程挂了Gunicorn可以把它拉起来,防止服务器长时间停止服务,还可以动态调整 worker 的数量,请求多的时候增加 worker 的数量,请求少的时候减少,这就是所谓的 pre-fork 模型,这貌似就是它的主要优点。(worker 貌似就是进程,不是很确定,因为我们在使用的过程中没有发现进程数量有变化。。。)
也可以用 supervisor 来启动 Gunicorn,这样即使Gunicorn 的管理进程挂了也可以自动起来
网站的 ip 地址是 [http://39.107.233.84], 想着加个域名,折腾半天申请了域名,也就使用了 10 分钟,就告诉我需要备案,而且服务器必须买了三个月以上才行,好气啊!!!
就不写域名如何申请了。。。
至此,项目算是完整结束了,也可以通过外网访问了,总的来说还算可以吧,毕竟也算是一个完整的项目。
不过感觉还是不是很到位,很多东西并没有记住,得好好搞一下。