简介:当我们的微信小程序需要服务器支持业务的时候,首先可以考虑的就是云开发,云开发的提供的可视化数据库,以及云函数,可以实现服务器的绝大部分功能,可见功能是很强大的。但是我们要清楚一点,云开发不是一个完整的服务器,它没有提供一个可以访问的地址,没有一台真正的虚拟主机。如果只是为小程序提供服务的时候是绰绰有余的,但是如果它要和一个服务器一样,对一些其他终端,比如电脑手机还有单片机等,是不行的,这时候我们就需要搭建一个真正的服务器。这篇文章我基于stm32单片机为微信小程序提供地址信息的背景下搭建的简易服务器。
我会介绍很详细每一步的指令还有一些错误的处理方式,以及列出我所有参考的博客和资料,请需要的朋友仔细看,一定会有所收获的。
第一部分 linux服务器的搭建
1.服务器的选择和购买
我是购买的腾讯云的学生服务器,配置不是很高,但是够用了,服务器的购买我这里不作赘述,可以参考腾讯云的文档和视频。但是要注意的一点是服务器的操作系统,centOS6+和cenOS7+的操作系统差别很大,尤其是在防火墙的设置上。本文是基于操作系统centOS6.9的,centOS7的服务器我会提及一些,并且给出一些参考文档。
2.服务器的环境搭建(python3+flask框架)
(1)配置python3环境
使用mkdir创建一个目录,用来放置python3。
cd进入到目录中,ll查看目录中的所有文件
[root@localhost bin]# mkdir /usr/local/python3
[root@localhost bin]# cd /usr/local/python3
[root@localhost python3]# ll
把安装包下载下来,使用下面这个命令
[root@localhost python3]# wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
等待下载完成之后会在当前目录下出现一个tgz包,命令解压这个包到当前目录就可以:
#解压命令
[root@localhost python3]# tar -xvf Python-3.6.3.tgz
#解压完成后,查看目录下文件
[root@localhost python3]# ll
total 22148
drwxr-xr-x. 17 501 501 4096 Oct 21 12:22 Python-3.6.3
-rw-r--r--. 1 root root 22673115 Oct 3 15:47 Python-3.6.3.tgz
就要开始安装了,因为下载的包是未编译的,我们需要编译一下。进入文件目录:
[root@localhost python3]# cd Python-3.6.3/
[root@localhost Python-3.6.3]#
然后如下命令(执行完这句命令之后,不要切换到别的目录,不然会非常懵逼,因为执行完之后如果去/usr/local/下面的看的话是没有python3Dir目录的):
[root@localhost Python-3.6.3]# ./configure --prefix=/usr/local/python3Dir
稍微解释上面这句命令,这句话的大致目的就是把python的安装目录指定一下,这样的话,里面的一些bin目录、lib目录就都会存放在这个目录下面。如果不指定这个安装目录的话,最后python的安装文件将分散到linux的默认目录,不在一块。我们指定安装目录,以后卸载的话直接删除目录就可以干净卸载了。
现在我们当前目录还是在/usr/local/python3/Python-3.6.3,执行如下命令:
[root@localhost Python-3.6.3]# make
然后出来一大堆代码,等它执行完毕。接着输入以下命令:
[root@localhost Python-3.6.3]# make install
又是一大堆代码,执行完毕之后,我们就可以切换到/usr/local/python3Dir目录下去查看了。
[root@localhost Python-3.6.3]# cd /usr/local/python3Dir/
[root@localhost python3Dir]# ll
total 0
drwxr-xr-x. 2 root root 245 Oct 21 12:26 bin
drwxr-xr-x. 3 root root 24 Oct 21 12:26 include
drwxr-xr-x. 4 root root 63 Oct 21 12:26 lib
drwxr-xr-x. 3 root root 17 Oct 21 12:26 share
[root@localhost python3Dir]#
接下来我们还有一点善后工作。切换到 /usr/bin目录下面吧:
[root@localhost python3Dir]# cd /usr/bin
#然后输入以下命令 ,创建一个软链接
[root@localhost bin]# ln -s /usr/local/python3Dir/bin/python3 /usr/bin/python3
[root@localhost bin]# ln -s /usr/local/python3Dir/bin/pip3 /usr/bin/pip3
a.安装python3报错
在configure那一步我们安装python3的时候有时候会发现报错,因为我们买的服务器里缺少有效的c编译器
安装gcc编译器使用命令:
yum -y install gcc
安装g++编译器使用命令:
yum -y install gcc-c++
(不能使用yum -y install g++,否则提示没有g++这个包名)
b.缺少pip3报错
我们安装python3的时候有时候会出现包里没有pip3而报错,处理方式如下
安装pip前需要前置安装setuptools
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26
解压,并且进入解压目录
tar -zxvf setuptools-19.6.tar.gz
进入目录并安装
cd setuptools-19.6
python3 setup.py build
python3 setup.py install
#这里报错了:RuntimeError: Compression requires the (missing) zlib module
因此需要在linux中安装zlib-devel包,进行支持
当然,如果没有报错(上面安装python的时候如果安装了zlib相关依赖就不会报错),则不需要进行此步骤,直接跳到第5步,直接安装pip
yum install zlib-devel
这时又需要对python3.6进行重新编译安装。
cd Python-3.6.0 # 这里根据个人设置,进入之前的Python解压后的安装包的所在路径
make && make install
漫长的编译安装过程后,再重新安装setuptools
#记得重新回到自己的setuptools-19.6目录下
python3 setup.py build
python3 setup.py install
安装pip
tar -zxvf pip-9.0.1.tar.gz # 解压
cd pip-9.0.1 # 进入目录
python3 setup.py install # 安装
更新pip3 pip3 install --upgrade pip
(2)安装flask第三方库,并且配置你的程序
很多博客都提到了需要安装一个虚拟环境,但是实际上虚拟环境是为了应对多版本的兼容问题。实际上如果服务器的业务比较简单,文件比较少的话可以不用虚拟环境。大部分博客也提到了要安装nginx和uWSGi,其实这两个可以不用装,只是简单flask框架足以处理所有的http请求
sudo pip3 install Flask
这时候可以尝试运行一下你的程序
假设我们的程序如下
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world!'
if __name__='__main__':
app.run(port=9000)
使用vim指令创建一个你的文件,并且运行它你会发现会报错?为什么是因为你的防火墙端口还没打开
vim的使用可以参考下面这个博客https://www.cnblogs.com/nanyu/p/9123196.html
(3)开放防火墙端口
我们的腾讯云的服务器刚买来默认开放的端口只有22,而阿里云的好一些,会开发3306,22等等,但是我们提供服务的端口不能重合,所以要设置端口,使它处于监听状态下,查看打开的端口
/etc/init.d/iptables status
Centos查看端口占用情况命令,比如查看80端口占用情况使用如下命令:
lsof -i tcp:80
列出所有端口
netstat -ntlp
开启端口(以80端口为例)
方法一:
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT 写入修改
/etc/init.d/iptables save 保存修改
service iptables restart 重启防火墙,修改生效
方法二:
vi /etc/sysconfig/iptables 打开配置文件加入如下语句:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 重启防火墙,修改完成
如果你的服务器操作是7.0及以上就不能使用iptables指令了,7改成了firewall,所以你可以参考下面这个博客
https://www.cnblogs.com/eaglezb/p/6073739.html
(4)为服务器开通http服务
如果你打开了端口运行了程序还是不行,是因为腾讯云的服务器刚买来的时候开通的网络服务只有ssh,所以你要为它配置http服务
yum install httpd vsftpd
设置开机自启动
启动服务http
service httpd start
如果你的服务器是centOS7版本的那么你可以参考下面这个文档
https://www.cnblogs.com/jefflee168/p/6403500.html
(5)配置服务器的https服务
如果你想给服务器配置一个https服务,拥有安全ssl安全证书更安全的服务。这个服务可以让你的网址在微信小程序的后台配置。这时候你就需要去申请一个域名并且实名认证,以及备案。详细流程请参考腾讯云的文档,写的很详细,你备案成功会拿到一个安全证书,请把它配置到服务器上,参考下面博客可以帮助你配置https服务
https://blog.csdn.net/caoshunxin01/article/details/79355291
需要注意的是如果你想要备案网站是要很久的,如果比较急的开发者不建议。
(6)配置supervisor
如果你想要把你的程序挂在服务器上一直运行不掉的话,可以使用nohup指令,但是这个指令它虽然很简单粗暴,但是不可靠。
Supervisord是一个守护进程的工具,当进程意外终止或服务器掉电起来后,希望进程能够自动运行,supervisord可以很好的为我们做这件事情。同时supervisord也自带监控界面,可以通过浏览器灵活的查看、操作。
安装supervisor
ubantu:sudo apt-get install supervisor
centos: yum install supervisor
配置supervisord.conf文件
找到supervisord.conf配置文件,一般centos 在/etc/ 目录下,ubantu 在/etc/supervisor/ 目录下,用root权限打开该文件:
sudo vim /etc/supervisord.conf
在文件末尾添加如下几行:
[program:myProgram]
command=python /home/myname/test.py
autostart=true
autorestart=ture
stdout_logfile=/home/myname/test.log
注释:第一行的myProgram自己取个名字,表示你的项目就行
第二行的python /home/myname/test.py表示你运行程序的命令
第三行表示自动启动,如果值为false则表示不自动启动
第四行表示自动重启,如果值为false则表示不自动重启
最后一样表示程序打印出的信息都记录在该test.log文件内,是log文件
启动supervisor和程序,命令行输入:
sudo supervisord
supervisord -c /etc/supervisord.conf
supervisor常用指令
sudo service supervisor stop #停止supervisor服务
sudo service supervisor start #启动supervisor服务
supervisorctl shutdown #关闭所有任务
supervisorctl stop|start program_name #启动或停止服务
supervisorctl status #查看所有任务状态
一切准备就绪,服务器已经可以用啦,使用ps -A指令会发现,进程中有supervisor
第二部分 小程序的云开发和服务器建立练习
如果之前已经把服务器的https服务配置好的朋友,只需要使用API中wx.request就可以和服务器通信了,但是如果我们的服务器没有备案,没有域名,只能通过http访问,就只能通过云开发中的云函数来实现这一功能。而且小程序后台合法的https网址最多也只能配置5个有的时候是不够用这时候也可以使用云函数。云开发小程序的创建这里不做赘述,可以看小程序云开发的文档。我这里为了发送http请求加入了一个got依赖。
这里有一个云函数的部署问题,每次云函数修改,一定要右键云函数文件夹把它部署到云端上,不然你模拟器在模拟它的时候它实际上是没有更新的,只有在本地调试的时候才能体现更新。
(1)云函数的本地配置
打开cmd,进入到配置的云函数的根目录,切记是云函数的根目录,不是小程序根目录。
接下来安装我们的两个依赖wx-server-sdk和got。这里有一个巨坑,npm安装got的时候一定要按照我下面写的方式来装,不要直接npm install got。因为云函数的环境是node.js的8.9版本,而本地的是10+,所以如果直接这样装的话会导致你的云函数在调用的时候根本不能用,但是在云函数本地调试的时候却可以用。这里要特别感谢社区的大佬 undefined ,大佬帮我解决了这个困扰了我好久的问题。
(2)云函数的程序编写
- get 请求方式
// 云函数入口文件
const cloud = require('wx-server-sdk')
const got = require('got');
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
let getResponse = await got('httpbin.org/get')
return getResponse.body
}
- post 请求方式
// 云函数入口文件
const cloud = require('wx-server-sdk')
const got = require('got');
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
let postResponse = await got('httpbin.org/post', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body:JSON.stringify({
title: 'title test',
value: 'value test'
})
}) return postResponse.body
}
- pages/http 文件
http
// pages/http/http.js
Page({
http: function(event) {
wx.cloud.callFunction({
name: 'http'
}).then( res => {
console.log(res.result) // get
console.log(JSON.parse(res.result)) // post
})
}
})
这里要特别纠正一下,上面是网上的参考,但是这样子的写法,在云函数那块是会报错的不能这样写,这里还是要特别感谢大佬 undefined 的帮助,他纠正了我的云函数写法,应该按照下面这样写
结语:我开发了一个stm32单片机发送定位信息的通信系统的服务器端和手机监控端,从0开始,前前后后一共做了3个星期,经历了很多曲折,多亏了社区里一些朋友的积极知道,我从一个菜鸟总算入了一些门道,还得感谢我的朋友王菲凡,她帮助了我很多,是一个合格小黄鸭(逃)。
这篇博客总结了我的心得和体会,适合向我一样的新手看。
感谢你们看到这里,如果你们觉得有用就点个赞再走吧。
参考资料:
安装pip3参考下面这个博客https://blog.csdn.net/qq_25046261/article/details/78985109
centos7关闭和开启防火墙参考下面这个简述博客https://www.jianshu.com/p/bad33004bb4f
当我在部署flask框架的时候参考了这个博客https://cloud.tencent.com/developer/article/1249279
使用linux的vim的时候参考下面这个博客https://www.cnblogs.com/nanyu/p/9123196.html
使用centos7的时候开放端口参考如下博客https://www.cnblogs.com/Sungeek/p/8257681.html
centos6开放端口参考如下这个博客https://cloud.tencent.com/developer/article/1137647
centos配置python3的时候参考下面这个博客https://www.cnblogs.com/simuhunluo/p/7704765.html
更新pip3 pip3 install --upgrade pip
配置防火墙http服务https://blog.csdn.net/q982151756/article/details/80281412s
flask常用组件https://www.cnblogs.com/kendrick/p/7590648.html
iptables配置参考https://wiki.debian.org/iptables以及https://yq.aliyun.com/articles/253681?spm=5176.10695662.1996646101.searchclickresult.715145cbw0kh5K
配置服务器允许http协议参考https://blog.csdn.net/zuoyigexingfude/article/details/51035613
centos7和6服务器端口配置https://www.cnblogs.com/eaglezb/p/6073739.html
配置服务器的https参考:https://blog.csdn.net/Xeon_CC/article/details/92407534
使用supervisor参考https://blog.csdn.net/u013421629/article/details/79174313
配置centos6的http服务参考这个博客https://blog.csdn.net/caoshunxin01/article/details/79355291
centos7配置http服务参考这个博客https://www.cnblogs.com/jefflee168/p/6403500.html
got使用参考了这个https://www.jianshu.com/p/c8a497579617
0110 0110 0110