在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(一)Python环境安装
Aug 20 Python
利用numpy和pandas处理csv文件中的时间方法
Apr 19 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
Python玩转Excel的读写改实例
Feb 22 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
基于python-opencv3的图像显示和保存操作
Jun 27 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
ipad上运行python的方法步骤
Oct 12 Python
Python接口测试环境搭建过程详解
Jun 29 Python
python上selenium的弹框操作实现
Jul 13 Python
python中pickle模块浅析
Dec 29 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
网站用php实现paypal整合方法
2010/11/28 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
浅谈super-vuex使用体验
2018/06/25 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
Python动态加载模块的3种方法
2014/11/22 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
大学生未来职业生涯规划书
2014/02/15 职场文书
会计助理岗位职责
2014/02/17 职场文书
销售员求职个人的自我评价
2014/02/19 职场文书
网络信息安全承诺书
2014/03/26 职场文书
师德师风的心得体会
2014/09/02 职场文书
招标授权委托书样本
2014/09/23 职场文书
法人代表证明书格式
2014/10/01 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
让生命充满爱观后感
2015/06/08 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers