ubuntu 16.04 flask 部署

1.Nginx
安装并运行Nginx:
sudo apt-get install nginx
sudo /etc/init.d/nginx start

Nginx是一个提供静态文件访问的web服务,然而,它不能直接执行托管Python应用程序,而uWSGI解决了这个问题。让我们先安装uWSGI,稍候再配置Nginx和uWSGI之间的交互。

sudo pip install uwsgi

2.里程碑1
示例应用(创建一个flask的简单hello world应用)
我们将托管的应用是经典的“Hello, world!”。这个应用只有一个页面,已经猜到页面上将有什么内容了吧。将所有应用相关的文件存放在/var/www/demoapp文件夹中。下面创建这个文件夹并在其中初始化一个虚拟环境:
sudo mkdir /var/www
sudo mkdir /var/www/demoapp
创建并激活一个虚拟环境,在其中安装Flask:
cd /var/www/demoapp
virtualenv venv
. venv/bin/activate
pip install flask
使用下面的代码创建hello.py文件:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)

3.里程碑 2
让我们执行我们刚创建的脚本:
python hello.py
现在你可以通过浏览器访问你服务器的8080端口

配置Nginx
首先删除掉Nginx的默认配置文件:
sudo rm /etc/nginx/sites-enabled/default
注意:如果你安装了其他版本的Nginx,默认配置文件可能在/etc/nginx/conf.d文件夹下。
创建一个我们应用使用的新配置文件/var/www/demoapp/demoapp_nginx.conf:

server {
    listen      80;
    server_name localhost;
    charset     utf-8;
    client_max_body_size 75M;

    location / { try_files $uri @yourapplication; }
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:/var/www/demoapp/demoapp_uwsgi.sock;
    }
}

将刚建立的配置文件使用符号链接到Nginx配置文件文件夹中,重启Nginx:

sudo ln -s /var/www/demoapp/demoapp_nginx.conf /etc/nginx/conf.d/
sudo /etc/init.d/nginx restart

4.里程碑 3
访问服务器的公共ip地址,你会看到一个错误:
别担心,这个错误是正常的,它代表Nginx已经使用了我们新创建的配置文件,但在链接到我们的Python应用网关uWSGI时遇到了问题。到uWSGI的链接在Nginx配置文件的第10行定义:
uwsgi_pass unix:/var/www/demoapp/demoapp_uwsgi.sock;
这代表Nginx和uWSGI之间的链接是通过一个socket文件,这个文件位于/var/www/demoapp/demoapp_uwsgi.sock。因为我们还没有配置uWSGI,所以这个文件还不存在,因此Nginx返回“bad gateway”错误,让我们马上修正它吧。
配置uWSGI
创建一个新的uWSGI配置文件/var/www/demoapp/demoapp_uwsgi.ini:

[uwsgi]
#application's base folder
base = /var/www/demoapp
#python module to import
app = hello
module = %(app)
home = %(base)/venv
pythonpath = %(base)
#socket file's location
socket = /var/www/demoapp/%n.sock
#permissions for the socket file
chmod-socket    = 666
#the variable that holds a flask application inside the module imported at line #6
callable = app
#location of log files
logto = /var/log/uwsgi/%n.log
创建一个新文件夹存放uWSGI日志,更改文件夹的所有权:

sudo mkdir -p /var/log/uwsgi
sudo chown -R ubuntu:ubuntu /var/log/uwsgi
前面的为账户,后面的为密码,跳过这一步也是可行的
5.里程碑 4
执行uWSGI,用新创建的配置文件作为参数:
uwsgi --ini /var/www/demoapp/demoapp_uwsgi.ini
接下来访问你的服务器,现在Nginx可以连接到uWSGI进程了:
我们现在基本完成了,唯一剩下的事情是配置uWSGI在后台运行
SUPERVISOR
pip install supervisor 安装supervisor
在root目录下初始化配置文件 (你也可以在其他目录,我喜欢root目录,喜欢pip 安装,后面的都是我通过pip方式安装的)
注:如果是使用apt-get安装的,那么 这个supervisord.conf文件会在 /etc/supervisor/文件夹下自动生成
echo_supervisord_conf > /your_file_path/supervisord.conf
看一下是不是出来了一个文件?
vim supervisor.conf
查看该文件
在配置文件最底部加入
(按i编辑)

