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 變量"}]}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章