首页
学习
活动
专区
工具
TVP
发布

nginx 实现接口版本控制

背景

近期项目做了不兼容的升级,项目上线时需要考虑两个版本的兼容。由于项目代码并未考虑接口版本控制,因此需要部署一套新版本的系统,并使用 nginx 对两个版本的接口进行分发。

实现思路

考虑了两种实现实现方式:

  1. 配置新的子域名,用于标识版本号,如:v2.api.xxx.com,新版本使用该域名进行调用
  2. 在原来接口前面添加版本前缀进行标识,如:api.xxx.com/v2/users

考虑项目情况,最终决定使用第二种方式,因为如果使用第一种方式会存在如下问题:

  1. 一些服务需要重新配置域名白名单,如微信小程序需要重新添加业务域名等
  2. 目前项目 tls 没有配置为泛域名,因此如果使用新的域名还需要配置 tls

实现

项目服务使用 php 实现,并使用了 laravel 框架,如果是其他技术实现,需要做相应的修改。

实现步骤:

  1. 启动新的 php-fpm 服务,使用新的端口号 9001,旧版本 php 监听了 9000 端口
  2. 修改 nginx 配置文件如下,为了看起来清晰,这里省略了不相关的配置

server {
    listen 80;
    listen       443 ssl;
    
    server_name  api.xxx.com;

    index  index.html index.htm index.php;

    # 新版本配置
    location /v2/ {
        root   /var/www/code-v2/public;
        
        # 注意这里重定向到 php 代码时添加了 /v2 前缀
        try_files $uri $uri/ /v2/index.php?$query_string;
    }

    # 这里捕获去除 /v2 前缀的部分,捕获内容会放到 $1 变量中
    location ~ /v2(/.*\.php) {
        root   /var/www/code-v2/public;

        fastcgi_pass localhost:9001;

        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        
        # 这里使用 $1 作为脚本名(fastcgi_script_name)
        fastcgi_param SCRIPT_FILENAME $document_root$1;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }


    # 旧版本配置
    location / {
        root   /var/www/code/public;
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        root   /var/www/code/public;

        fastcgi_pass localhost:9000;

        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

注意事项

  1. nginx 中 root 配置一定要放到 location 下,因为两个版本使用的代码不在一个目录
  2. 因为项目中并不存在 /v2 目录,因此通过 fastcgi 转发到 php 的时候(SCRIPT_FILENAME 参数),要捕获去掉 /v2 前缀的路径部分,而不再使用 $fastcgi_script_name 变量
  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/38979ef4d44321f54f719b2ad
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券