欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在Mac OS上部署Nginx和FastCGI以及Flask框架的教程

程序员文章站 2022-04-30 21:30:43
最近在学习flask,本文介绍一下如何部署flask开发的应用,同时也学习一下nginx的使用,这只是在mac上的一个实验。 应用 这里使用的应用就是官方的文档中给出的...

最近在学习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会报错。