Part:本地虚拟机上安装centos
-
先安装一个 -
然后可以克隆几个demo,需要注意的是克隆的demo记得修改网卡的mac地址 防止地址冲突。
安装好之后进入terminal可以用命令ip add查看ip地址。

然后我们在Xshell中来测试是否能够连接到我们的虚拟机。

Part:安装Nginx
如果是新环境首先安装gcc gcc-c++, 输入命令:
yum install -y gcc gcc-c++
输入命令后大概界面返回如下:

然后安装wget,一般情况下应该装好了。
yum -y install wget
然后再安装PCRE库
cd /usr/local/
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz
tar -zxvf pcre-8.33.tar.gz
cd pcre-8.33
./configure
make && make install
再安装SSL库、zlib库。前面PCRE安装用的下载安装包、解压、配置、安装的过程。当然其实也可以用yum install去安装SSL和zlib库。按照提示回到y即可。
yum install openssl
当然按照装PCRE库的方法装zlib也是可以的。压缩包的地址可以在zlib网站上查。
cd /usr/local
wget https://www.zlib.net/zlib-1.2.13.tar.gz
tar -zxvf zlib-1.2.13.tar.gz
cd zlib-1.2.13
./configure
make && make install
最后就是安装Nginx了。
cd /usr/local
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure
make && make install
输入:
/usr/local/nginx/sbin/nginx
ps -aux | grep 'nginx'
就可以在进程中看到nginx了。

同时我们也可以用如下命令,看nginx是否启起来了。
curl 127.0.0.1
从下面的图中,其实我们看到nginx已经启动起来了,能拿到HTML页面。
但是这个时候直接在浏览器中访问虚拟机ip是无法显示出页面的。因为防火墙的原因。所以使用命令关闭防火墙就可以在浏览器中访问了。
// 临时关闭
systemctl stop firewalld
// 禁止开机启动
systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.services
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service

Part:利用Nginx代理访问API接口功能
前面两篇教程讲过了怎么利用uvicorn实现接口API的功能。这里我们希望搞通下面两个功能。
-
通过网页访问到API接口服务; -
在Python代码中实现API接口服务访问;
其实两个搞通是同时的,只是我们发送请求的方式不同罢了。
→把API功能启起来
这里我们用8000端口启动。把前两篇教程提到的几个文件:main.pylibs.pymodel.py放到虚拟机的某个目录下面。看自己喜欢吧。我是放在下面这个地方的,如图:

启动项目服务,使用命令:
uvicorn main:app --reload --port=8000
这里–port=8000可以不指定,因为默认就是8000端口。

这个时候可以自己在虚拟机上的浏览器尝试访问http://127.0.0.1:8000/看能不能拿到应用中的app.get()方法的结果。正常情况下,在虚拟机本地访问是会成功的。
当然,你也可以在你的主机上试试用地址:http://虚拟机ip:8000/访问,看是不是能成功。不知道大家的情况如何,反正我是失败了。访问被拒绝,看上去像被防火墙阻止了8000端口的外部访问,但其实我防火墙是关了的。跟前端大佬聊过这个情况,估计因为电话沟通的原因,他也觉得这个情况很玄学。不过没有关系,我们还有Nginx,可以间接搞定它。至于这个玄学的东西,后面我解决了再告诉大家。
如果我们在主机上,无法直接通过虚拟机ip和端口8000访问到虚拟机8000端口上的服务,那么我们前面要搞通的那两个功能就失败了。
到这里实际情况是:1. 虚拟机本地可以访问,远程连接无法访问到8000端口;2. Nginx启动起来后,http://虚拟机ip:80/可以访问到虚拟机上Nginx启动在80端口上的页面。
那么我们就可以利用通了的80端口Nginx去反向代理到8000端口上的API接口服务。我们只需要对Nginx的配置文件做一点点修改。
Nginx的配置文件在下图所示:

配置文件nginx.conf具体修改如下:

找到server块,还是保持在80端口监听localhost。在location / 块里面可以把 root html; index,index.html…这两行用#注释掉。在下面补上关键的一行:
proxy_pass http://127.0.0.1:8000/;
这句很容易理解,就是把我们在80端口拿到的请求通过nginx转发给localhost的8000端口去响应。所以直接访问不同,我们仍可以利用nginx访问到API接口服务。
改完配置文件,保存,覆盖掉conf目录中原来的nginx.conf。然后重启nginx服务。重启服务的命令:
/usr/local/nginx/sbin/nginx -s reload
重启nginx之后,再访问http://虚拟机ip:80/显示就不是Nginx那个欢迎页面了。正常情况下就能显示API接口服务的响应结果了。比如我这里显示如下:

当然我们可以把API接口服务在虚拟机上停止了,那么再通过80端口发送的get请求就拿不到8000端口上响应结果了。这是如果你没有改Nginx的其他配置,返回的就应该是Nginx默认的错误页面如下:

→在主机python程序中调用虚拟机上的API接口服务
我们做远程数据API接口服务,主要目的不是要通过网页请求去拿到数据。大多数时候,我们还是用程序去读取API接口返回的数据信息。
比如这个例子中,API接口服务启动在虚拟机的8000端口上,我们通过Nginx已经可以通过80端口把请求转发到8000端口的服务上。我们在Python代码中获取8000端口服务的代码怎么写呢?其实很简单,用requests给我们提供的方法即可。
import requests
r = requests.post('http://192.168.235.129:80/multi_post')
print(r.text)
这里我们用requests向虚拟机的80端口发送一个post请求。返回的结果如下:

再测试下get请求:
import requests
r = requests.get('http://192.168.235.129:80/')
print(r.text)

Part:小结
至此测试成功,如果想把量化模型计算好的数据通过API接口服务的方式提供给他人用代码访问,流程也就通了。后续就是如何限制访问权限和设计接口功能了。
原文始发于微信公众号(拒绝拍脑袋):接口API开发系列(3)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/54783.html