在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实现计算最小编辑距离
Mar 17 Python
Tensorflow简单验证码识别应用
May 25 Python
Python优先队列实现方法示例
Sep 21 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 Python
Python range、enumerate和zip函数用法详解
Sep 11 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
使用turtle绘制五角星、分形树
Oct 06 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 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 4.2书写安全的脚本
2006/10/09 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
layui操作列按钮个数和文字颜色的判断实例
2019/09/11 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
Python3中的bytes和str类型详解
2019/05/02 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
存储过程和函数的区别
2013/05/28 面试题
C#面试题问题集
2016/04/02 面试题
介绍一下Python下range()函数的用法
2013/11/07 面试题
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
党员服务承诺书
2014/05/28 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
医院标语大全
2014/06/23 职场文书
教师师德表现自我评价
2015/03/05 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers