在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函数学习笔记
Oct 07 Python
Python 匹配任意字符(包括换行符)的正则表达式写法
Oct 29 Python
Python笔记(叁)继续学习
Oct 24 Python
python基础教程之循环介绍
Aug 29 Python
python如何实现反向迭代
Mar 20 Python
详解Python用户登录接口的方法
Apr 17 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
django rest framework使用django-filter用法
Jul 15 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
Feb 07 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 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面向对象编程快速入门
2006/12/14 PHP
优化PHP程序的方法小结
2012/02/23 PHP
PHP中的替代语法简介
2014/08/22 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
Python httplib模块使用实例
2015/04/11 Python
Python编程之多态用法实例详解
2015/05/19 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
使用TensorFlow实现SVM
2018/09/06 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
python实现经纬度采样的示例代码
2020/12/10 Python
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
法人代表委托书
2014/04/04 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
房产证明范本
2015/06/19 职场文书
六年级语文教学反思
2016/03/03 职场文书
keepalived + nginx 实现高可用方案
2022/12/24 Servers