Flask项目部署云服务器 CentOS7.3+Redis+MySQL+Flask+Nginx+Gunicorn +Supervisorctl

Flask项目部署云服务器 CentOS7.3+Redis+MySQL+Flask+Nginx+Gunicorn +Supervisorctl

项目运行环境

阿里云(单核CPU, 2G内存, CentOS7.3 x64 带宽1Mbps), 具体购买和ssh连接阿里云本文不做描述。

实用工具

首先进入阿里云后先要升级下apt-get, CentOS采用的是yum管理工具 ,并下载所需软件

sudo apt-get update
sudo apt-get install vim git wget tmux

或者

sudo yum update
sudo yum install vim git wget tmux

我还会使用zsh和oh-my-zsh来替换bash

sudo apt-get install zsh
# 终端下打以下命令
wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

替换bash为zsh

chsh -s /bin/zsh

重新连接阿里云就可以看到效果, 具体主题可以根据自己喜好更改主目录下的.zshrc即可

redis

1.获取redis资源

wget http://download.redis.io/releases/redis-5.0.8.tar.gz

2.解压

tar xzvf redis-5.0.8.tar.gz

3.安装

  cd redis-4.0.8

  make

  cd src

  make install PREFIX=/usr/local/redis

(如果有执行出错,先安装gcc。安装命令为:yum -y install gcc automake autoconf libtool make 。

若出现【zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录】,则运行命令make MALLOC=libc)

4.移动配置文件到安装目录下

 cd ../

  mkdir /usr/local/redis/etc

  mv redis.conf /usr/local/redis/etc

5.配置redis为后台启动

  vi /usr/local/redis/etc/redis.conf 
  (:/daemonize查找到daemonize  将daemonize no 改成daemonize yes)

6.将redis加入到开机启动

  vi /etc/rc.local 
  #在里面添加内容:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf (意思就是开机调用这段开启redis的命令)

7.开启redis

  /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 

8.建立快捷指令

#临时有效
alias redis-cli='/usr/local/redis/bin/redis-cli'

要想永久有效

vim ~/.bashrc
#加入
alias redis-cli='/usr/local/redis/bin/redis-cli'


# 立即生效
source ~/.bashrc

#之后就可以使用redis-cli进入redis

注意:
自定义指令写入~/.bashrc只对当前用户永久生效,所用用户永久生效要写入/etc/bashrc。

常用指令

  • 打开redis命令:service redis start
  • 关闭redis命令:service redis stop
  • 设为开机启动:chkconfig redis on
  • 设为开机关闭:chkconfig redis off

MySQL

CentOS7.3 安装mysql数据库5.7

虚拟环境

使用python的pip包管理工具

sudo apt-get install python-setuptools
sudo apt-get install python-pip

pip 安装到指定目录 sudo pip2 install numpy --target=/usr/local/lib/python2.7/site-packages

安装虚拟环境的命令 :

sudo pip install virtualenv
sudo pip install virtualenvwrapper

安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:

# 1、创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs
 
# 2、打开~/.bashrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
 
# 3、运行
source ~/.bashrc

如果采用了zsh替换bash

# 1、创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs

# 2、打开~/.zshrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
 
# 3、运行
source ~/.zshrc

如果报错 -bash:/root/.zshrc:source:2: no such file or directory: /usr/local/bin/virtualenvwrapper.sh

说明文件没在这个路径下,

可以通过which 命令查看(which是用来查看当前要执行的命令所在的路径)

[root@localhost ~]$ which virtualenvwrapper.sh
/usr/bin/virtualenvwrapper.sh

重新修改 ~/.bashr或 ~/.zshrc对应的路径即可:

export WORKON_HOME=$HOME/.virtualenvs
source /usr/bin/virtualenvwrapper.sh
#  然后重新运行以下命令
source ~/.bashrc

创建虚拟环境的命令 :

提示:如果不指定python版本,默认安装的是python2的虚拟环境

