在 DigitalOcean 上部署留言板应用过程中学到了很多东西,现在将其中的点滴知识记录下来。
项目代码在:https://github.com/David-Guo/message-board
效果展示:http://loveswing.tk
如果要跑多个站,最好将它们完全隔离,每个站对应一个用户,所以下面所有操作针对用户 swing
##推荐安装 zsh 作为默认 shell
$ sudo apt-get install zsh
##安装 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
拥有sudo权限的用户属于一个group,只在这个group里面的用户就都有sudo的权限了,那个这个group到底是多少呢?查看一下/etc/group文件就知道了,这个组号是 27
使用 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
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 也可以使用配置文件,由于这里的命令行非常简单,所以就不详细描述配置文件了。
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
配置好 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;
}
}
}
到这里,一个完整的线上环境就完成了,注册域名并修改好记录绑定上 VPS 的 ip 后,就能通过域名访问这个这个留言板应用了。
参考:
http://cn.v2ex.com/t/205811
http://beiyuu.com/vps-config-python-vitrualenv-flask-gunicorn-supervisor-nginx/