我是靠谱客的博主 清新大山,最近开发中收集的这篇文章主要介绍nginx可视化配置设置,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近由于功能需要,我们公司需要做一个可以界面化配置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: zhangmeng
http://www.blog.csnd.zhangmeng66
基于BaseHTTPServer的http server实现,包括get,post方法,get参数接收,post参数接收。
'''
"""
First backup file and then update all nginx configure
in the path "/usr/local/nginx/conf/vhosts".
Insert rule is to find the configure of the first "}"
after inserting content
"""
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import io,shutil
import os
import urllib
import fileinput
import re
import time
from subprocess import call

class 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]]+"rn"
                    #指定返回编码
                    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已经添加成功!" % fname

def 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_dir

def 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 configure

def transDicts(params):
    dicts={}
    if len(params)==0:
        return
    params = params.split('&')
    for param in params:
        dicts[param.split('=')[0]]=param.split('=')[1]
    return dicts

if __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写的,我们后期可以进行优化,
我们可以先进行测试一下停止和重启的按钮进行到服务器执行看行不行,在进行文件的添加。
整个的大致流程就是这样,希望有兴趣的小伙伴可以进行测试一下,并完善一下,这样大家可以资源共享。


最后

以上就是清新大山为你收集整理的nginx可视化配置设置的全部内容,希望文章能够帮你解决nginx可视化配置设置所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部