在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查找函数f(x)=0根的解决方法
May 07 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
浅谈python socket函数中,send与sendall的区别与使用方法
May 09 Python
Python常用特殊方法实例总结
Mar 22 Python
Python实现的文轩网爬虫完整示例
May 16 Python
Python程序打包工具py2exe和PyInstaller详解
Jun 28 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
django列表筛选功能的实现代码
Mar 27 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
Apr 01 Python
基于Python的Jenkins的二次开发操作
May 12 Python
Opencv求取连通区域重心实例
Jun 04 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 移除数组重复元素的一点说明
2008/11/27 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
Javascript 面向对象之重载
2010/05/04 Javascript
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
2019/01/08 Javascript
小程序红包雨的实现示例
2019/02/19 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
python生成指定长度的随机数密码
2014/01/23 Python
linecache模块加载和缓存文件内容详解
2018/01/11 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
python文字转语音实现过程解析
2019/11/12 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
社区消防工作实施方案
2014/03/21 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
MySQL之DML语言
2021/04/05 MySQL
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript