有两个测试环境dev和test,因为公众号设定的限制,只能设2个回调域名,生产环境占用了一个,测试就只能来回切换,老是被测试和前端问在哪个环境。 写个脚本,粗暴点,实现 接收参数、读文件并正则、执行linux命令。(没有错误处理是不可取的)
路由1:http://xx.com:8090/wechat
获取当前环境
路由2:http://xx.com:8090/wechat?env=XX
修改nginx配置文件的接口代理环境并重加载
程序后台挂起:nohup go run ./wechat_env.go &
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os/exec"
"regexp"
"github.com/gin-gonic/gin"
)
var r = gin.New()
func main() {
gin.ForceConsoleColor()
r.Use(gin.Logger())
r.Use(gin.Recovery())
r.GET("/wechat", func(c *gin.Context) {
env := c.DefaultQuery("env", "")
filePath := "/etc/nginx/sites-enabled/new_wechat.conf"
msg := ""
switch env {
case "":
env = GetEnv(filePath)
msg = "当前环境为" + env
case "dev":
fallthrough
case "test":
// 修改配置
conf := ModifyConfig(env)
// 加载配置
NginxReload(conf, filePath)
msg = "环境切换" + env + "成功"
break
default:
msg = "环境参数错误"
}
c.JSON(http.StatusOK, gin.H{
"message": msg,
})
return
})
r.Run(":8090")
}
# 获取当前环境,使用正则匹配
func GetEnv(filePath string) string {
conf, _ := ioutil.ReadFile(filePath)
reg := regexp.MustCompile(`http://local\.yxt-up-api-([a-z]+)`)
result := reg.FindAllStringSubmatch(string(conf), -1)
log.Println("当前环境:" + result[0][1])
return result[0][1]
}
# 修改配置文件,其实只是模板的sprintf
func ModifyConfig(env string) string {
template := `
# %s
server {
listen 80;
server_name _;
root /vda2/var/www/new-wechat/dist;
location / {
try_files \$uri \$uri/ /index.html;
}
location /api/ {
proxy_pass http://local.yxt-up-api-%s/;
}
}
`
log.Println("修改环境为:" + env)
return fmt.Sprintf(template, env, env)
}
# 修改文件,并重加载nginx配置
func NginxReload(conf string, filePath string) {
cmd1 := `echo "` + conf + `" > ` + filePath
exec.Command("bash", "-c", cmd1).Run()
err := exec.Command("bash", "-c", "nginx -s reload").Run()
if err != nil {
log.Println(err)
}
}