在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除法运算小技巧
Apr 05 Python
Python入门教程之if语句的用法
May 14 Python
python操作mysql数据库
Mar 05 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
用python处理图片实现图像中的像素访问
May 04 Python
Python Socket编程之多线程聊天室
Jul 28 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
python pygame实现挡板弹球游戏
Nov 25 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
Python中常见的数制转换有哪些
May 27 Python
如何完美的建立一个python项目
Oct 09 Python
利用python进行文件操作
Dec 04 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
PHP.MVC的模板标签系统(四)
2006/09/05 PHP
用PHP读取RSS feed的代码
2008/08/01 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
一个简单的javascript类定义例子
2009/09/12 Javascript
Javascript访问器属性实例分析
2014/12/30 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
Gap英国官网:Gap UK
2018/07/18 全球购物
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
金融专业个人求职信
2013/09/22 职场文书
党课学习思想汇报
2014/01/02 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
品质口号大全
2014/06/17 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
2014年共青团工作总结
2014/12/10 职场文书
个人事迹材料范文
2014/12/29 职场文书
检讨书范文2000字
2015/01/28 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
培训班开班主持词
2015/07/02 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL