nginx可视化配置设置

来源:互联网 发布:qq文件夹删除数据恢复 编辑:程序博客网 时间:2024/06/06 01:16
最近由于功能需要,我们公司需要做一个可以界面化配置nginx的功能,查遍了很多的文档都没有找到这样的插件,不过发现网上也有通过python进行编写出的展示页面,但是都没有真正实现需要的工作任务,所以再三研究就自己进行编写。
整体需要的环境:
安装虚拟机,我自己安装的是centos7版本的,这个版本的内置python版本是2.7的比较高一些,基本可以满足我们设置的需求,不需要额外的安装一些软甲,如果安装的版本较低的时候需要我们安装一系列的插件,这样比较麻烦,我之前就在这上面踩坑较多,希望大家注意。
安装好之后直接执行Python就可以查看到python的版本信息,

安装nginx文件,这个比较简单网上可以有好多的例子,基本都是下载之后放到一个文件下面就行,下面演示就是我自己本地安装的nginx的使用。
1、启动本地安装的nginx
cd /usr/local/nginx/sbin
./nginx -t


查看启动的服务
ps -ef|grep "nginx"
重启
./nginx -s reload
查看启动,关闭

这样说明我们的nginx安装是可以的,由于我们需要对nginx进行多次的测试,所以建议把nginx的停止和重启命令设置为全局使用,这样就方便我们每次在进行启动nginx时到指定的目录下面,配置步骤如下:
2、nginx全局命令配置
#cd /usr/lib/systemd/system
#vi nginx.service
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
保存好后在任意目录下执行,先检查一下进程nginx是否已经启动了,如果启动了先停掉。
#systemctl start nginx.service
没有什么意外发生的话说明我们的服务定义写得没问题,然后再执行
#systemctl enable nginx.service
这样我们的服务就设置为开机启动了
OK,现在我们已经把需要的nginx已经安装完成。
由于我们已经把nginx的服务已经设置好了,现在我们可以直接执行脚本进行nginx的停止和启动

重启命令一样,直接使用

