动态添加/删除nginx配置文件里的location python/Lua实现

nginx\conf.d\web_ssh.conf:

server {

    listen       82;
    server_name localhost;

    location /21899? {
        rewrite ^/21899/?$ / break;
        rewrite ^/21899/(.*)$ /$1 break;

        proxy_pass http://192.168.11.199:21899;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 300s;

        proxy_set_header Origin '';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

python实现代码:

import os
import re
import traceback
import subprocess
from  multiprocessing  import  Process

port = 21897
host = "192.168.11.199"
path= r"C:\podding\common\nginx\conf.d\web_ssh.conf"
location = """
    location /%s {
        rewrite ^/%s/?$ / break;
        rewrite ^/%s/(.*)$ /$1 break;
        proxy_pass http://%s:%s/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 300s;
        proxy_set_header Origin '';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
"""

def add_location(port, host, path, location):
    """
        func:向nginx配置文件中动态添加location
        params:
            port:动态端口
            host:动态IP
            path:nginx配置文件绝对路径
            location:location文本
    """
    location = location % (port, port, port, host, port)
    lines = []
    with open (path) as fp:
        for line in fp:
            lines.append(line)
    length = len(lines)
    lines.insert(length-1,location)  # 从倒数第2行开始插入想要插入的字符串
    with open(path, "w") as f:
        for line in lines:
            f.write(line)

def delete_location(port, host, path):
    """
        func:向nginx配置文件中动态删除location
        params:
            port:动态端口
            host:动态IP
            path:nginx配置文件绝对路径
    """
    with open (path) as fp:
        text = fp.read()
        print("text:%s" % text)
        pattern = re.compile(r"location /%s(.*?)%s:%s(.*?)}" % (port, host, port), re.S)  # 多行匹配
        out = re.sub(pattern, "", text)
        print("out:%s" % out)
    with open(path, 'w') as f1:
        f1.write(out)



def restart_nginx():
    logger.info("此刻运行的函数是由子进程运行,子进程ID是(%s)"  % os.getpid())
    subprocess.Popen("sudo nginx -s reload", shell=True)
    logger.info("restart nginx ok!")

def reload_nginx():
    p = Process(target = restart_nginx)  # 创建子进程实例,并关联函数
    logger.info("子进程启动...")
    p.start()
    # p.join()  # 这个方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步
    logger.info("子进程结束...")


if __name__  ==  "__main__":
    add_location(port, host, path, location)
    delete_location(port, host, path)
    reload_nginx()

Lua实现代码:

local function add_location(port, host, path, location)
    --[[
        func:向nginx配置文件中动态添加location
        params:
            port:动态端口
            host:动态IP
            path:nginx配置文件绝对路径
            location:location文本
    --]]
    local location = string.format(location, port, port, port, host, port)
    line_array = {}
    for line in io.lines(path) do
        table.insert(line_array, line)
    end
    
    length = #line_array
    table.insert(line_array, length, location)  -- 从倒数第2行开始插入想要插入的字符串
    --[[print('*****')
    for i= 1, #line_array do
        print(line_array[i])
    end--]]
    
    local file, err = io.open (path,"w") --nginx使用root用户,否则无法创建
    if file==nil then
        print("Couldn't open file: "..err)
    else
        for i=1, #line_array do
            file:write(line_array[i])
            file:write("\n")
        end
        file:close()
    end
    
end


local function delete_location(port, host, path)
    --[[
        func:向nginx配置文件中动态删除location
        params:
            port:动态端口
            host:动态IP
            path:nginx配置文件绝对路径
    --]]
    local f1, errormsg = io.open(path, "r")
    if f1 == nil then
        print(errormsg)
    else
        local text = f1:read("*all")  --*all 表示读取所有的文本内容
        f1:close()
        
        --print("text:", text)
        local pattern = string.format("location /%s(.-)%s:%s(.-)}", port, host, port)
        --print("pattern:", pattern)
        
        local out = string.gsub(text, pattern, "")
        --print("out:%s", out)
        
        local f2, err = io.open (path,"w") --nginx使用root用户,否则无法创建
        f2:write(out)
        f2:close()
    end
end


port =27019
host = "192.168.11.199" 
path = "/etc/nginx/conf.d/web_ssh.conf"     
location_webssh = [[
    location /%s/ {
        rewrite ^/%s/?$ / break;
        rewrite ^/%s/(.*)$ /$1 break;
        proxy_pass http://%s:%s;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 300s;
        proxy_set_header Origin '';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
]]

add_location(port, host, path, location_webssh)
delete_location(port, host, path)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值