发现一个修改nginx.conf配置文件的python开源工具,挺好用的,分享一下:
这个工具可以读取,修改以及删除nginx的配置项,然后重新生成配置文件。这其中保留了大部分原始配置文件格式,有一些会改变;所以不保证新生成的文件格式完全一致,还需要用肉眼比较一下哦。
基本用法:
from pynginxconfig import NginxConfig
nc = NginxConfig()
nc.loadf('/etc/nginx/nginx.conf')
##########################################
# operate with nc
# nc.get(...)
# nc.set(...)
# nc.append(...)
# nc.remove(...)
##########################################
nc.savef('/etc/nginx/nginx.new.conf')
下面以一个例子来说明如何具体访问nginx.conf对象。
/etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
upstream server_www1 {
server www1.com:7054;
}
server {
listen *:10000 ssl;
ssl_certificate /etc/nginx/server.pem;
ssl_certificate_key /etc/nginx/serverkey.pem;
location / {
auth_request /auth-proxy;
error_page 401 403 /404.html;
proxy_pass http://server_www1/;
}
location = /auth-proxy {
internal;
proxy_pass http://www:8000;
proxy_set_header X-Original-URI $request_uri;
proxy_pass_request_body off;
}
}
}
stream {
upstream server_www2 {
server www2.com:9090;
}
server {
listen *:10001 ssl;
ssl_certificate /etc/nginx/server.pem;
ssl_certificate_key /etc/nginx/serverkey.pem;
proxy_pass server_www2;
}
upstream server_www3 {
server www3.com:8080;
}
server {
listen *:10002 ssl;
ssl_certificate /etc/nginx/server.pem;
ssl_certificate_key /etc/nginx/serverkey.pem;
proxy_pass server_www3;
}
}
读取
block = nc.get(('error_log'))
print "BLOCK=", block
# BLOCK=('error_log', '/var/log/nginx/error.log warn')
data = nc.get_value(block)
print "DATA=", data
# DATA=/var/log/nginx/error.log warn
block = nc.get(('events',))
print "BLOCK=",block
# BLOCK={'value': [('worker_connections', '1024')], 'name': 'events', 'param': ''}
data = nc.get_value(block)
print "DATA=",data
# DATA=[('worker_connections', '1024')]
print "DATA=",data[0]
# DATA=('worker_connections', '1024')
print "DATA=",data[0][0]
# DATA=worker_connections
block = nc.get([('http',), ('access_log')])
print "BLOCK=",block
# BLOCK=('access_log', '/var/log/nginx/access.log main')
data = nc.get_value(block)
print "DATA=",data
# DATA=/var/log/nginx/access.log main
block = nc.get([('stream',)])
print "BLOCK=",block
# BLOCK=
# {
# 'value': [
# {'value': [('server', 'www2.com:9090')], 'name': 'upstream', 'param': 'server_www2'},
# {'value': [('listen', '*:10001 ssl'), ('ssl_certificate', '/etc/nginx/server.pem'), ('ssl_certificate_key', '/etc/nginx/serverkey.pem'), ('proxy_pass', 'server_www2')], 'name': 'server', 'param': ''},
# {'value': [('server', 'www3.com:8080')], 'name': 'upstream', 'param': 'server_www3'},
# {'value': [('listen', '*:10002 ssl'), ('ssl_certificate', '/etc/nginx/server.pem'), ('ssl_certificate_key', '/etc/nginx/serverkey.pem'), ('proxy_pass', 'server_www3')], 'name': 'server', 'param': ''}
# ],
# 'name': 'stream',
# 'param': ''
#}
data = nc.get_value(block)
print "DATA=",data
#DATA=
#[
# {'value': [('server', 'www2.com:9090')], 'name': 'upstream', 'param': 'server_www2'},
# {'value': [('listen', '*:10001 ssl'), ('ssl_certificate', '/etc/nginx/server.pem'), ('ssl_certificate_key', '/etc/nginx/serverkey.pem'), ('proxy_pass', 'server_www2')], 'name': 'server', 'param': ''},
# {'value': [('server', 'www3.com:8080')], 'name': 'upstream', 'param': 'server_www3'},
# {'value': [('listen', '*:10002 ssl'), ('ssl_certificate', '/etc/nginx/server.pem'), ('ssl_certificate_key', '/etc/nginx/serverkey.pem'), ('proxy_pass', 'server_www3')], 'name': 'server', 'param': ''}
#]
block = nc.get([('stream',), ('server',), ])
print "BLOCK=",block
# BLOCK={'value': [('listen', '*:10001 ssl'), ('ssl_certificate', '/etc/nginx/server.pem'), ('ssl_certificate_key', '/etc/nginx/serverkey.pem'), ('proxy_pass', 'server_www2')], 'name': 'server', 'param': ''}
data = nc.get_value(block)
print "DATA=",data
#DATA=[('listen', '*:10001 ssl'), ('ssl_certificate', '/etc/nginx/server.pem'), ('ssl_certificate_key', '/etc/nginx/serverkey.pem'), ('proxy_pass', 'server_www2')]
== notice: only get the first one ==
block = nc.get([('stream',), ('upstream', 'server_www2')])
print "BLOCK=",block
#BLOCK={'value': [('server', 'www2.com:9090')], 'name': 'upstream', 'param': 'server_www2'}
data = nc.get_value(block)
print "DATA=",data
#DATA=[('server', 'www2.com:9090')]
block = nc.get([('stream',), ('upstream', 'server_www2'), ('server')])
print "BLOCK=",block
#BLOCK=('server', 'www2.com:9090')
data = nc.get_value(block)
print "DATA=",data
#DATA=www2.com:9090
删除
nc.remove('user')
nc.remove([('events',),('worker_connections')])
nc.remove([('stream',),('server',)])
nc.remove([('stream',),('upstream', 'server_www3',)])
nc.remove([('stream',),('server',),('proxy_pass')])
修改
nc.set('user', 'XXXX')
nc.set([('events',),('worker_connections')], '999')
nc.set([('stream',),('server',),('proxy_pass')], 'WWWWW')
nc.set([('stream',),('upstream', 'server_www3',),('server')], 'NEWSERVER')
List的遍历
for item in nc.get([('stream',)])['value']:
print "NAME=",item['name']
print "VALUE=",item['value']
#NAME= upstream
#VALUE= [('server', 'www2.com:9090')]
#NAME= server
#VALUE= [('listen', '*:10001 ssl'), ('ssl_certificate', '/etc/nginx/server.pem'), ('ssl_certificate_key', '/etc/nginx/serverkey.pem'), ('proxy_pass', 'server_www2')]
#NAME= upstream
#VALUE= [('server', 'www3.com:8080')]
#NAME= server
#VALUE= [('listen', '*:10002 ssl'), ('ssl_certificate', '/etc/nginx/server.pem'), ('ssl_certificate_key', '/etc/nginx/serverkey.pem'), ('proxy_pass', 'server_www3')]