微信小程序自研业务接口的服务器一点配置记录整理

微信小程序的开发和APP的开发有些类似,但又略有不同。

App一般有很多版本,甚至要兼容很多版本兼容,尤其是各个小版本之间一般都是要共存的。当然如果有较大变化或者升级,尤其是底层逻辑或者数据库结构改动,一般会强制升级。

因为要多个版本兼容,互相不影响使用,那么服务器的接口就需要多版本共存。

一般为了支持多版本共存,就需要对API做一个版本的划分,服务端的代码,当然也需要按版本做好不同的区分。

大致方案如下:

一、每一个版本一套完整独立的代码

  这种方法简单直接,也特别号理解,简单的说,就是每升级一次,就完全复制一套完整的代码,比如可以利用SVN或者GIT的分支,来实现。开发完成后直接整套部署。

  优势很明显,简单且完全独立,便于独立部署,且各个版本之间完全不影响,互相不依赖,易于维护。

  不足也明显,就是如果版本较多,升级频率较高则会产生大量的冗余重复代码。

二、一套代码所有版本在一起,在类(Class)或者方法(Function)上区分,做好路由选择

  优势也算明显,就是代码量少,整体就一套。

  不足略微多一点,不恰当的维护风险很高,代码容易过于臃肿,各个版本之间依赖增加,不利于长期维护,也不支持每个版本独立部署。

当然,实际开发中,往往会综合考虑,会将两种方式结合,大版本之间各自独立,减少依赖和实现大版本独立部署,小版本一个项目内兼容,减少代码量。

有了前边这些铺垫,我们看看微信小程序的特点,找出一个适合微信小程序的情况。

微信不是APP,不需要下载,正常情况只要重新启动小程序基本就自动更新成最新的版本了。当然,微信也可以控制用户强制刷新。

因此,接口设计或许就不需要像APP那样搞出多个版本过于复杂,不利于维护,只要能很好的完成无感切换即可。

根据开发需要,暂定了将接口代码分成了AB两个版本部署,开发代码是一套(一个项目),看看效果如何。

这样一个项目维护绝对是便于维护,代码也不会冗余,维护时根本不需要考虑版本问题,每个开发人员只要将最新的功能实现即可,最后版本控制由上线部署时做好区分即可。

简单描述下:部署时,可以在同一个WEB目录,建立AB两个目录,小程序只需要传回AB两个不同的参数,就会知道API的选择了,然后由nginx解析选择即可,服务端代码中完全不用考虑任何版本问题。

AB两个版本,也正好可以实现,正式上线对外前,体验版时也可以使用生产环境的一切配置和数据,相当于两套(版本)代码同时在生产环境,正式小程序调用A接口,体验版调用B接口。可以很好的完成预上(仿真)线测试。

这个思路,对于服务端代码和小程序代码,都是非常简单的,几乎可以完全忽略版本问题。只要配置好nginx就可以了。

最早想到这个方案的时候,正经兴奋了好一阵子,尤其是配置好nginx调试通过后,感觉完美^_^。

 

将nginx的部分配置附上

server {
    listen          80;
    listen          443 ssl http2;
    server_name     mp.abc.com;
    root            /www/wwwroot/a/public;
    index           index.php index.html index.htm;
    etag on;

    gzip on;
    gzip_vary on;
    gzip_http_version 1.0;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 2;
    gzip_disable msie6;
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/xml+rss;

    client_max_body_size 110m;
    client_body_buffer_size 1024k;

    keepalive_timeout   60;

    sendfile on;
    sendfile_max_chunk 512k;
    tcp_nopush on;
    tcp_nodelay on;

    ssl_certificate   /www/server/panel/ssl/xxx.pem;
    ssl_certificate_key  /www/server/panel/ssl/xxx.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location ^~ /a {
        alias /www/wwwroot/a/public;
        if (!-e $request_filename) {
                rewrite ^ /a/index.php last;
        }

        location ~ \.php$ {
                if (!-f $request_filename) {
                        return 404;
                }
                #fastcgi_pass        unix:/tmp/php-fpm-72.sock;
                fastcgi_pass        127.0.0.1:9000;
                fastcgi_index       index.php;
                fastcgi_param       SCRIPT_FILENAME $request_filename;
                include             fastcgi_params;
        }
    }

    location ^~ /b {
        alias /www/wwwroot/b/public;
        if (!-e $request_filename) {
                rewrite ^ /b/index.php last;
        }

        location ~ \.php$ {
                if (!-f $request_filename) {
                        return 404;
                }
                #fastcgi_pass        unix:/tmp/php-fpm-72.sock;
                fastcgi_pass        127.0.0.1:9000;
                fastcgi_index       index.php;
                fastcgi_param       SCRIPT_FILENAME $request_filename;
                include             fastcgi_params;
        }
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        #fastcgi_pass        unix:/tmp/php-fpm-72.sock;
        fastcgi_pass        127.0.0.1:9000;
        fastcgi_index       index.php;
        fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include             fastcgi_params;
    }

    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }
}

这个段配置主要的不同就是加粗的部分,其他都是nginx的通用内容。

简单理解就是在同一个web目录下,建立两个不同的目录,然后每次上线时,将最新代码部署到对应的AB目录中即可。相当于接口代码先上线,然后体验版测试生产环境。

没问题后,小程序直接提审即可。通过后新打开小程序的用户自动切换到新接口,一直使用的用户或者缓存等更新不及时一直使用原接口。当然也可以强制更新。

目前使用至今,这个方案一直没有什么问题。

哪位朋友有其他方法也可以分享多多交流。

整篇帖子有说错的地方,烦请指出,十分感谢!

 

微信小程序调用接口地方的配置附上

/* 
* 针对生产环境:切换生产环境接口目录,两个版本交替上线使用不同的目录 * 例如:生产版本1.0使用目录“a”,则pre版本1.1提前修改成“b” *    下一次生产版本1.1使用的是目录“b”,而本地pre提前修改成“a” */ const VERSION = 'a'; const STORAGE = '1.0'; // 接口各个环境的域名配置 const MP_HOST = []; MP_HOST['dev'] = 'http://dev.abc.com'; MP_HOST['pre'] = 'https://pre.abc.com'; MP_HOST['pro'] = 'https://mp.abc.com/' + VERSION;

 

热门相关:超武穿梭