在python2中,创建虚拟环境

mkvirtualenv 虚拟环境名称
例 :
mkvirtualenv py_flask

在python3中,创建虚拟环境

mkvirtualenv -p python3 虚拟环境名称
#也可以使用
mkvirtualenv py3_venv  --python=python3.7
例 :
mkvirtualenv -p python3 py3_flask

pthon 2.7 如果报错:无法从from backports.configparser import ConfigParser导入configparser,是因为缺少configparser文件,可以在https://pydoc.net/configparser/3.5.0/configparser/ 将缺少的configparser文件准备好,放入backports文件夹,即可解决

提示 :

  • 创建虚拟环境需要联网
  • 创建成功后, 会自动工作在这个虚拟环境上
  • 工作在虚拟环境上, 提示符最前面会出现 “虚拟环境名称”

关于虚拟环境的其他用法:

查看虚拟环境

workon 两次tab键

使用虚拟环境的命令 :

workon 虚拟环境名称
 
例 :使用python2的虚拟环境
workon py_flask
 
例 :使用python3的虚拟环境
workon py3_flask

退出虚拟环境的命令:

deactivate

删除虚拟环境的命令:

rmvirtualenv 虚拟环境名称

#例 :删除虚拟环境py3_flask
 
#先退出:
deactivate
#再删除:
rmvirtualenv py3_flask

项目部署

安装依赖
用pip freeze查看当前安装版本

pip freeze

导出依赖包

pip freeze > requirements.txt

这将会创建一个 requirements.txt 文件,其中包含了当前环境中所有包及 各自的版本的简单列表。您可以使用 “pip list”在不产生requirements文件的情况下, 查看已安装包的列表。这将会使另一个不同的开发者(或者是您,如果您需要重新创建这样的环境) 在以后安装相同版本的相同包变得容易。

安装依赖包

pip install -r requirements.txt

这能帮助确保安装、部署和开发者之间的一致性。

安装Gunicorn
Gunicorn是一个wsgi服务器, 我们将通过它来启动我们的web服务。

# 注意我们是通过pip来安装,所以该模块所有文件都是在venv里面
pip install gunicorn

安装成功就可以直接使用了。

运行一下manage.py

# 不适用gunicorn运行
python manage.py runserver
 
# 使用gunicorn 运行
# 这里需要注意一下, 冒号前面的是文件名也就是manage.py而后面的是应用的名称。我在这里载过跟头。因为服务器需要接受一个wsgi的应用而manager = Manager(app)不是一个wsgi应用所以报错
gunicorn manage:app

我们创建一个gunicorn配置文件gunicorn.py并把他放到code目录下

## gunicorn.py
 
# encoding: utf-8
 
import multiprocessing
 
# 监听端口
bind = '0.0.0.0:5000'
# 工作模式
worker_class = 'gevent' #必须先安装gevent
# 并行工作进程数(我采用跟CPU核心数一致)
workers = multiprocessing.cpu_count() * 1
# 设置守护进程 True为后台运行
daemon = False
#显示现在的配置,默认值为False,即显示。
check_config = True
# 设置日志记录水平
loglevel = 'debug'
# 设置错误信息日志路径 ,设置里错误日志路径后将不再屏幕打印调试信息
errorlog = './logs/error.log'
# 设置访问日志路径
accesslog = './logs/access.log'

启动程序

#-c 指定配置文件运行。-D后台运行
gunicorn manage:app -c gunicorn.py

查看状态

pstree -ap|grep gunicorn

杀死gunicorn进程

ps -ef |grep gunicorn|grep -v grep|awk '{print $2}'| xargs kill -9

安装Nginx
我们通过nginx来反向代理我们的服务。

# 首先下载一个nginx
sudo apt-get install nginx

我们可以访问我们的域名或IP地址,如果出现Nginx的提示就表示安装成功了。
nginx安装在/usr/local/nginx/目录下, 我们把项目的配置文件放到/usr/local/nginx/conf/nginx.conf

