在阿里云服务器上配置CentOS+Nginx+Python+Flask环境


Posted in Python onJune 18, 2016

项目运行环境

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

实用工具

首先进入阿里云后先要升级下apt-get, 并下载所需软件

sudo apt-get update
sudo apt-get 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即可

安装python相关模块

使用python的pip包管理工具

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

在主目录下创建文件夹code并把所有项目放进这个目录里

mkdir code

# 使用virtualenv
vritualenv venv

# 开启virtualenv
source /venv/bin/activate

# 关闭virtualenv
deactivate

# 在开启virtualenv的状态下使用pip会使用venv中的pip,也就是所有模块都会安装到venv中
# 如果想要安装全局模块就使用sudo pip 

# 安装flask, 安装到venv中
pip install flask

# 两个是不同的, 安装到系统中
sudo pip install flask

使用Flask

现在我们已经安装了Flask, 现在我们写一个小的程序来运行一下。
这里我们在一次安装flask的相关模块,并把他们写入到requirements.txt这个文件中。

# 安装flask的相关模块
pip install -r requirements

# 创建一个manage.py文件, 用作管理我们的应用, 然后创建我们的一个应用。
touch manage.py

## 创建一个叫bamboo的应用
mkdir bamboo

## 创建一个应用的文件, 接下来我们要编辑这个文件了。
touch bamboo/__init__.py bamboo/app.py

项目目录结构是这样的

/root/code/
├── bamboo
│  ├── app.py
│  ├── config.py
│  ├── __init__.py
│  ├── static
│  ├── templates
│  └── views
├── gunicorn.conf
├── logs
│  ├── access.log
│  ├── error.log
│  ├── supervisord.log
│  ├── supervisor_err.log
│  └── supervisor_out.log
├── manage.py
├── requirements.txt
├── run.py
├── sweep.py
└── venv

编辑bamboo/app.py和bamboo/views/main.py

## app.py
from flask import Flask

def create_app():
  app = Flask(__name__)

  # do something

  register_blueprints(app)
  return app


# 用来注册视图的路由
def register_blueprints(app):
  from bamboo.views import main, error
  for i in (main, error):
    app.register_blueprint(i.bp)

## main.py
from flask import render_template, Blueprint

bp = Blueprint('main', __name__)


@bp.route('/')
@bp.route('/index')
def index():
  return '<h1>Hello, Bamboo!</h1>'

安装Gunicorn

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

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

可以进入目录vevn/bin下查看是否存在gunicorn命令

# 这里我们编辑下manage.py文件,具体文件路径请查看上文中的目录结构
## manage.py

from bamboo.app import create_app
from flask.ext.script import Manager, Server, Shell

app = create_app()
manager = Manager(app)

def make_shell_context():
  # 用于shell使用
  pass

manager.add_command('shell', Shell(make_context=make_shell_context))
manager.add_command('runserver', Server(
  use_debugger=True,
  use_reloader=True,
  host='127.0.0.1',
  port=5000
))

if __name__ == '__main__':
  manager.run()

运行一下manage.py

# 不适用gunicorn运行
python manage.py runserver

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

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

## gunicorn.conf

workers=3
bind='127.0.0.1:5000'

安装Nginx

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

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

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

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;
    }
  }
}

需要创建一个软链接到/etc/nginx/sites-enabled/

# 这里bamoo只是文件名你也可以取自己的项目名称
ln -s /etc/nginx/sites-available/bamboo /etc/nginx/sites-enabled/bamboo

# 然后检查nginx有没有错误
nginx -t 

# 重新启动服务
service nginx restart
安装Supervisor

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

# 这里需要把它安装到系统中
sudo pip install supervisor

# 生成配置文件
sudo echo_supervisord_conf > /etc/supervisord.conf
# 编辑/etc/supervisord.conf,并在最后一行加入一下字段
# 这样配置文件会将/etc/supervisor/conf.d下所有.conf结尾的都会导入进来
[include]
files = /etc/supervisor/conf.d/*.conf

# 在创建一个配置文件到/etc/supervisor/conf.d/bamboo.conf
[program:bamboo]
command=/root/code/venv/bin/gunicorn manage:app -c /root/code/gunicorn.conf
directory=/root/code/
user=root
autostart=true
autorestart=true
stdout_logfile=/root/code/logs/supervisor_out.log
stderr_logfile=/root/code/logs/supervisor_err.log

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

# reread来检测修改的配置内容, update来更新
# 这样就可以看到bamboo的process启动了
supervisorctl reread
supervisorctl update 

# 也可以通过supervisorctl status 查看所有的项目进程
bamboo              RUNNING  pid 12928, uptime 2:13:05

这样我们的web服务已经启动起来了。

Python 相关文章推荐
ansible作为python模块库使用的方法实例
Jan 17 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
Python引用计数操作示例
Aug 23 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
May 04 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
Numpy 中的矩阵求逆实例
Aug 26 Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 Python
python tkinter canvas使用实例
Nov 04 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
浅谈Django前端后端值传递问题
Jul 15 Python
python实现杨辉三角的几种方法代码实例
Mar 02 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 #Python
举例讲解Python面向对象编程中类的继承
Jun 17 #Python
浅谈python为什么不需要三目运算符和switch
Jun 17 #Python
python运行时间的几种方法
Jun 17 #Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 #Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 #Python
最大K个数问题的Python版解法总结
Jun 16 #Python
You might like
php5 mysql分页实例代码
2008/04/10 PHP
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
2013/06/24 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
js性能优化技巧
2015/11/29 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
建筑安全生产目标责任书
2014/07/23 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
五一劳动节活动总结
2015/02/09 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
《秋思》教学反思
2016/02/23 职场文书
2016年度师德标兵先进事迹材料
2016/02/26 职场文书
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
python基础之类方法和静态方法
2021/10/24 Python
关于 Python json中load和loads区别
2021/11/07 Python
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers