nginx 实现接口版本控制

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"背景"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"近期项目做了不兼容的升级,项目上线时需要考虑两个版本的兼容。由于项目代码并未考虑接口版本控制,因此需要部署一套新版本的系统,并使用 nginx 对两个版本的接口进行分发。"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"实现思路"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"考虑了两种实现实现方式:"}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"配置新的子域名,用于标识版本号,如:v2.api.xxx.com,新版本使用该域名进行调用"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"在原来接口前面添加版本前缀进行标识,如:api.xxx.com/v2/users"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"考虑项目情况,最终决定使用第二种方式,因为如果使用第一种方式会存在如下问题:"}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"一些服务需要重新配置域名白名单,如微信小程序需要重新添加业务域名等"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"目前项目 tls 没有配置为泛域名,因此如果使用新的域名还需要配置 tls"}]}]}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"实现"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"项目服务使用 php 实现,并使用了 laravel 框架,如果是其他技术实现,需要做相应的修改。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"实现步骤:"}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"启动新的 php-fpm 服务,使用新的端口号 9001,旧版本 php 监听了 9000 端口"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"修改 nginx 配置文件如下,为了看起来清晰,这里省略了不相关的配置"}]}]}]},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"server {\n listen 80;\n listen 443 ssl;\n \n server_name api.xxx.com;\n\n index index.html index.htm index.php;\n\n # 新版本配置\n location /v2/ {\n root /var/www/code-v2/public;\n \n # 注意这里重定向到 php 代码时添加了 /v2 前缀\n try_files $uri $uri/ /v2/index.php?$query_string;\n }\n\n # 这里捕获去除 /v2 前缀的部分,捕获内容会放到 $1 变量中\n location ~ /v2(/.*\\.php) {\n root /var/www/code-v2/public;\n\n fastcgi_pass localhost:9001;\n\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n \n # 这里使用 $1 作为脚本名(fastcgi_script_name)\n fastcgi_param SCRIPT_FILENAME $document_root$1;\n fastcgi_param PATH_INFO $fastcgi_path_info;\n }\n\n\n # 旧版本配置\n location / {\n root /var/www/code/public;\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n root /var/www/code/public;\n\n fastcgi_pass localhost:9000;\n\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param PATH_INFO $fastcgi_path_info;\n }\n}\n"}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"注意事项"}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"nginx 中 root 配置一定要放到 location 下,因为两个版本使用的代码不在一个目录"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"因为项目中并不存在 /v2 目录,因此通过 fastcgi 转发到 php 的时候(SCRIPT_FILENAME 参数),要捕获去掉 /v2 前缀的路径部分,而不再使用 $fastcgi_script_name 变量"}]}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章