在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实现简单的TCP代理服务器
Oct 08 Python
python爬取亚马逊书籍信息代码分享
Dec 09 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
Python循环结构的应用场景详解
Jul 11 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
Django框架反向解析操作详解
Nov 28 Python
python实现从wind导入数据
Dec 03 Python
详解Pycharm与anaconda安装配置指南
Aug 25 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 Python
python使用pygame创建精灵Sprite
Apr 06 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来检测proxy
2006/10/09 PHP
五个PHP程序员工具
2008/05/26 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
2016/03/20 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
python使用append合并两个数组的方法
2015/04/28 Python
python中hashlib模块用法示例
2017/10/30 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
代码详解django中数据库设置
2019/01/28 Python
详解python的四种内置数据结构
2019/03/19 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
培训自我鉴定
2014/01/31 职场文书
优秀护士事迹材料
2014/12/25 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
老舍《猫》教学反思
2016/02/17 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
Github 使用python对copilot做些简单使用测试
2022/04/14 Python
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js
利用Apache Common将java对象池化的问题
2022/06/16 Servers