nginx+uwsgi部署Flask服务笔记
direwolf
2021-08-01 0

最近部署基于Flask的AFF工具箱,查了一些资料,在这里记录一下部署的过程。(之前就部署过一次arcaea的测试api,操作过这个流程,然后时间太长给忘了,这次又是从头开始。果然好记性不如烂笔头)

0x00 uwsgi服务

先把代码整到服务器上。我使用的是通过GitHub中转这种方式。因为我在Windows机上进行开发,服务器是Linux环境,在git clone之前先开启autocrlf,确保clone时会自动转换换行符。

git config --global core.autocrlf true

创建一个文件夹,cd进去之后进行git clone。我在这里把clone下来的文件夹重命名为src,得到这样一个目录结构:

afftool
└─ src
   ├─ __init__.py
   └─ blueprints, static, templates, etc.

参考Flask手册,在__init__.py中有一个create_app()函数,这个函数返回一个Flask对象。之后,在src文件夹的外层建立一个入口程序app.py去调用这个create_app()函数:

from src import create_app

app = create_app()
if __name__ == '__main__':
    app.run()

为什么要把入口放在包外面呢?是为了规避相对引用的问题。简单来说,如果把入口放到里面,在from . import create_app时就会踩坑了。相对引用这个坑我踩过不少回,感觉这东西还挺诡异的,有一次报错我死活找不到哪出了问题,最后是删除__pycache__解决的,嗯。扯远了,然后需要建立虚拟环境,只要

python3 -m venv venv
source /venv/bin/activate

就进入虚拟环境了。传代码之前我用pip freeze > requirements.txt记录好了依赖,理论上可以直接pip install -r src/requirements.txt。但是遇到两个问题。首先在安装过程中一些包会报error: invalid command 'bdist_wheel',这个比较好办,先pip install wheel再装依赖就行。另一个问题是在我配置好uwsgi之后,会报!!! no internal routing support, rebuild with pcre support !!!这个错。这个是因为如果你之前安装过uwsgi,pip会拿缓存出来用(也可能是lib没装编译失败)。解决方案就是装好pcre库,无缓存重装uwsgi:

pip uninstall uwsgi
sudo apt-get install libpcre3 libpcre3-dev
pip install uwsgi --no-cache-dir

在配好环境之后,把配置写入uwsgi.ini。我使用的配置文件如下:

[uwsgi]
socket=127.0.0.1:6161  # 服务运行在本地6161端口
wsgi-file=/home/direwolf/afftool/app.py  # 入口
chdir=/home/direwolf/afftool/  # 工作目录
home=/home/direwolf/afftool/venv  # pyhome,设置到虚拟环境
daemonize=/home/direwolf/afftool/uwsgi.log  # 日志
callable=app

然后执行uwsgi --ini uwsgi.ini。见到spawned uWSGI worker 1 (and the only) (pid: 48958, cores: 1)这句话,服务就是跑起来力!不过,为了管理方便,我们还需要用supervisor启动uwsgi服务。

0x01 supervisor配置

首先,安装supervisor:

sudo apt-get install supervisor

supervisor的全局配置位于/etc/supervisor/supervisor.conf,在这里不改动它的全局配置,我们在/etc/supervisor/conf.d下新建一个配置文件afftool.conf,内容如下:

[program:afftool]
command=/home/direwolf/afftool/venv/bin/uwsgi --ini /home/direwolf/afftool/uwsgi.ini
user=direwolf
autorestart=true
autostart=true
startretries=3
redirect_stderr=true
startsecs=5
stdout_logfile=/var/log/afftool/supervisor.log
stopasgroup=true
killasgroup=true
priority=999

在启动服务之前,还有几点需要注意。一,需要把uwsgi.ini里,daemonize=行注释掉,不然supervisor检测不到uwsgi成功运行。二,如果log路径stdout_logfile=不存在,提前mkdir。三,netstat -nultp看一下有没有之前的测试进程占着端口,如果有就kill掉。之后,执行sudo supervisorctl start。再执行sudo supervisorctl status,看到RUNNING就是启动成功了。接下来,再去配置nginx。

0x02 nginx配置

这块老生常谈了,直接放配置文件:

server {
    listen 80;
    server_name aff.arcaea.icu;
    location / {
        include uwsgi_params;
        uwsgi_pass localhost:6161;
    }
}

直接扔到/etc/nginx/sites-availableln -s/etc/nginx/sites-enabled底下,重启nginx服务,收工啦~https扔给cdn处理,这边不配置443端口了。


参考链接:

  1. Flask+uwsgi+Nginx部署应用
  2. 启动uwsgi出现!!! no internal routing support, rebuild with pcre support !!!
评论 0
没有评论
评论已关闭
发表评论
评论 取消回复
Copyright © 2024 .direwolf