在Mac OS上部署Nginx和FastCGI以及Flask框架的教程


Posted in Python onMay 02, 2015

最近在学习Flask,本文介绍一下如何部署Flask开发的应用,同时也学习一下Nginx的使用,这只是在Mac上的一个实验。
应用

这里使用的应用就是官方的文档中给出的Flaskr。
安装Nginx

使用HomeBrew安装Nginx:

$ brew install nginx

HomeBrew会自动安装Nginx及其依赖的程序。在我的电脑上安装的是Nginx 1.6.2,配置文件的路径是/usr/local/etc/nginx/nginx.conf。

启动Nginx的命令:

$ nginx

Nginx的默认端口是8080,用浏览器打开localhost:8080,显示如下所示的页面说明Nginx已经工作了。

在Mac OS上部署Nginx和FastCGI以及Flask框架的教程

配置Nginx

修改Nginx的配置文件:

server {
  listen 80;
  server_name localhost;
  charset utf-8;

  location / { try_files $uri @flaskr; }
  location @flaskr {
    include fastcgi_params;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param SCRIPT_NAME "";
    fastcgi_pass unix:/tmp/flaskr-fcgi.sock;
  }
}

重新启动Nginx:

$ nginx -s quit
$ sudo nginx

因为使用了80端口,启动Nginx时需要加上sudo。

启动完成后,访问localhost:

在Mac OS上部署Nginx和FastCGI以及Flask框架的教程

访问时出现了错误,这是因为我们的应用还没有启动。
FastCGI Server

Nginx是一个静态WEB服务器,不能直接运行我们的Python应用,当Nginx接受到请求时,会通过FastCGI转发给我们的应用,应用是运行在FastCGI Server上的,这个server接收Nginx的请求并调用我们的程序,将结果返回给Nginx,Nginx再将结果返回给用户。

我们要使用的FastCGI Server是flup,安装方法:

$ pip install flup

在应用目录下创建一个fcgi文件,例如flaskr.fcgi:

#!/usr/bin/python
from flup.server.fcgi import WSGIServer
from flaskr import app

if __name__ == '__main__':
  WSGIServer(app, bindAddress='/tmp/flaskr-fcgi.sock').run()

同时给fcgi文件可执行的权限:

$ chmod +x flaskr.fcgi

手动启动server:

$ screen
$ ./flaskr.fcgi

使用screen使server在后台运行,或者:

$ nohup ./flaskr.fcgi &

再次访问localhost就可以看到我们的应用了。
遇到的问题

第一次运行FastCGI server后,任然无法访问,查看Nginx的日志后发现Nginx服务器没有权限访问socket文件,修改nginx.conf添加user配置:

user wzy;

启动的时候Nginx报错:

nginx: [emerg] getgrnam("wzy") failed in /usr/local/etc/nginx/nginx.conf:2

Google一下后发现要加上用户组才行,改成这样:

user wzy wheel;

再次启动Nginx后一切正常了。

Nginx配置项user的使用方法:

Syntax: user user [group];
Default: user nobody nobody;

如果忽略group,Nginx会使用和user名称一样的用户组,例如我设置user wzy,那么Nginx启动的时候会去查找用户组wzy,我的电脑上没有这个用户组,所以Nginx会报错。

Python 相关文章推荐
Python中函数的用法实例教程
Sep 08 Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
Python两个内置函数 locals 和globals(学习笔记)
Aug 28 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
Django基础知识与基本应用入门教程
Jul 20 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
Pycharm新手使用教程(图文详解)
Sep 17 Python
next在python中返回迭代器的实例方法
Dec 15 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
python利用后缀表达式实现计算器功能
Feb 22 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 #Python
详细解读Python中的__init__()方法
May 02 #Python
举例讲解Python的Tornado框架实现数据可视化的教程
May 02 #Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 #Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 #Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 #Python
Python的Bottle框架中实现最基本的get和post的方法的教程
Apr 30 #Python
You might like
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
浅谈javascript 函数表达式和函数声明的区别
2016/01/05 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
ant design实现圈选功能
2019/12/17 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
Python中is与==判断的区别
2017/03/28 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
详解Python是如何实现issubclass的
2019/07/24 Python
django中瀑布流写法实例代码
2019/10/14 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
小学生作文评语
2014/04/18 职场文书
《秋游》教学反思
2014/04/24 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
建党伟业的观后感
2015/06/01 职场文书
环保建议书范文
2015/09/14 职场文书
趣味运动会标语口号
2015/12/26 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python