最近需要在腾讯云服务器上部署接口,由于是第一次接触服务器,同时也是第一次写接口(谁让我本科期间专业课大作业划水了。。。),因此在这里记录一下我遇到的问题以及解决方法。
一、服务器部署环境
我租的服务器是腾讯云服务器,从网上找视频才知道登录方法,首先要找到“实例”部分,然后在自己已经购买的服务器那里点击登录,一般会要求扫码,可以设置为不需要扫码验证,登录之后会跳转到腾讯云OrcaTerm上面,这个应该连接是腾讯云服务器专用的平台,然后会发现[root@xxx ~]#,这就意味着已经成功登录了,腾讯云服务器是centos系统,这点后面还会说到。
注意,现在登录的是root用户,我一开始没关注这一点,直接在root用户下面开始安装anaconda之类的应用,但是我导要求我尽量在普通用户下面进行调试,只有必要的时候才能sudo root的权限,于是后来之好全部删掉,然后su到普通用户部署环境。
二、普通用户的ls、sudo等命令不起作用
这时候出现了新的问题,su到普通用户和再su到root都没有问题,但是在普通用户下面的sudo、ls、mkdir等最基础的命令都不能执行,输入sudo命令输完密码后就显示Sorry,try again,根据网上的提示更改了/etc/sodoer文件,在里面加入了xxx ALL=(ALL) ALL也不行,经过导师提醒,决定更改.bashrc文件,但是因为我曾经下载anaconda的时候已经更改过.bashrc文件,删去anaconda之后.bashrc文件基本上没什么东西了,于是从/etc/skel/下面复制过来一份原始的.bashrc文件
cp /etc/skel/.bashrc ~/
之后再进行更改,具体见下面https://blog.csdn.net/haockl/article/details/103780952
但是我遇到了一些问题,我更改的.bashrc文件在每次重新登陆服务器之后里面添加的路径就又没有了,我就只能每次在重新登陆之后进入/etc文件夹source ./profile文件,而且有时候source一次还不行,连续source好几次才可以起效,虽然有点麻烦,但是能用就行吧。
三、下载anaconda
这个我比较有经验了,su到普通用户,使用wget命令访问anaconda官网的下载链接,下载还是很快的,一开始我使用清华源的链接,但是没有成功,不知道为什么。
之后就按照网上的链接安装anaconda。
四、下载包
不知道为什么,我登录的腾讯云服务器总是掉线,每次都只能重新登陆,这样就又重新回到没有任何操作的时候,在pip软件包的时候更是这样,动不动就掉线,很长时间都下不下来东西,后来就开始尝试清华源,然后速度快到飞起,很后悔一开始没有直接尝试。
还有就是,有的软件包pip很慢,但是使用conda反而会快一些,比如pyarrow包,我自己使用pip下载根本下不下来,看到网上有人说别尝试pip install prarrow,使用下面这个命令:
conda install -c conda-forge pyarrow
果然很快就下载下来了。
在运行video那个项目的时候,因为要调用cv2,我的环境不能支持,报下面的错误:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
但是网上都是说的Ubuntu系统下的解决方案:
apt-get update
apt-get install libgl1-mesa-glx
我把apt-get命令换成了yum,但是还是不行,还好在网上看到了下面的命令:
yum install mesa-libGL
成功了,我还看到有一篇文章也在讲这个,附在这里:https://blog.csdn.net/qq_50195602/article/details/124188467
五、接口部署到服务器
先涉及到文件的上传,我是只上传了训练好的模型和运行代码,以及包含html文件的template文件夹,腾讯云服务器在使用页面上的SFTP上传文件的时候有一个限制,就是文件必须在200MB以下,我训练的其中一个模型超过了这个限制,于是使用scp命令,但是我犯了一个错误,我是在服务器的终端运行的这行代码,于是服务器就一直提醒我找不到文件,直到n分钟之后,我突然意识到,这个命令应该在本地的终端运行。
上传之后修改文件的权限,否则可能无法运行。
在本地调试的时候,因为app.run()的时候使用的是本机的host127.0.0.1,但是部署到服务器上之后运行没有办法显示我自己写的前端html界面,也就根本接收不到输入的数据。
后来我把本机host改成服务器内网的IP,还是一样,改成外网IP之后,直接显示Address already in use。
后来请教一位同学,他说是因为前后端没有分离,我就又去恶补前后端的知识,但是没怎么看懂,涉及到什么vue框架啥的,还好我看到了下面的博客:在服务器部署一个可被外网访问的flask示例
我自己的代码改动只有下面这些:
from gevent import pywsgi
……
if __name__=='__main__':
server = pywsgi.WSGIServer(('0.0.0.0',8080),app)
server.serve_forever()
这样在服务器上运行api.py代码的时候就可以使用浏览器通过公网IP地址访问了。
七、结果
submit之后返回的结果: