一次接口nginx502的排查经历

接口是一个生成全景作品的接口,接口会经历下载、切图、上传三个步骤。接口大部分时间运行是正常的,图片数量过多时会Nginx502。

排查经历

首先了解502是什么类型的错误,502 错误表明 Nginx 作为代理服务器时,无法从上游服务PHP-FPM获取有效响应。

先排查nginx配置的超时时间

是否超时时间过短导致的服务断开。nginx超时相关配置为/www/server/nginx/conf/proxy.conf

proxy_connect_timeout 60;# 连接上游超时
proxy_read_timeout 300;# 读取响应超时
proxy_send_timeout 120;# 发送请求超时

调大连接上游超时和读取响应超时,程序在多图时依然502。

考虑调整php.ini配置

看到接口设置了set_time_limit(0);和ini配置max_execution_time一样只影响脚本本身执行的时间,已经设置了不超时,可是程序还是提前退出了。

考虑调整php-fpm配置

/www/server/php/73/etc/php-fpm.conf

其中有一个配置是

request_terminate_timeout = 300s #整个PHP进程生存时间

进程超时优先大于脚本执行超时,如下图示:

所以会出现set_time_limit(0);不生效

临时解决

调大上述参数

终极解决

切图任务不要放在控制器处理,改用消息队列。

小程序web-view和原生程序交互

交互的前提是安装jssdk

npm i weixin-js-sdk

官方手册:开放能力 / web-view

实现跳转到原生程序的某个页面
wx.miniProgram.navigateTo({url: '/pages/xxx/xxx?from=xx&id=xxx&phone=xxx'});//可以携带参数,此外可以支持redirectTo等详见手册
onLoad(options) {}//小程序对应页面拿到参数
实现小程序分享web-view页面
//H5
wx.miniProgram.postMessage({
    data: {
        type: "share",// 标识分享操作
        title: xxx,// 动态标题
        path: "/pages/xxx/xxx?isofficial=1&pageurl=" + pageurl // 目标路径
    }
});
//Mini
<web-view id="webView1" src="{{pageurl}}" bindmessage="handleMessage">
handleMessage(e) {
    const msgData = e.detail.data[e.detail.data.length - 1]; // 取最新一次消息
    if (msgData.type === "share") {
        this.setData({
            shareTitle: msgData.title,    // 更新分享标题
            sharePath: msgData.path       // 更新分享路径
        });
    }
}
onShareAppMessage() {
    return {
        title: this.data.shareTitle,
        path: this.data.sharePath       // 携带动态路径
    };
}
//此时小程序分享的卡片打开就是这个web-view内的H5页面