在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动态参数用法实例分析
May 25 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
Python 忽略warning的输出方法
Oct 18 Python
Django开发的简易留言板案例详解
Dec 04 Python
Pandas实现一列数据分隔为两列
May 18 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
Python configparser模块操作代码实例
Jun 08 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
Python就将所有的英文单词首字母变成大写
Feb 12 Python
Python实现列表拼接和去重的三种方式
Jul 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
用jquery来定位
2007/02/20 Javascript
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
python+splinter自动刷新抢票功能
2018/09/25 Python
Python数据类型之Dict字典实例详解
2019/05/07 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
网络工程专业自荐信范文
2014/03/16 职场文书
法律系毕业生求职信
2014/05/28 职场文书
重点工程汇报材料
2014/08/27 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
python入门之算法学习
2021/04/22 Python
Python selenium的这三种等待方式一定要会!
2021/06/10 Python
vue中data里面的数据相互使用方式
2022/06/05 Vue.js
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python