您的当前位置:首页正文

Mac系统下,Flask、uwsgi、Nginx部署应用

来源:要发发知识网

最近微信不是出个小程序,试了一下觉得还挺好玩,朋友说想和我做一个,本来做iOS开发的,仗着自己有些服务器底子,感觉python挺好用,直接就开始干了。
本来以为就部署个服务器么,后来发现有好多坑,网上也有别人写的,但是大多是Linux下的部署方式,与Mac有些小差异,所以就记下来,免得以后忘。

1.安装Flask

2.配置uwsgi

$pip install uwsgi
然后在项目目录下新建config.ini文件,内容如下

[uwsgi]
master = true
home = /System/Library/Frameworks/Python.framework/Versions/2.7  //python目录
wsgi-file = run.py  //flask程序入口
callable = app   //flask的app变量,是Flask实例
socket = 127.0.0.1:3031  
processes = 4
threads = 2
buffer-size = 32768
protocol = http
module = app

这时输入uwsgi config.ini就可以运行服务了。
但是我当时碰到了一个no module found: site 的错误,因为不了解python,查了好长时间才知道site指的是python的安装目录下的一个site.py文件,也就是这个文件找不到,所以就是home路径设置有问题,当时我是用witch python命令查看的python路径,但是这个路径下没有site.py文件,后来又查到了一个查看路径方法,如下:

3.配置supervisor

由于我们最初的目的是想让Nginx托管Flask,但是由于Ngxin是不支持直接与Flask交流的,所以需要uwsgi做中间的服务层,但是我们肯定不希望每次启动服务时还要先启动uwsgi,再启动Nginx,这时我们就需要supervisor了

brew services start supervisor
然后进行配置,找到supervisor安装目录

cd /etc
sudo touch supervisord.conf
sudo chmod 777 /etc
sudo chmod 777 /supervisord.conf

编辑supervisord.conf

[program:blog] 
 # 启动命令入口 
command=uwsgi /Users/alienchang/Desktop/workspace/MediaServer/config.ini             
 # 命令程序所在目录 
directory=/Users/alienchang/Desktop/workspace/MediaServer/
 #运行命令的用户名 
user=Alienchang
autostart=true
autorestart=true

brew services start supervisor

supervisord -c /etc/supervisord.conf

如果出现问题执行

echo_supervisord_conf >> /etc/supervisord.conf

添加默认配置到supervisord.conf

supervisorctl是supervisord的进程管理,可以用来控制stop和restart

但是我发现supervisorctl关闭进程却不能关闭uWSGI的进程
所以我就手动kill了

提示:
Another program is already listening on a port that one of our HTTP servers is configured to use

后来发现不是不能结束进程,而是不能释放端口,后来查了解决方案
sudo unlink /usr/local/var/run/supervisor.sock
这样就可以释放端口了

killall -9 uwsgi

查看端口占用命令

lsof -i tcp:port 

4.配置Nginx

brew install nginx

brew info nginx查看nginx安装目录,找到config文件,我的是/usr/local/etc/nginx/nginx.conf,chmod 777 修改权限,在nginx.conf中添加

server {
     listen       80;
     server_name  127.0.0.1;
     #server_name localhost;
     location / {
         #include uwsgi_params;
         include uwsgi_params;
         uwsgi_pass 127.0.0.1:8001;
         uwsgi_param UWSGI_PYHOME /System/Library/Frameworks/Python.framework/Versions/2.7;
         uwsgi_param UWSGI_CHDIR  /Users/alienchang/Desktop/workspace/MediaServer/;
         uwsgi_param UWSGI_SCRIPT app:app;
    }
 }

重启Nginx服务:sudo service nginx restart

此时,又出现问题了!
....upstream prematurely closed connection while reading response header from upstream uwsgi....

参考: