最近部署基于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 supervisorsupervisor的全局配置位于/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-available再ln -s到/etc/nginx/sites-enabled底下，重启nginx服务，收工啦~https扔给cdn处理，这边不配置443端口了。参考链接：Flask+uwsgi+Nginx部署应用启动uwsgi出现!!! no internal routing support, rebuild with pcre support !!!