在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 29 Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
Window10+Python3.5安装opencv的教程推荐
Apr 02 Python
python监控进程脚本
Apr 12 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
python爬虫之urllib3的使用示例
Jul 09 Python
python中 * 的用法详解
Jul 10 Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
Django如何在不停机的情况下创建索引
Aug 02 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中的登陆login
2007/01/18 PHP
PHP获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
Bootstrap响应式侧边栏改进版
2016/09/17 Javascript
Vue触发隐藏input file的方法实例详解
2019/08/14 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
详解Vue中的自定义指令
2020/12/07 Vue.js
python持久性管理pickle模块详细介绍
2015/02/18 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
window下eclipse安装python插件教程
2017/04/24 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
2017/08/15 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
创意爱尔兰礼物:Creative Irish Gifts
2020/01/29 全球购物
2015年度内部审计工作总结
2015/05/20 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers
python turtle绘图
2022/05/04 Python