云主机配置微信公众号后台全记录
阅读指南
预备资源
拥有一台 CentOS 系统的服务器或计算机
良好的网络
至少有一种已会使用的编辑器(本文中使用
vim
)
预备技能
基本的 Linux 系统操作能力
基本的 Python3 编程技能
对“管理员权限”、“虚拟环境”、“包管理”、“网络代理”等概念有基本认识
0. 创建新用户
注意:
(1) “<user_name>
”替换成你实际的项目名称;
(2) 你会发现,非root
用户的主目录是/home
的子目录。
(3) 设置密码的步骤是必须的。
1. 更新包管理器yum
及安装相关工具包
注意:
(1) 由于是个人使用,在root
账号下,以下的sudo
命令其实都是不必需的;
(2) yum
是类似于Ubuntu
下apt-get
般的存在;
(3) 尽管 CentOS 下 shell 的命令提示符为#
,但为了此处不与 Markdown 的记号冲突,我会始终使用$
。
说明:此步骤无报错。每个命令运行成功输出内容均以“Complete!”结尾,中间遇到的确认一律 yes(输入y
),当然你也可以选择对于每一个yum
命令添加-y
参数,就会一路 yes 自动安装下去了,下同。
2. 安装 Python3
2.1 基础安装
注意:
(1) 执行python3.6 -V
在 2019.2.19 的结果是 Python 3.6.7;
(2) 此时如果使用which python3
或which pip3
均会报错,因为它们的实际名字分别是python3.6
和pip3.6
;
(3) 如果你是用其他方式安装的 Python3,那么这里你可能会遇到文件冲突(尤其是当 Python3 的版本不一致的时候);
(4) 不推荐源码编译安装(除非你是娴熟的老司机)。
说明:此步骤无报错。
2.2 (软)链接python3
和pip3
好了,对于在 MacOS 已经习惯使用python3
和pip3
这样的命令的我们来说,每次都要写3.6
未免也太臃肿了(简单估算一下是要多 28.6%的敲击频率),而且一些代码也需要额外做调整,费时费力。我们可以使用ln
来创建(软)链接:
这样我们就可以自由地使用python3
和pip3
了。
注意:
(1) 关于ln
命令:在不同的目录,用到相同的文件时,不需要在每一个目录下都放一个必须相同的文件,只须在某个固定的目录,放上该文件,然后在其它的目录下用ln
命令链接它就可以,不必重复地占用磁盘空间。这里只是把它用成类似alias
的功能。
(2) 随手可以把pip
更新到最新版本(不过这里其实不需要完成更新,因为在虚拟环境中如希望使用最新版本pip
,需要在虚拟环境中更新)
3. 创建虚拟环境
创建虚拟环境的目的是保证业务独立,各依赖库版本控制不受其他项目影响。
Python3 中内置了venv
模块来创建虚拟环境。
注意:
(1) “<project_name>
”替换成你实际的项目名称,“<venv_name>
”替换成你实际的虚拟环境名称;
(2) 激活虚拟环境见 4.2 小节,(在激活状态下)退出虚拟环境使用命令deactivate
;
(3) 有两种方案,第一种就是像这里给出的将虚拟环境相关文件的目录设在所需项目中(项目导向);第二种你可以在主目录下创建目录venvs
,然后将所有的虚拟目录创建在其下(文件管理导向)。
(4) 以下内容如无特别说明,执行的系统命令都在~/<project_name>/
目录中。
4. 搭建服务器
4.1 安装服务器配置所需的工具
4.2 在虚拟环境中安装 Python 程序依赖的第三方库
注意:
(1) 以上 Pypi 安装的库中:
requests
,beautifulsoup4
和lxml
:爬虫业务相关(非必需),
flask
:所采用的 Web 框架(非必需),
gunicorn
:是一个高性能的 Python WSGI UNIX HTTP 服务器(必需),
werobot
:此处开发微信公众号的核心库(必需),
cryptography
:当你在微信后台基本配置选择的消息传输方式是“兼容模式”或“安全模式”时,WeRoBot 所需要的密码库(推荐,非必需)。
(2) 似乎 CentOS7 系统自带了nginx
,因为后来我which nginx
得到的是/usr/sbin/nginx
,而其他通过yum
安装的命令工具都在/usr/bin/
下。
说明:此步骤无报错。cryptography
库是我后来调试时根据异常信息后才知道要安装的。另外,假如你没有将pip
更新到最新,会看到提示信息:
强迫症都会更新的。
4.3 配置 Nginx 反向代理
4.3.1 创建项目的 Nginx 配置文件
在所打开的空文件中完成监听及反向代理的配置(没有注释的部分我也还不太懂,按照 Flask 官网教程写的),:wq
保存关闭。
4.3.2 启动 Nginx 服务
每当你修改任意的 Nginx 配置文件后,都需要重启nginx
来使配置生效:
注意:
(1) “<project_name>
”替换成你实际的项目名称,“<我的 ECS 公网 ip>”替换成你的公网 ip 或外部域名;
(2) 查看 Nginx 状态使用命令sudo systemctl status nginx
;要停止 Nginx 服务,使用sudo service nginx stop
。
说明:这个地方卡了我很长的时间,由于是第一次部署服务器和第一次开发微信公众号,甚至定位问题出现在这里都费了很多工夫。特别要注意配置文件中server_name
和location
这里,参看Nginx: Server names,特别是当查看 Nginx 状态时遇到suspicious symbol
的异常时。
(3) [2019-05-20 补充] 即使在/etc/nginx/conf.d
中,也不要重复设置server
,尤其是同一个 ip,否则会造成地址冲突,导致服务启动失败。(这里的 2 条补充是由于我遇到了修改 nginx 后无法恢复公众号服务的问题)
(4) [2019-05-20 补充] sudo nginx -t
用来检查你的配置文件是否正确。每次更新 nginx 配置文件后,要在restart
和enable
前使配置重新加载sudo nginx -s reload
。如果你做了以上这些仍然无法恢复你的项目,尝试去腾讯微信公众平台去“停用”并重新“启用”服务器配置。
4.4 部署一个"Hello World!"的 Flask-WeRoBot 项目
4.4.1 创建一个robot.py
,用来管理你的机器人(自动回复程序)
注意:token
和encoding_aes_key
务必与微信公众平台设置的“令牌(Token)”和“消息加解密密钥(EncodingAESKey)”保持一致(前者是自定义的,后者是提交服务器设置时微信那边随机生成的)
说明:在 WeRobot 的官方文档和很多网上博客资料的“Hello World”中没有强调encoding_aes_key
参数,因为他们默认在微信公众平台设置选择的是“明文模式”。
4.4.2 创建一个app.py
,作为主应用程序
注意:rule
参数的值结尾处的/
必须有,因为要同 Nginx 配置信息以及微信设置的 URL 保持一致。
4.5 启动 Gunicorn 服务器
4.5.1 尝试启动 Gunicorn 服务器
这时你的终端就会显示服务器的监听状态,类似于下面这样:
然后打开网页浏览器,输入 url:http://<我的ECS公网ip>/<project_name>/
,如果你看到一个中心标题为“这是一个 WeRoBot 应用”的页面而非“404”、“502”这种错误页面,说明你的服务器启动成功了(Nginx 反代理也设置正确了)。退出Control + c
。
4.5.2 创建 WSGI 入口文件
文件内容如下:
这个文件存在的意义是业务逻辑分离。
现在启动 Gunicorn 服务器就变为
5. 完成微信公众平台设置
这里默认你已经完成了微信公众号的申请。
登录微信公众平台后,在左侧下方找到 开发 >> 基本配置 >> 修改配置,然后填写服务器信息,根据本文的上下文约定,填写的内容应该符合这个格式:
项目内容 URLhttp://<我的 ECS 公网 ip>/<project_name>/Token<我的令牌>EncodingAESKey 操作:选择随机生成消息加解密方式操作:选择安全(或明文/兼容)模式
随后点击提交完成设置。
注意:在点击提交前请确定服务器已启动。EncodingAESKey 处的字符串对应上文中的“<我的消息加解密密钥>”
评论