部署flask项目时,通常都是使用WSGI应用服务器搭配Nginx作为反向代理实现的。常用的WSGI服务器有gunicorn和uwsgi,本项目将使用Nginx反向代理搭配gunicorn实现flask项目的部署。
python3安装
centos7原本就安装了Python2,而且不能被删除,因为可能有程序如yum依赖python2环境。
输入python命令,查看可知centos7自带的是python2.7.5版本。输入“which python”可以查看python所在的位置,一般是位于/usr/bin/python目录下。
[root@iZf8zi7rsmqdun3dyxb7cfZ ~]# which python
/usr/bin/python
下面介绍安装python3的方法
- 首先安装依赖包
[root@iZf8zi7rsmqdun3dyxb7cfZ ~]# 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
- 下载python3安装包,在/usr/local目录下新建一个python3目录,将安装包上传到 /usr/local/python3 目录后解压
[root@iZf8zi7rsmqdun3dyxb7cfZ ~]# mkdir /usr/local/python3
[root@iZf8zi7rsmqdun3dyxb7cfZ ~]# cd /usr/local/python3
[root@iZf8zi7rsmqdun3dyxb7cfZ python3]# tar -xvf Python-3.6.2.tar.xz
- 编译安装
[root@iZf8zi7rsmqdun3dyxb7cfZ python3]# cd Python-3.6.2
[root@iZf8zi7rsmqdun3dyxb7cfZ python3]# ./configure --prefix=/usr/local/python3
[root@iZf8zi7rsmqdun3dyxb7cfZ python3]# make && make install
- 创建软连接
[root@iZf8zi7rsmqdun3dyxb7cfZ Python-3.6.2]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
报错:
[root@iZf8zi7rsmqdun3dyxb7cfZ Python-3.6.2]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln: failed to create symbolic link ‘/usr/bin/python3’: File exists
解决方法:ln -s 加一个 f 即可
[root@iZf8zi7rsmqdun3dyxb7cfZ Python-3.6.2]# ln -sf /usr/local/python3/bin/python3 /usr/bin/python3
- 将/usr/local/python3/bin加入PATH
# vim ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/local/python3/bin
export PATH
- 按ESC输入:wq回车退出,修改完执行下面的命令,让上一步的修改生效
[root@iZf8zi7rsmqdun3dyxb7cfZ Python-3.6.2]# source ~/.bash_profile
- 检查python3及pip3是否正常可用,如果输出版本号就成功啦
[root@iZf8zi7rsmqdun3dyxb7cfZ Python-3.6.2]# python3 -V
Python 3.6.2
[root@iZf8zi7rsmqdun3dyxb7cfZ Python-3.6.2]# pip3 -V
pip 9.0.1 from /usr/local/python3/lib/python3.6/site-packages (python 3.6)
pip3安装(可不装)
丰富的第三方库是python的优势所在,为了更加方便的安装第三方库,使用pip命令,我们需要进行相应的安装。
- 安装pip前需要前置安装setuptools
[root@iZf8zi7rsmqdun3dyxb7cfZ python3]# mkdir setuptools
[root@iZf8zi7rsmqdun3dyxb7cfZ python3]# cd setuptools
[root@iZf8zi7rsmqdun3dyxb7cfZ setuptools]# ls
setuptools-19.6.tar.gz
[root@iZf8zi7rsmqdun3dyxb7cfZ setuptools]# tar -xvf setuptools-19.6.tar.gz
[root@iZf8zi7rsmqdun3dyxb7cfZ setuptools]# cd setuptools-19.6
[root@iZf8zi7rsmqdun3dyxb7cfZ setuptools-19.6]# python3 setup.py build
[root@iZf8zi7rsmqdun3dyxb7cfZ setuptools-19.6]# python3 setup.py install
- 安装pip
[root@iZf8zi7rsmqdun3dyxb7cfZ python3]# mkdir pip3
[root@iZf8zi7rsmqdun3dyxb7cfZ python3]# cd pip3
[root@iZf8zi7rsmqdun3dyxb7cfZ pip3]# ls
pip-8.0.2.tar.gz
[root@iZf8zi7rsmqdun3dyxb7cfZ pip3]# tar -xvf pip-8.0.2.tar.gz
[root@iZf8zi7rsmqdun3dyxb7cfZ pip3]# cd pip-8.0.2
上传数据
开放3306端口和5000端口: 进入阿里云控制台 --> 点击云服务器ECS --> 点击左侧的安全组 --> 点击创建安全组
选择入方向,手动添加3306端口和5000端口
项目文件
数据库文件
在做毕设项目的时候,我把所有的疫情数据都放到了本地MySQL数据库中,要完成项目的部署,得把本地数据库中的数据上传到服务器的数据库中。前提:我的服务器已经装了MySQL;可使用宝塔面板进行操作,也可在终端输入命令。
- 导出本地数据库sql文件
- 进入宝塔面板,点击数据库 – > 添加数据库 --> 输入数据库名
- 点击导入
- 本地上传sql文件
- 导入成功
linux中mysql常用命令
启动mysql服务:
service mysqld start
查看mysql运行状态:
service mysqld status
查看mysql的运行使用的进程
ps -ef |grep mysql
登录本机mysql数据库:
mysql -u root -p
-->enter:输入密码
停止mysql服务:
service mysqld stop
重启mysql服务:
service mysqld restart
Nginx简述
Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明Nginx能支持高达 50,000 个并发连接数。
正向代理
正向代理指在客户端(浏览器)配置代理服务器,通过代理服务器进行指定网站访问。
反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
负载均衡
增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,从而降低原来单个服务器的压力。
Nginx安装
安装pcre依赖
- 进入 src 目录,联网下载 pcre 安装包依赖
[root@iZf8zi7rsmqdun3dyxb7cfZ ~]# cd /usr/src
[root@iZf8zi7rsmqdun3dyxb7cfZ src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
- 解压 pcre 安装包
[root@iZf8zi7rsmqdun3dyxb7cfZ src]# tar -xvf pcre-8.37.tar.gz
- 进入 pcre 解压后的文件目录
[root@iZf8zi7rsmqdun3dyxb7cfZ src]# cd pcre-8.37
- 编译安装
[root@iZf8zi7rsmqdun3dyxb7cfZ pcre-8.37]# ./configure
[root@iZf8zi7rsmqdun3dyxb7cfZ pcre-8.37]# make && make install
- 查看 pcre 版本
[root@iZf8zi7rsmqdun3dyxb7cfZ pcre-8.37]# pcre-config --version
安装其他依赖
安装openssl 、zlib、gcc依赖
[root@iZf8zi7rsmqdun3dyxb7cfZ pcre-8.37]# yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
安装Nginx
- 先开放80端口:进入阿里云控制台 --> 点击云服务器ECS --> 点击左侧的安全组 --> 点击创建安全组
选择入方向,手动添加80端口
- 将 nginx-1.12.2.tar.gz 安装包上传到 src 目录后解压,也可以去下载想要的 Nginx 安装包
[root@iZf8zi7rsmqdun3dyxb7cfZ src]# ls
nginx-1.12.2.tar.gz pcre-8.37 pcre-8.37.tar.gz
[root@iZf8zi7rsmqdun3dyxb7cfZ src]# tar -xvf nginx-1.12.2.tar.gz
- 进入 Nginx 解压后的文件目录
[root@iZf8zi7rsmqdun3dyxb7cfZ src]# cd nginx-1.12.2
- 编译安装
[root@iZf8zi7rsmqdun3dyxb7cfZ nginx-1.12.2]# ./configure
[root@iZf8zi7rsmqdun3dyxb7cfZ nginx-1.12.2]# make && make install
- Nginx 安装成功后在 usr/local/ 目录下会多一个 nginx 目录
[root@iZf8zi7rsmqdun3dyxb7cfZ local]# ls
aegis bttomcat games lib64 man sbin webserver
bin curl include libexec nginx share zend
btjdk etc lib libiconv openssl src
- 在 nginx 目录下的 sbin 目录有启动脚本
[root@iZf8zi7rsmqdun3dyxb7cfZ local]# cd nginx
[root@iZf8zi7rsmqdun3dyxb7cfZ nginx]# ls
conf html logs sbin
[root@iZf8zi7rsmqdun3dyxb7cfZ nginx]# cd sbin
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# ls
nginx
- 启动 nginx,查看进程
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# ./nginx
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# ps -ef | grep nginx
root 6511 1 0 13:57 ? 00:00:00 nginx: master process ./nginx
nobody 6512 6511 0 13:57 ? 00:00:00 nginx: worker process
root 6529 6405 0 13:58 pts/0 00:00:00 grep --color=auto nginx
- 访问公网地址47.113.197.40,nginx终于安装成功啦✿✿ヽ(°▽°)ノ✿
Nginx 常用命令
使用nginx操作命令前提条件:必须进入nginx的目录(/usr/local/nginx/sbin)
- 查看nginx的版本号
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# ./nginx -v
nginx version: nginx/1.12.2
- 启动nginx
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# ./nginx
- 停止nginx,进程没啦
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# ./nginx -s stop
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# ps -ef | grep nginx
root 6804 6405 0 14:23 pts/0 00:00:00 grep --color=auto nginx
- 重新加载nginx
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# ./nginx -s reload
问题:
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# ./nginx -s reload
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
解决方法:
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
- 杀死进程
[root@iZf8zi7rsmqdun3dyxb7cfZ sbin]# kill -9 6511(进程号)
Nginx配置文件
nginx配置文件位置
nginx配置文件组成
第一部分:全局块
从配置文件开始到 events 块之间的内容,会设置一些影响 Nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
worker_processes 1;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
第二部分:events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
worker_connections 1024;
如上代码表示每个 work process 支持的最大连接数为 1024。
第三部分:http块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。
修改配置文件
记得修改完配置文件,需要重新加载一下配置文件~
[root@iZf8zi7rsmqdun3dyxb7cfZ ~]# /usr/local/nginx/sbin/nginx -s reload //重新加载
gunicorn
- 安装gunicorn
[root@iZf8zi7rsmqdun3dyxb7cfZ ~]# pip3 install gunicorn
- 启动gunicorn
gunicorn -w worker数量 -b ip:端口号 运行文件名:flask实例名
[root@iZf8zi7rsmqdun3dyxb7cfZ cov]# gunicorn -b 127.0.0.1:5000 cov:app //例子
- w 表示有3 个 工作线程;- b 指定ip 和端口;app 为全局变量 (app = Flask(_ _name _ _))
- 重启gunicorn
[root@iZf8zi7rsmqdun3dyxb7cfZ cov]# kill -HUP 15456(主进程)
我一般会在项目文件修改后重启一下gunicorn
项目部署
到现在项目部署就差不多,访问一下~~公网ip~~(学生优惠领的服务器快过期了,于是我把flask项目移植到另一个服务器了公网ip)看看访问是否成功
项目部署到服务器了,撒花✿✿ヽ(°▽°)ノ✿
使用crontab定时调度爬虫
上传spider.py文件至/root目录,终端输入“crontab -e”命令
crontab -e //编辑该用户的计时器设置
crontab -l //列出该用户的计时器设置
每隔一小时执行"up_his"下的方法,完成对全国历史数据的爬取;
每隔30分钟执行"up_det"下的方法,完成对今日详细数据的爬取;
每隔一小时执行"up_tol"下的方法,完成对当前总数据的爬取;
//crontab编辑内容
* */1 * * * python3 /root/spider.py up_his >> /root/log_his 2>&1 &
*/30 * * * * python3 /root/spider.py up_det >> /root/log_det 2>&1 &
* */1 * * * python3 /root/spider.py up_tol >> /root/log_tol 2>&1 &
完成编辑后按"ESC"键退出编辑模式进入指令模式,输入:wq回车即可保存退出。
小结
项目部署完成啦,还实现了定时爬取疫情数据,真的很有成就感啊<( ̄︶ ̄)>。之前觉得项目部署很难,现在也觉得没啥了,之后还想着要学习Linux的相关命令。不过ECharts图表还是不能正常显示,中国地图不能显示各省的疫情数据,我看腾讯疫情实时追踪的中国地图好像也是用的ECharts,但腾讯显示是正常的。革命尚未成功,还得继续研究一番呐~