server{
  listen 80;
  server_name xxx.xxx.xxx.xxx;
 
  # nginx log信息, 需要创建logs目录
  access_log /root/code/logs/access.log
  error_log /root/code/logs/error.log
 
  location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header HOST $host;
    proxy_redirect off;
    if (!-f $request_filename){
      proxy_pass http://127.0.0.1:5000;
      break;
    }
  }
}
#建立快捷指令
vim ~/.zshrc
#加入
alias nginx='/usr/local/nginx/sbin/nginx'

# 然后检查nginx有没有错误
nginx -t 
 
# 重新启动服务
nginx -s reload

nginx常用指令

#启动nginx
nginx -c /path/to/nginx.conf
#关闭nginx:
nginx -s stop  :快速停止nginx  
         quit  :完整有序的停止nginx
#重启nginx:
nginx -s reload  :修改配置后重新加载生效  
nginx -s reopen  :重新打开日志文件  
nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确

#其他的停止nginx 方式:
ps -ef | grep nginx

kill -HUP 主进程号  		:平滑重启nginx
kill -QUIT 主进程号     :从容停止Nginx  
kill -TERM 主进程号     :快速停止Nginx  
pkill -9 nginx          :强制停止Nginx

安装Supervisor

supervisor用来监控进程,并在进程挂掉的时候自动重启它。

# 这里需要把它安装到系统中
sudo pip install supervisor
 
# 生成配置文件
sudo echo_supervisord_conf > /etc/supervisord.conf

编辑/etc/supervisord.conf,并在最后一行加入一下字段

# 编辑/etc/supervisord.conf,并在最后一行加入一下字段
# 这样配置文件会将/etc/supervisor/conf.d下所有.conf结尾的都会导入进来
[include]
files = /etc/supervisor/conf.d/*.conf
 
# 在创建一个配置文件到/etc/supervisor/conf.d/WYTT.conf
[program:WYTT]
directory=/root/project/WYTT
environment=PATH="/root/.virtualenvs/py3_venv/bin/" ;指定虚拟环境
command = gunicorn manage:app -c /root/project/WYTT/gunicorn.py ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=root          ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=100MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/root/supervisor_logs/wytt.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程,如果出现无法彻底杀死进程时,改为True

通过supervisorctl工具用来管理supervisor维护的进程

# reread来重新加载的配置内容, update来更新
supervisorctl reload
#或
supervisorctl update 

centos上常用的命令

supervisorctl status:查看所有进程的状态

supervisorctl stop :停止

supervisorctl start :启动

supervisorctl restart 或者使用supervisorctl reload: 重启

supervisorctl update :配置文件修改后可以使用该命令加载新的配置

supervisorctl reload: 重新启动配置中的所有程序  

supervisorctl restart all: 启动全部(你想重启的单个应用名字也可以)

但是在centos上使用supervisorctl reload会报错error: <class ‘socket.error’>, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224

可以通过下面指令来启动

mkdir /etc/supervisor
#supervisor安装成功之后,没有提供默认的配置文件,可以通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件
echo_supervisord_conf > /etc/supervisor/supervisord.conf
#使用supervisord 来启动
supervisord -c /etc/supervisor/supervisord.conf :启动
supervisorctl shutdown :关闭

当我使用 supervisorctl start WYTT时,一直显示:

WYTT: ERROR (no such process)

几番周折才发现,/etc/supervisor/supervisord.conf 一直还是原来的。我们之前改的是/etc/supervisord.conf。所以我们只要将/etc/supervisor/supervisord.conf中被注释掉的 [include] 解开,并改为:

[include]
files = /etc/supervisor/conf.d/*.conf

就可以了。

发布了12 篇原创文章 · 获赞 0 · 访问量 266

猜你喜欢

转载自blog.csdn.net/weixin_44777680/article/details/105529490