使用nginx+uwsgi+supervisor+pyenv部署flask

这里是Ubuntu环境

1. 安装

- nginx
	 1. 安装:sudo apt-get install nginx
	 2. 查看nginx是否安装成功:sudo nginx -v
	 3. 启动:sudo nginx
	 4. nginx配置文件地址:Ubuntu一般都在`/etc/nginx/`目录下(下面会在这个目录下添加配置文件)

 - pyenv
	 这里是教程地址,作者写的很好,可以按照这个进行配置:https://www.jianshu.com/p/3e93311fe6cb

 - uwsgi
	 直接在上面创建的虚拟环境里安装即可:pip install uwsgi

 - supervisor(推荐使用root用户进行配置,非root用户会有权限问题)
	 1. 安装:apt-get install supervisor
	 2. 配置目录:Ubuntu一般都在`/etc/supervisor/`目录下
	 3. 启动:sudo supervisord
	 4. 管理使用:sudo supervisorcrl (使用此命令会进入一个交互环境)
		
		可以在环境里使用命令:(程序名配置文件中配置)
		查看进程状态:status
		停止进程:stop 程序名
		停止所有进程:stop all
		开始进程:start 程序名
		重启进程:restart 程序名
		重新载入所有进程:reload
		新增配置文件后:update (如果不执行update,新的配置不会出现)

2. 安装项目依赖库

 - cd进项目目录然后安装项目的依赖库:pip install -r requirements.txt

3. uwsgi配置(先在项目根目录下创建uwsgi.ini文件)

[uwsgi]
master = true
processes = 2
chmod-socket = 666
uid = root
pythonpath = /home/test/api_test/website
logformat = %(method) %(uri) %(status) %(addr) [%(ctime)]
pidfile = /home/test/run/api_test.pid
socket = /home/test/run/api_test.sock
module = app
callable = app
harakiri = 120
listen = 1024
enable-threads=true
ignore-sigpipe = true
ignore-write-errors = true
disable-write-exception = true

master:使用主进程来管理其他子进程
processes:启动2个工作进程,生成指定数目的worker/进程
chmod-socket:如果nginx使用socket文件来代理这个服务,需要对这个文件有写的权限,所以这里需要设置权限
uid:用户名
pythonpath:application所在文件目录
logformat:日志格式
pidfile:指定进程文件(自行创建目录存放)
socket:指定socket文件(自行创建目录存放)
module:application所在文件
callable:指向application的变量名
harakiri:请求超时时间秒
listen:监听的队列数
enable-threads:允许application启动子线程
最后三个是上传文件时flask创建临时文件时会出异常,这个是忽略OSError的配置

这里说下uid,我最开始是在本地mac环境配置的nginx代理,配置完之后请求过来日志里出现(13: Permission denied) while connecting to upstream...,意思是没有权限
所以需要设置nginx.conf里的user配置,我是sudo启动的nginx,所以nginx进程的用户,是root用户,(也可以使用ps aux | grep nginx查看启动进程的情况)。
但是我把user设置成root之后,sudo nginx -t 检查到nginx配置不正确,然后可能是没有写用户组的原因,修改为user root wheel;检查nginx配置之后还是不正确,然后在uwsgi.ini中加入uid=root,就可以了,
原因可能是nginx没有权限去写这个socket的文件,(但是我明明设置了chmod-socket = 666)。对这里也不了解,所以只能作出猜测,如果有知道的大佬,烦告知。。

4. supervisor配置

1. 首先:cd /etc/supervisor/
2. 发现这个目录下有一个`supervisord.conf`的配置文件
3. vim supervisord.conf   打开配置文件最后一行(见下面图)发现导入了同级目录下的conf.d目录下的所有.conf后缀的文件,所以把新的配置文件都写到这个conf.d目录下
4. cd conf.d  (如果没有这个目录创建一个 `sudo mkdir conf.d`)
5. 然后编辑文件:vim example.conf  (文件名可以随便写,只要后缀是.conf就可以)
6. 配置如下:
[program:api_test]
command=/home/test/.pyenv/versions/api_test/bin/uwsgi /home/test/api_test/uwsgi.ini
directory=/home/test/api_test
autostart=true
autorestart=true
stdout_logfile=/home/test/logs/uwsgi.api_test.log
redirect_stderr=true
exitcodes=0

图一
第一行:program: 后面的就是程序名
command:要运行的命令,我这里是使用虚拟环境里的uwsgi去根据上面配置好的uwsgi.ini文件去运行
directory:项目地址
autostart:自动启动
autorestart:自动重启
stdout_logfile:输出log文件路径
redirect_stderr:error log是否重定向到上面写的输出log文件
exitcodes:默认为0.文档里写好像是退出时的code与是否重启的关系,这里按照文档里的,默认为0

supervisor配置到这里就结束了,可以先把superviso根据上面写的命令先运行起来,进入交互环境后,先update更新配置,然后reload一下,等一会儿之后,status,看一下程序的状态,如果出错,可能是哪块没配置好根据日志里的错误信息对应修改就好,修改完之后需要重新reload或者restart一下,这样supervisor就先运行起来了

5. nginx配置

1. cd /etc/nginx/  进入nginx目录
2. ls 之后会发现有一个`nginx.conf`的配置文件
3. vim nginx.conf  在`http`块里有include包含这两个目录下的配置文件(见下图),新增的配置文件就写到这俩目录下(如果没有这俩目录需要新建同名目录)
4. cd /etc/nginx/sites-enabled/   (两个目录自行选择一个)
5. 然后编辑文件:vim example.conf (文件名可以随便写,只要后缀是.conf就可以)
6. 配置如下:
server {
    listen 5010;
    client_max_body_size 50M;

    server_name 127.0.0.1;

    location / {
        access_log  /home/test/logs/nginx.api_test.access.log;
        error_log   /home/test/logs/nginx.api_test.error.log;
        include uwsgi_params;
        uwsgi_pass unix:///home/test/run/api_test.sock;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

在这里插入图片描述
listen:nginx监听的端口,可以有多个server指向同一个端口,只要server_name不同就好
client_max_body_size:客户端最大上传数据大小
server_name:用于配置基于名称的虚拟主机(这里可以直接写域名也可以写ip,也可以使用通配符)
location:路由分发块
access_log和error_log是两个日志文件的位置,自行指定
uwsgi_params:是nginx的设置,直接导入即可
uwsgi_pass:指向上面uwsgi.ini文件中的socket文件
剩下的是设置请求头的一些参数

6. 结束

到这里就配置完了
设置完之后使用:sudo nginx -s reload 重启nginx,就可以了
现在访问:127.0.0.1:5010 已经可以访问到我的项目了

你可能感兴趣的:(部署)