- Linux(包括Windows下的WSL/WSL2)
Windows系统也可以使用Cygwin,已测试✅ - Python3
这是一个基于Python Flask框架编写的Web应用,用于收集课程的班级作业。
本App使用Nginx配合uWSGI作为Web服务器,同时使用Supervisor对uWSGI进行管理。Nginx只响应从指定端口进入的请求,因此服务可以比较安全地挂在公网上。国内很多云服务提供商都有云服务器免费体验的活动,虽然配置不高,但运行该应用(收集一个班的作业)完全足够。
项目的Nginx配置中采取了限流措施,当Nginx服务器触发限流时,网页会返回503错误,此时可以刷新网页重试。此外,脚本和uWSGI的配置文件中设置了服务的进程数和线程数,可以自行修改。
同学们通过网站上传文件后,项目根目录下会多出uploads/
和database/
目录。其中uploads/x
目录存放了第x
次提交作业的所有提交文件,而database/x
目录存放着第x
次提交作业的所有提交记录。
(也可以不使用虚拟环境,但建议在虚拟环境中操作)
pip3 install virtualenv
virtualenv ~/app_env # 虚拟环境的路径和名称也可以自己指定
cd ~/app_env
source bin/activate # 激活该虚拟环境,激活成功后命令行会出现 (app_env) 字样
若之后想要取消激活,直接在命令行输入deactivate
命令即可。
- Linux:
(CentOS可以使用yum安装Nginx)
sudo apt update
sudo apt install nginx
pip3 install uwsgi uwsgitop supervisor
- Cygwin:
首先安装Nginx,Cygwin安装Nginx的步骤见此。
接着,使用apt-cyg或者原生的包管理器安装python3-devel
和libintl-devel
包。下一步安装过程中,编译whl文件时需要用到。
最后,安装uWSGI, uwsgitop和Supervisor:
pip3 install uwsgi uwsgitop supervisor
git clone https://github.com/NewComer00/NJUST_HomeworkCollector.git ./app
cd app
pip3 install -r requirements.txt
chmod x app_manager.sh
觉得麻烦的话,可以将激活环境命令加入app_manager脚本export APP_ROOT=...
这行之后:
source ${APP_ROOT}/../bin/activate
- Cygwin:
app_manager.sh
脚本用到了envsubst
命令,Cygwin需要安装gettext
包来获取这个命令。
./app_manager.sh [options] start
启动命令示例,请不要使用sudo
。第一次运行时大概率会报错,不用惊慌,请查看下文“可能出现的问题”:
./app_manager.sh -n 0 -b "测试提交页面" -p 8080 start
[options]
必须放在start
等命令之前才会生效。[options]
代表可选参数,具体如下:
-n <数字>
<数字>表示这是<第几次>交作业,如1表示第一次。该参数的默认值为1
。
-b <字符串>
<字符串>作为网页的<一级标题>。该参数的默认值为"2021 云数据管理课程"
。
-p <数字>
<数字>表示网页服务所在的<端口号>。该参数的默认值为8080
。
启动后可以在浏览器中访问网站:
http://<机器的ip地址>:<端口号>/
- 由于我们之前安装Python包等操作是在普通用户下进行的,
./app_manager.sh
请一样通过普通用户执行,不需要使用sudo ./app_manager.sh
。使用sudo
会找不到之前安装的Python包。如执行./app_manager.sh start
命令后提示文件无法打开、Permission denied
等问题,请参考下一条解决。 - 在执行start命令后,Nginx可能会提示一些文件或目录无法找到。如果提示以
[alert]
开头,这只是一个警告,Nginx正常启动,可以不用管它。如果提示以[emerg]
开头,代表这是一个紧急情况,Nginx启动失败,需要根据错误提示操作,比如手动创建那些未找到的文件或目录(如确有需要,可以放宽新建文件的访问权限)。 - 上传文件后,项目根目录下会多出
uploads/
和database/
目录。uploads/x
目录存放了第x次提交作业的文件,database/x
目录存放着第x次提交作业的提交记录,x为启动时用-n
指定的数字。 - 若提交文件后出现
CSRF token invalid
报错横幅,表示当前页面的CSRF令牌已经过期,刷新一下页面,重新提交即可。
./app_manager.sh stop
执行后,关闭所有相关进程。
在应用已经启动的情况下,若应用的源码或者配置被修改,可以执行重启操作来使改动生效:
./app_manager.sh [options] restart
top -U <用户名>
的方式查看用户当前运行进程。
应用启动后,Nginx, uWSGI和Supervisor的运行日志位于logs/
目录下,在应用无法正常运行时可供参考。
Python程序本身的输出和报错不在命令行显示,被重定向并保存至uWSGI相关的日志中。在Nginx和uWSGI的日志中可以查看服务器收到的请求信息。
使用uwsgitop可以查看当前网站服务的负载情况,监控端口在uWSGI的配置文件中默认为5001:
uwsgitop http://localhost:5001/
-
以管理员身份运行Cygwin。
-
使用apt-cyg或者原生的包管理器安装
cygrunsrv
和nginx
包。 -
执行
cygserver-config
命令,在交互时输入yes
。 -
安装Nginx的后台程序:
/etc/rc.d/init.d/nginx install
可能会提示一些路径不存在,但只要最后输出“done”,即表示成功。
- 安装好的后台程序位于
/usr/sbin/nginx
。
将/usr/sbin
添加至Cygwin的环境变量:
export PATH="$PATH:/usr/sbin"
# 这是临时方法,为避免麻烦可以考虑将这句加入app_manager脚本开头
- 运行帮助指令:
nginx -h
若正常输出版本信息和帮助信息,即安装成功。