[program:forum]
command=uwsgi --ini /var/forum/forum_uwsgi.ini                               ; supervisor启动命令
stopsignal=QUIT
autostart=true                                                                        ; 是否自动启动
autorestart=true                                                                       ;是否自动重启
stdout_logfile=/var/log/uwsgi/supervisor_forum.log                           ; log 日志
stderr_logfile=/var/log/uwsgi/supervisor_forum_err.log                         ; 错误日志  

按esc,输入:wq回车

启动supervisord
supervisorctl -c /root/supervisord.conf
查看状态
supervisorctl -c /root/supervisord.conf status
update!!!(如果supervisord.conf里项目有修改敲个命令update一下)

6.分享一下我项目的具体例子

qzks_nginx.conf 的配置详情
位于网站根目录下

server {
    listen      80;
    server_name http://www.zjuzzh.cn;
    charset     utf-8;
    client_max_body_size 75M;
    location / { try_files $uri @yourapplication; }
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:/var/www1/qzks_uwsgi.sock;
    }
}

将刚建立的配置文件使用符号链接到Nginx配置文件文件夹中,重启Nginx:
sudo ln -s /var/www1/qzks_nginx.conf /etc/nginx/conf.d/
sudo /etc/init.d/nginx restart
输入公网ip,会看到502 BAD GATEWAY
接下来该配置uwsgi
qzks_uwsgi.ini 的配置详情
同样位于网站根目录下

[uwsgi]
#application's base folder
base = /var/www1
#python module to import
app = manage
module = %(app)
home = %(base)/venv
pythonpath = %(base)
#socket file's location
socket = /var/www1/%n.sock
#permissions for the socket file
chmod-socket = 666
#the variable that holds a flask application inside the module imported at line #6
callable = app
#location of log files
logto = /var/log/uwsgi/%n.log
py-autoreload = 1   

最后一句表示修改py文件后自动重新加载
创建一个新文件夹存放uWSGI日志,更改文件夹的所有权:
sudo mkdir -p /var/log/uwsgi
使用如下命令,看看我们的配置是否成功(即nginx是否连接到uwsgi进程了)
uwsgi --ini /var/www1/qzks_uwsgi.ini
这一步做完,能成功访问页面,再去弄supervisor

supervisor
把进程变为后台进程的强大工具
安装supervisor
supervisor pip install supervisor
echo_supervisord_conf > supervisord.conf
vim supervisord.conf
按i编辑
写入下方supervisor的配置文件

[program:qzks]
command=uwsgi --ini /var/www1/qzks_uwsgi.ini                               ; supervisor启动命令
stopsignal=QUIT
autostart=true                                                                        ; 是否自动启动
autorestart=true                                                                       ;是否自动重启
stdout_logfile=/var/log/uwsgi/supervisor_qzks.log                           ; log 日志
stderr_logfile=/var/log/uwsgi/supervisor_qzks_err.log                         ; 错误日志

使用 supervisorctl
Supervisorctl 是 supervisord 的一个命令行客户端工具,启动时需要指定与 supervisord 使用同一份配置文件,否则与 supervisord 一样按照顺序查找配置文件。
supervisorctl -c /root/supervisord.conf
上面这个命令会进入 supervisorctl 的 shell 界面,然后可以执行不同的命令了:

> status    # 查看程序状态
> stop usercenter   # 关闭 usercenter 程序
> start usercenter  # 启动 usercenter 程序
> restart usercenter    # 重启 usercenter 程序
> reread    # 读取有更新(增加)的配置文件,不会启动新添加的程序
> update    # 重启配置文件修改过的程序
上面这些命令都有相应的输出,除了进入 supervisorctl 的 shell 界面,也可以直接在 bash 终端运行:

$ supervisorctl status
$ supervisorctl stop usercenter
$ supervisorctl start usercenter
$ supervisorctl restart usercenter
$ supervisorctl reread
$ supervisorctl update

PS:如果有修改配置文件,记得重新加载他!
uwsgi --ini /var/www1/qzks_uwsgi.ini
supervisorctl -c /root/supervisord.conf
restart qzks

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值