在阿里云服务器上配置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 相关文章推荐
深入理解python多进程编程
Jun 12 Python
Python排序搜索基本算法之希尔排序实例分析
Dec 09 Python
Python设计模式之工厂模式简单示例
Jan 09 Python
APIStar:一个专为Python3设计的API框架
Sep 26 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
django-初始配置(纯手写)详解
Jul 30 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
Python中低维数组填充高维数组的实现
Dec 02 Python
django template实现定义临时变量,自定义赋值、自增实例
Jul 12 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
如何使用flask将模型部署为服务
May 13 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
PHP可逆加密/解密函数分享
2012/09/25 PHP
XHProf报告字段含义的解析
2016/05/17 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
php微信公众号开发模式详解
2016/11/28 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
php中yii框架实例用法
2020/12/22 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
python实现给字典添加条目的方法
2014/09/25 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
合同专员岗位职责
2013/12/18 职场文书
简历中个人自我评价范文
2013/12/26 职场文书