3、接下来我们就可以通过在服务器的Python中进行执行我们的一个脚本来进行支持进行http请求,这样我们就能通过浏览器发送请求对服务器的文件进行操作。
#!/usr/bin/python#encoding=utf-8'''Created on 2017-8-7@author: zhangmenghttp://www.blog.csnd.zhangmeng66基于BaseHTTPServer的http server实现,包括get,post方法,get参数接收,post参数接收。'''"""First backup file and then update all nginx configurein the path "/usr/local/nginx/conf/vhosts".Insert rule is to find the configure of the first "}"after inserting content"""from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServerimport io,shutilimport osimport urllibimport fileinputimport reimport timefrom subprocess import callclass MyRequestHandler(BaseHTTPRequestHandler):    def do_GET(self):        self.process(2)    def do_POST(self):        self.process(1)    def process(self,type):        content =""        i = 'stop'        r = 'restart'        if type==1:#post方法,接收post参数            datas = self.rfile.read(int(self.headers['content-length']))            datas = urllib.unquote(datas).decode("utf-8", 'ignore')#指定编码方式            datas = datas.replace('+',' ')            datas = transDicts(datas)#将参数转换为字典            if datas.has_key('data'):                content = datas['data']                if content==i:                        result = os.popen('service nginx stop').readlines()                        enc="UTF-8"                        content = content.encode(enc)                        f = io.BytesIO()                        f.write("停止成功")                        f.seek(0)                        self.send_response(200)                        self.send_header("Content-type", "text/html; charset=%s" % enc)                        self.send_header("Content-Length", str(len('停止成功')))                        self.end_headers()                        shutil.copyfileobj(f,self.wfile)                        return                elif content==r:                        result = os.popen('service nginx restart').readlines()                        #指定返回编码                        enc="UTF-8"                        content = content.encode(enc)                        f = io.BytesIO()                        f.write("重启成功")                        f.seek(0)                        self.send_response(200)                        self.send_header("Content-type", "text/html; charset=%s" % enc)                        self.send_header("Content-Length", str(len('重启成功')))                        self.end_headers()                        shutil.copyfileobj(f,self.wfile)                        return                else:                        file_list(f_dir,content)            if '?' in self.path:                query = urllib.splitquery(self.path)                action = query[0]            if query[1]:#接收get参数                queryParams = {}                for qp in query[1].split('&'):                    kv = qp.split('=')                    queryParams[kv[0]] = urllib.unquote(kv[1]).decode("utf-8", 'ignore')                    content+= kv[0]+':'+queryParams[kv[0]]+"\r\n"                    #指定返回编码                    enc="UTF-8"                    content = content.encode(enc)                    f = io.BytesIO()                    f.write("添加成功")                    f.seek(0)                    self.send_response(200)                    self.send_header("Content-type", "text/html; charset=%s" % enc)                    self.send_header("Content-Length", str(len(content)))                    self.end_headers()                    shutil.copyfileobj(f,self.wfile)def file_insert(fname, str):    r = ur'server'    f = open(fname)    old = f.read()    num = int(re.search(r, old).start())    f_input = fileinput.input(fname, inplace=1)    #for line in fileinput.input(fname, inplace=1):    for line in f_input:        if r in line:            print line.rstrip()            print "\n"+str+"\n"            f.seek(num+8)            print f.read()            break        else:            print line.rstrip()    f.close()    f_input.close()    #print "OK! The %s configure has been sucessfull added!" % fname    print "Ok! 配置文件%s已经添加成功!" % fnamedef file_list(f_dir,content):    #Check the content of configure,and add the correcsponding content    rsvn = ur'iPlatMBS'    rtar = ur'iPlatMBS'    if os.path.exists(f_dir): #check dir        for f_name in os.listdir(f_dir): #list the dir all configure file            f_path = os.path.join(f_dir,f_name) #Get the filename full path            f1 = open(f_path)            f1_old = f1.read()            f1.close()            if re.findall(rsvn, f1_old) and re.findall(rtar, f1_old):                #print "Notice!  %s have been added ,ignore this configure ...." % f_path                print "Notice! %s 已添加过相关的配置,忽略此配置文件" % f_path                continue            elif re.findall(rsvn, f1_old):                file_insert(f_path, content)            elif re.findall(rtar, f1_old):                file_insert(f_path, content)            else:                file_insert(f_path, content)    else:        print "Warnning! dir %s isn't exists!" % f_dirdef file_backup(f_dir):    # If the file has been backed up with a minute before,will not back up    bak_dir = "/data/nginx_config_bak/" + time.strftime('%Y%m%d_%H_%M')    if not os.path.exists(bak_dir):        os.makedirs(bak_dir)        if os.path.exists(f_dir):            cp = "cp -rp"            cmd = "%s %s %s" % (cp, f_dir, bak_dir)            call(cmd, shell=True) #backup the configuredef transDicts(params):    dicts={}    if len(params)==0:        return    params = params.split('&')    for param in params:        dicts[param.split('=')[0]]=param.split('=')[1]    return dictsif __name__=='__main__':    f_dir = "/usr/local/nginx/conf/vhosts"    try:        server = HTTPServer(('',8080), MyRequestHandler)        print 'started httpserver...'        server.serve_forever()    except KeyboardInterrupt:        server.socket.close()    pass


这是我本地的Python安装路径,

在这个路径下面新建一个python.py的脚本,这是Python的执行脚本,例如:我创建的名字是http.py里面的代码就是上面我贴出来的,

这样我们就把这个服务启动了。
4、接着我们通过界面来进行展示一下效果,

这个只是我简单的页面展示,后期可以进行优化,可以进行,这些使用Java写的,我们后期可以进行优化,
我们可以先进行测试一下停止和重启的按钮进行到服务器执行看行不行,在进行文件的添加。
整个的大致流程就是这样,希望有兴趣的小伙伴可以进行测试一下,并完善一下,这样大家可以资源共享。


原创粉丝点击