Ubuntu14.04部署Flak应用+WSGI+Nginx(亲测)

前言:######

在云主机上部署之前,我在本地的虚拟机上进行了部署,web服务器采用uwsgi,它是一个支持包括WSGI在内的多种不同接口的web服务器。
supervisor用来做常规启动服务,nginx作为反向代理。将部署过程中遇到的问题记录一下,供以后部署时参照。

1、环境

虚拟机ubuntu 14.04.0系统

2、部署步骤
. 2.1安装pip和virtualenv

安装pip

sudo apt-get install python-pip

** 安装virtualenv**
为了避免不同项目之间的python环境相互污染,采用它来解决依赖,使用virtualenv的好处就是,不用的应用使用不同的环境。在该环境中安装插件不用管理员权限安装。

sudo pip install virtualenv
. 2.2 下载项目并创建虚拟环境

我的项目是在gitlib上,所以关于如何将项目从gitlib(github)上下载到本地就不过多说了。下载完后的项目目录为:

/home/www/webapp

在webapp目录下创建虚拟环境

ubuntu@ubuntu:/home/www/webapp$ virtualenv venv # 创建虚拟环境
ubuntu@ubuntu:/home/www/webapp$  source venv/bin/active # 激活虚拟环境
(venv)ubuntu@ubuntu:/home/www/webapp$   # 表示已经激活了虚拟环境,退出当前环境可以使用deactivate 
. 2.3安装uwsgi

uwsgi是一个很大的C应用,所以需要解决一些依赖,我在刚开始安装的过程中遇到最多的问题就是编译过程中报错,如引入python.h头文件出错,网上也有很多安装教程,如果遇到问题搜索一下就能解决。

ubuntu@ubuntu:/home/www/webapp$ sudo apt-get install python-dev
ubuntu@ubuntu:/home/www/webapp$ sudo apt-get install uwsgi

安装完成之后先不考虑部署问题,先来看看flask应用的目录结构

. 2.4Flask目录结构
/home/www/webapp
                ---migrations/ 数据库迁移目录
                --- venv/  虚拟环境
                ---webapp/ 程序目录
                ---__init__.py
                ---manage.py 
                ---requirements.txt
manage.py文件中采用flask_script拓展。
命令行运行程序 python manage.py runserver
.2.5安装Flask依赖

进入我们2.2步骤创建的虚拟环境中,使用requirements.txt文件来安装所有的依赖

(venv)ubuntu@ubuntu:/home/www/webapp$ pip install -r requirements.txt

注意:在所有的依赖安装安装完成之后,我们最后使用在命令行python manage.py runserver验证我们的依赖是否安装完全。
如果命令行运行没问题就进行下一步的配置。

.2.6 配置uwsgi

在项目目录webapp下新建一个config.ini用来启动uwsgi

uwsgi]

# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8001 
# 指向网站目录
chdir = /home/www/ webapp
# python 启动程序文件
wsgi-file = manage.py 
# python 程序内用以启动的 application 变量名
callable = app 
# 处理器数
processes = 4
# 线程数
threads = 2
#状态检测地址
stats = 127.0.0.1:9191

运行uwsgi

(venv)ubuntu@ubuntu:/home/www/webapp$ uwsgi config.ini
如果没有问题,程序会运行起来,
但是我在配置的过程中,在程序运行起来之后(程序运行起来时打印出来日志让我判断uwsgi已经把程序运行了),
在本地的8001端口并不能访问程序首页,我直接进行下一步了。
.2.7 安装supervisor

我使用supervisor来启动应用

sudo apt-get install supervisor

supervisor的全局配置文件在/etc/supervisor/supervisor.conf

我们不用改动,直接新建一个*.conf文件拷贝到/etc/supervisor/conf.d目录下

我们新建一个用来启动我们应用的配置文件(flask_supervisor.conf),这个文件需要拷贝到上面说的目录。

[program:webapp]
# 启动命令入口, 使用虚拟环境中的uwsgi运行我们的程序,这句就和刚刚上面我们使用uwsgi config.ini作用一样
command=/home/www/webapp/venv/bin/uwsgi /home/www/webapp/config.ini 

# 命令程序所在目录
directory=/home/www/webapp
#运行命令的用户名
user=ubuntu
        
autostart=true
autorestart=true
#日志地址,在supervisor运行时,保证这个目录和文件是存在的,否则会报错
stdout_logfile=/home/www/webapp/logs/uwsgi_supervisor.log      

启动服务和终止服务

sudo service supervisor start/stop

问题:我在将自定的配置文件flask_supervisor.conf文件拷贝到相应位置后,重启了supervisor后,提示重启成功,但是没有任何报错(后面步骤会说得到报错情况)。
于是我使用下面的命令重新加载supervisor后报错了。

错误信息
unix:///var/run/supervisor.sock no such file

解决办法:https://github.com/Supervisor/supervisor/issues/480

我使用了这个方法后解决了
sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock
sudo service supervisor restart

改完使用supervisorctl reload来让supervisor重新加载配置文件,通过supervisor status webapp查看我们webapp应用状态。
这里你要确认你的supervisor配置正确后在进行下面的步骤。

.2.8 安装nginx
sudo apt-get install nginx

安装完成之后配置nginx
新建一个default文件,然后将这个文件拷贝到/ext/nginx/sites-available/下面替换到原来的default文件即可。

    server {
      listen  80;
      server_name xxx.xxx.xxx.xxx; #公网地址
    
      location / {
        include      uwsgi_params;
        uwsgi_pass   127.0.0.1:8001;  # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
        uwsgi_param UWSGI_PYHOME /home/www/webapp/venv; # 指向虚拟环境目录
        uwsgi_param UWSGI_CHDIR  /home/www/webapp; # 指向网站根目录
        uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序
      }
    }

配置好后重启服务

sudo service nginx restart
restart

保证你的nginx在修改完配置后重启成功[ok]

3、可能遇到的问题
.3.1 nginx都配置好后,访问公网ip出现502

如果上面的都配置好后,出现502的错误,说明你的nginx配置没有问题,但是问题出在了supervisor上,它并没有把我们的程序运行起来,所以你把注意力转移到supervisor配置上。采用2.7步骤中描述的那样好好检查配置。
或者手动运行uwsgi config.ini文件把程序启动起来,然后在访问公网IP,看看能不能访问到,正常情况下是可以的,这就验证了supervisor没有启动程序。

4、总结

网上有很多关于这方面的内容,不管别人说的再详细,自己在操作的过程中肯定不会一次通过,有些人没有把一些坑写出来,或者没遇到,所以想要成功部署还需要自己亲自趟一趟。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容