flask web 应用部署

在 DigitalOcean 上部署留言板应用过程中学到了很多东西,现在将其中的点滴知识记录下来。

项目代码在:https://github.com/David-Guo/message-board

效果展示:http://loveswing.tk

1. 环境

  1. VPS :DigitalOcean
  2. 系统:ubuntu 14.04 64
  3. Web Server: Nginx
  4. 进程管理工具: supervisor
  5. WSGI Server: Gunicorn
  6. 虚拟环境:virtualenv

2. 配置用户环境

如果要跑多个站,最好将它们完全隔离,每个站对应一个用户,所以下面所有操作针对用户 swing

##推荐安装 zsh 作为默认 shell
$ sudo apt-get install zsh
$ sudo apt-get install git

##安装 oh-my-zsh 插件
$ wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

##添加用户 swing
##参数-G:指定用户所在组
##参数-d:指定用户目录
##参数-m:如果目录不存在则创建
##参数-s:指定使用的 shell
$ useradd swing -G 27 -d /home/swing -m -s /bin/zsh
# 给 swing 用户添加密码
$ passwd swing

拥有sudo权限的用户属于一个group,只在这个group里面的用户就都有sudo的权限了,那个这个group到底是多少呢?查看一下/etc/group文件就知道了,这个组号是 27

3. 安装应用

使用 git 下载代码到 /home/swing/message-board

$ git clone https://github.com/David-Guo/message-board.git
$ cd message-board

启用虚拟环境,安装应用依赖

$ sudo pip install virtualenv
$ virtualenv venv

##激活 virtualenv
$ source ./venv/bin/activate

##安装依赖
(venv)$ pip isntall -r requirements.txt

##取消激活命令:
deactivate

4. 安装配置 Gunicorn

Gunicorn是用于部署 WSGI 应用的。虽说 python run.py 也能让网站直接跑起来,但只是使用生产环境下,Flask 自带的服务器,无法满足性能要求。线上环境,还是需要更高效的组建。所以我们这里 Gunicorn 做 wsgi 容器。

依然在 virtualenv 环境下安装

(venv)$ pip install gunicorn

安装好 Gunicorn 之后,需要用 Gunicorn 启动 Flask ,Flask 用自带的服务器启动时,Flask 里面的 name 里面的代码启动了 app.run()。而这里我们使用 Gunicorn,run.py 就等同于一个库文件,被 Gunicorn 调用,这里启动:

(venv)$ gunicorn -w 4 -b 0.0.0.0:8000 run.app

其中的 run 就是 run.py, app 就是那个 wsgifunc 的名字,这样运行监听端口 8000,原先的 5000 端口并没有开启,-w 表示使用多少个 worker(进程),-b 表示 bind(绑定)ip 地址与端口号。

想要结束 Gunicorn 只需执行 pkill gunicorn,需要找到进程号 pid,这对开发来说,过于繁琐。因此要使用另一个工具 –supervisor,一个专门进程的工具,还可以管理系统的进程。

Gunicorn 也可以使用配置文件,由于这里的命令行非常简单,所以就不详细描述配置文件了。

5. 安装 Supervisor

Supervisor可以同时启动多个应用,最重要的是,当某个应用Crash的时候,他可以自动重启该应用,保证可用性。

supervisor 安装以及常用命令如下:

$ sudo apt-get install supervisor

##重新读取配置文件
$ sudo supervisorctl reload

##查看 supervisor 管理进程的状态
$ sudo supervisorctl status

##重启服务
$ sudo service supervisor restart

##启动所有/指定 supervisor 管理的程序进程
$ sudo supervisorctl start [all]|[appname]

##关闭所有/指定 supervisor 管理的程序进程
$ sudo supervisorctl stop [all]|[appname]

前三个命令是比较常用的。修改了配置文件,需要手动重启 supervisor 服务,遇到问题时,多使用 restart 和 status, 查看日志文件

现在访问 http://127.0.0.1:8000 就可以看到 gunicorn 启动返回的页面了。

配置应用的 supervisor 服务,总配置文件在 /etc/supervisor/supervisor.conf。不同应用分别配置,然后被总的配置文件 include 。/etc/supervisor/conf.d/ 目录下存放应用的配置文件

##新建编辑留言板应用的文件
$ sudo vim /etc/supervisor/conf.d/messageBoard.conf

##文件内容
[program:swing]
##项目的根目录在/home/swing/message-board
command/home/swing/message-board/gunicorn -w 3 -b 0.0.0.0:8000 run:app
directory=/home/swing/message-board
user=swing
autostart=false
autorestart=false
stdout_logfile=/home/swing/logs/gunicorn_supervisor.log
stderr_logfile=/home/swing/logs/gunicorn_supervisor.log

6. 安装配置 Nginx

配置好 gunicorn,supervisor,本地的环境就搭好了,如果想通过域名访问 VPS 上的网站,还需要 Nginx。

Nginx 是轻量级、性能强、占用资源少,能很好处理高并发的反向代理软件。

Nginx 安装与常用命令如下:

##安装Nginx
$ sudo apt-get install nginx

##启动服务
$ sudo service nginx start

##查看服务状态
$ sudo service nginx status

##重启与暂停服务
$ sudo service nginx restart
$ sudo service nginx stop

Nginx 的配置文件和 supervisor 类似,不同的程序可以分别配置,被总配置文件文件include。遇到问题时,第一思路是查看日志文件,错误日志文件在目录 /var/log/nginx/error.log 下。

##新建编辑 loveswing.tk 项目的配置文件
$ sudo vim /etc/nginx/sites-enabled/loveswing.tk

##文件内容
server {
        listen  80;                 //端口
        server_name loveswing.tk;   //访问域名


        root /home/swign/message-board/;
        access_log /home/swing/logs/access.log;
        error_log  /home/swing/logs/access.err;

        location / { 
                proxy_set_header Host $http_host;
                proxy_redirect off;
                if (!-f $request_filename) {
                        proxy_pass http://127.0.0.1:8000;       //留言板应用的gunicorn端口
                        break;
                }
        }
}

7. 结束

到这里,一个完整的线上环境就完成了,注册域名并修改好记录绑定上 VPS 的 ip 后,就能通过域名访问这个这个留言板应用了。

参考:

http://cn.v2ex.com/t/205811

http://beiyuu.com/vps-config-python-vitrualenv-flask-gunicorn-supervisor-nginx/

猜你喜欢

转载自blog.csdn.net/u012675539/article/details/50836775