在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计算
Sep 12 Python
python中self原理实例分析
Apr 30 Python
Python判断Abundant Number的方法
Jun 15 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
windows10系统中安装python3.x+scrapy教程
Nov 08 Python
Python爬虫DOTA排行榜爬取实例(分享)
Jun 13 Python
Python的语言类型(详解)
Jun 24 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
Python元组及文件核心对象类型详解
Feb 11 Python
Python中偏函数用法示例
Jun 07 Python
python单例设计模式实现解析
Jan 07 Python
Python安装Bs4的多种方法
Nov 28 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
WIN98下Apache1.3.14+PHP4.0.4的安装
2006/10/09 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
HTML5实现视频弹幕功能
2019/08/09 HTML / CSS
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
自荐信格式技巧有哪些呢
2013/11/19 职场文书
会计求职信怎么写
2015/03/20 职场文书
雾霾停课通知
2015/04/24 职场文书
房屋维修申请报告
2015/05/18 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
用JS写一个发布订阅模式
2021/11/07 Javascript
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers