在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函数帮助查询小工具
Mar 13 Python
Python实现的HMacMD5加密算法示例
Apr 03 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
python使用tornado实现简单爬虫
Jul 28 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
10分钟用python搭建一个超好用的CMDB系统
Jul 17 Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
Python底层封装实现方法详解
Jan 22 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 Python
python 实现人和电脑猜拳的示例代码
Mar 02 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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
vue路由懒加载的实现方法
2018/03/12 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
Python编程实现蚁群算法详解
2017/11/13 Python
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
家长给老师的道歉信
2014/01/13 职场文书
青年志愿者活动总结
2014/04/26 职场文书
家长会演讲稿
2014/04/26 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
八一建军节演讲稿
2014/09/10 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Nginx进程管理和重载原理详解
2021/04/22 Servers
Mysql binlog日志文件过大的解决
2021/10/05 MySQL
无线电通信名词解释
2022/02/18 无线电