最近部署基于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-available
再ln -s
到/etc/nginx/sites-enabled
底下,重启nginx服务,收工啦~https扔给cdn处理,这边不配置443端口了。
参考链接: