动态添加/删除nginx配置文件里的location python/Lua实现
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;
}
}
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()
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)