写点什么

云主机配置微信公众号后台全记录

用户头像
小jack
关注
发布于: 2021 年 02 月 26 日
云主机配置微信公众号后台全记录

阅读指南

预备资源

  1. 拥有一台 CentOS 系统的服务器或计算机

  2. 良好的网络

  3. 至少有一种已会使用的编辑器(本文中使用vim

预备技能

  1. 基本的 Linux 系统操作能力

  2. 基本的 Python3 编程技能

  3. 对“管理员权限”、“虚拟环境”、“包管理”、“网络代理”等概念有基本认识

0. 创建新用户

$ adduser <user_name>                        # 创建新用户<user_name>$ passwd <user_name>                         # 设置新用户的密码$ usermod -aG wheel <user_name>              # 使<user_name>获得sudo权限$ su <user_name>                             # 切换至用户<user_name>
复制代码

注意:

(1) “<user_name>”替换成你实际的项目名称;

(2) 你会发现,非root用户的主目录是/home的子目录。

(3) 设置密码的步骤必须的。


1. 更新包管理器yum及安装相关工具包

$ sudo yum update                            # 更新yum$ sudo yum install yum-utils                 # 安装yum-utils$ sudo yum groupinstall development          # 一并安装一系列常用包
复制代码

注意:

(1) 由于是个人使用,在root账号下,以下的sudo命令其实都是不必需的;

(2) yum是类似于Ubuntuapt-get般的存在;

(3) 尽管 CentOS 下 shell 的命令提示符为#,但为了此处不与 Markdown 的记号冲突,我会始终使用$

说明:此步骤无报错。每个命令运行成功输出内容均以“Complete!”结尾,中间遇到的确认一律 yes(输入y),当然你也可以选择对于每一个yum命令添加-y参数,就会一路 yes 自动安装下去了,下同。


2. 安装 Python3

2.1 基础安装
$ sudo yum install https://centos7.iuscommunity.org/ius-release.rpm  # 安装IUM repo$ sudo yum install python36u                 # 安装Python3.6$ sudo yum install python36u-pip             # 安装pip包管理$ sudo yum install python36u-devel           # 安装其他相关开发包
复制代码

注意:

(1) 执行python3.6 -V 在 2019.2.19 的结果是 Python 3.6.7;

(2) 此时如果使用which python3which pip3均会报错,因为它们的实际名字分别是python3.6pip3.6

(3) 如果你是用其他方式安装的 Python3,那么这里你可能会遇到文件冲突(尤其是当 Python3 的版本不一致的时候);

(4) 不推荐源码编译安装(除非你是娴熟的老司机)。

说明:此步骤无报错。


2.2 (软)链接python3pip3

好了,对于在 MacOS 已经习惯使用python3pip3这样的命令的我们来说,每次都要写3.6未免也太臃肿了(简单估算一下是要多 28.6%的敲击频率),而且一些代码也需要额外做调整,费时费力。我们可以使用ln来创建(软)链接:

$ ln -s /usr/bin/python3.6 /usr/bin/python3  # (软)链接python3$ ln -s /usr/bin/pip3.6 /usr/bin/pip3        # (软)链接pip3
复制代码

这样我们就可以自由地使用python3pip3了。

注意:

(1) 关于ln命令:在不同的目录,用到相同的文件时,不需要在每一个目录下都放一个必须相同的文件,只须在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接它就可以,不必重复地占用磁盘空间。这里只是把它用成类似alias的功能。

(2) 随手可以把pip更新到最新版本(不过这里其实不需要完成更新,因为在虚拟环境中如希望使用最新版本pip,需要在虚拟环境中更新)


$ pip3 install --upgrade pip                 # 将pip更新至最新
复制代码

3. 创建虚拟环境

创建虚拟环境的目的是保证业务独立,各依赖库版本控制不受其他项目影响。

Python3 中内置了venv模块来创建虚拟环境。


$ mkdir <project_name> && cd <project_name>  # 创建并进入<project_name>目录$ python3 -m venv <venv_name>                # 创建名为<venv_name>的虚拟环境
复制代码

注意:

(1) “<project_name>”替换成你实际的项目名称,“<venv_name>”替换成你实际的虚拟环境名称;

(2) 激活虚拟环境见 4.2 小节,(在激活状态下)退出虚拟环境使用命令deactivate

(3) 有两种方案,第一种就是像这里给出的将虚拟环境相关文件的目录设在所需项目中(项目导向);第二种你可以在主目录下创建目录venvs,然后将所有的虚拟目录创建在其下(文件管理导向)。

(4) 以下内容如无特别说明,执行的系统命令都在~/<project_name>/目录中。


4. 搭建服务器

4.1 安装服务器配置所需的工具
$ sudo yum install gcc uwsgi nginx
复制代码
4.2 在虚拟环境中安装 Python 程序依赖的第三方库
$ source ~/<project_name>/<venv_name>/bin/activate   # 激活虚拟环境<venv_name>$ pip3 install requests beautifulsoup4 lxml flask gunicorn werobot cryptography
复制代码

注意:

(1) 以上 Pypi 安装的库中:

requests

beautifulsoup4lxml:爬虫业务相关(非必需),

flask

:所采用的 Web 框架(非必需),

gunicorn

:是一个高性能的 Python WSGI UNIX HTTP 服务器(必需),

werobot

:此处开发微信公众号的核心库(必需),

cryptography

:当你在微信后台基本配置选择的消息传输方式是“兼容模式”或“安全模式”时,WeRoBot 所需要的密码库(推荐,非必需)。

(2) 似乎 CentOS7 系统自带了nginx,因为后来我which nginx得到的是/usr/sbin/nginx,而其他通过yum安装的命令工具都在/usr/bin/下。

说明:此步骤无报错。cryptography库是我后来调试时根据异常信息后才知道要安装的。另外,假如你没有将pip更新到最新,会看到提示信息:


You are using pip version 9.0.1, however version 19.0.2 is available.You should consider upgrading via the 'pip install --upgrade pip' command.
复制代码

强迫症都会更新的。

4.3 配置 Nginx 反向代理

4.3.1 创建项目的 Nginx 配置文件

$ sudo vim /etc/nginx/conf.d/<project_name>.conf   # 创建项目所需的nginx配置文件
复制代码

在所打开的空文件中完成监听及反向代理的配置(没有注释的部分我也还不太懂,按照 Flask 官网教程写的),:wq保存关闭。

server {    listen 80;    server_name <我的ECS公网ip>;               # 有域名的朋友这里填域名
access_log /var/log/nginx/access.log; # 设置正常通信日志 error_log /var/log/nginx/error.log; # 设置报错日志
location /<project_name>/ { proxy_pass http://127.0.0.1:8000; # 反向代理Gunicorn本地的服务地址 proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}
复制代码

4.3.2 启动 Nginx 服务

$ sudo systemctl start nginx$ sudo systemctl enable nginx
复制代码

每当你修改任意的 Nginx 配置文件后,都需要重启nginx来使配置生效:

$ sudo systemctl restart nginx
复制代码

注意:

(1) “<project_name>”替换成你实际的项目名称,“<我的 ECS 公网 ip>”替换成你的公网 ip 或外部域名;

(2) 查看 Nginx 状态使用命令sudo systemctl status nginx;要停止 Nginx 服务,使用sudo service nginx stop

说明:这个地方卡了我很长的时间,由于是第一次部署服务器和第一次开发微信公众号,甚至定位问题出现在这里都费了很多工夫。特别要注意配置文件中server_namelocation这里,参看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 配置文件后,要在restartenable前使配置重新加载sudo nginx -s reload。如果你做了以上这些仍然无法恢复你的项目,尝试去腾讯微信公众平台去“停用”并重新“启用”服务器配置。


4.4 部署一个"Hello World!"的 Flask-WeRoBot 项目

4.4.1 创建一个robot.py,用来管理你的机器人(自动回复程序)

from werobot import WeRoBot
robot = WeRoBot( token='<我的令牌>', encoding_aes_key='<我的消息加解密密钥>', app_id='<我的开发者ID>')
@robot.handlerdef hello(message): return 'Hello World!'
复制代码

注意:tokenencoding_aes_key务必与微信公众平台设置的“令牌(Token)”和“消息加解密密钥(EncodingAESKey)”保持一致(前者是自定义的,后者是提交服务器设置时微信那边随机生成的)

说明:在 WeRobot 的官方文档和很多网上博客资料的“Hello World”中没有强调encoding_aes_key参数,因为他们默认在微信公众平台设置选择的是“明文模式”。


4.4.2 创建一个app.py,作为主应用程序

from flask import Flaskfrom robot import robotfrom werobot.contrib.flask import make_view
app = Flask(__name__)app.add_url_rule(rule='/<project_name>/', # WeRoBot挂载地址 endpoint='werobot', # Flask的endpoint view_func=make_view(robot), methods=['GET', 'POST'])

if __name__ == '__main__': app.run()
复制代码

注意:rule参数的值结尾处的/必须有,因为要同 Nginx 配置信息以及微信设置的 URL 保持一致。

4.5 启动 Gunicorn 服务器

4.5.1 尝试启动 Gunicorn 服务器

# 最简单的命令方式(默认绑定的是127.0.0.1:8000)$ gunicorn app:app# 或者设置一些参数的方式$ gunicorn -w 3 -b 127.0.0.1:8000 app:app
复制代码

这时你的终端就会显示服务器的监听状态,类似于下面这样:

[2019-02-28 12:13:54 +0800] [16859] [INFO] Starting gunicorn 19.9.0[2019-02-28 12:13:54 +0800] [16859] [INFO] Listening at: http://127.0.0.1:8000 (16859)[2019-02-28 12:13:54 +0800] [16859] [INFO] Using worker: sync[2019-02-28 12:13:54 +0800] [16862] [INFO] Booting worker with pid: 16862[2019-02-28 12:13:54 +0800] [16863] [INFO] Booting worker with pid: 16863[2019-02-28 12:13:54 +0800] [16864] [INFO] Booting worker with pid: 16864
复制代码

然后打开网页浏览器,输入 url:http://<我的ECS公网ip>/<project_name>/,如果你看到一个中心标题为“这是一个 WeRoBot 应用”的页面而非“404”、“502”这种错误页面,说明你的服务器启动成功了(Nginx 反代理也设置正确了)。退出Control + c

4.5.2 创建 WSGI 入口文件

$ sudo vim wsgi.py
复制代码

文件内容如下:

from app import app
if __name__ == '__main__': app.run()
复制代码

这个文件存在的意义是业务逻辑分离。

现在启动 Gunicorn 服务器就变为


$ gunicorn wsgi:app # 或$ gunicorn -w 3 -b 127.0.0.1:8000 wsgi:app
复制代码

5. 完成微信公众平台设置

这里默认你已经完成了微信公众号的申请。

登录微信公众平台后,在左侧下方找到 开发 >> 基本配置 >> 修改配置,然后填写服务器信息,根据本文的上下文约定,填写的内容应该符合这个格式:


项目内容 URLhttp://<我的 ECS 公网 ip>/<project_name>/Token<我的令牌>EncodingAESKey 操作:选择随机生成消息加解密方式操作:选择安全(或明文/兼容)模式

随后点击提交完成设置。

注意:在点击提交前请确定服务器已启动。EncodingAESKey 处的字符串对应上文中的“<我的消息加解密密钥>

用户头像

小jack

关注

还未添加个人签名 2020.06.10 加入

还未添加个人简介

评论

发布
暂无评论
云主机配置微信公众号后台全记录