JAVA 解析、编辑nginx.conf
最近工程开发遇到一个需求:用Java去解析并编辑nginx.conf
在github上找到nginx-java-parser工具,项目地址:https://github.com/odiszapc/nginx-java-parser
解析nginx.conf过程可以参考该项目的README.md
下面举个列子说明一下该如何编辑nginx.conf。
定义一个pojo
import com.alibaba.fastjson.JSONArray;
import com.google.common.base.Strings;
import lombok.Data; @Data
public class WebHost {
private long id;
private String host;
private String protocol;
private String name;
}
1、添加nginx配置
     public boolean addWebToNginxConfig(WebHost webHost, String fileName) {
         if (webHost == null || Strings.isNullOrEmpty(fileName)) {
             return false;
         }
         try {
             NgxConfig ngxConfig = NgxConfig.read(fileName);
             NgxBlock ngxBlockHttp = ngxConfig.findBlock("http");
             NgxBlock ngxBlockWeb = new NgxBlock();
             ngxBlockWeb.addValue("server");
             ngxBlockHttp.addEntry(ngxBlockWeb);
             if ("https".equals(webHost.getProtocol())) {
                 NgxParam ngxParam = new NgxParam();
                 ngxParam.addValue("listen 443 ssl");
                 ngxBlockWeb.addEntry(ngxParam);
                 ngxParam = new NgxParam();
                 ngxParam.addValue(String.format("server_name %s", webHost.getHost()));
                 ngxBlockWeb.addEntry(ngxParam);
                 String virtualServerName = webHost.formatName();
                 ngxParam = new NgxParam();
                 ngxParam.addValue(String.format("ssl_certificate /etc/nginx/cert/%s.cert", virtualServerName));
                 ngxBlockWeb.addEntry(ngxParam);
                 ngxParam = new NgxParam();
                 ngxParam.addValue(String.format("ssl_certificate_key /etc/nginx/key/%s.key", virtualServerName));
                 ngxBlockWeb.addEntry(ngxParam);
             } else {
                 NgxParam ngxParam = new NgxParam();
                 ngxParam.addValue("listen 80");
                 ngxBlockWeb.addEntry(ngxParam);
                 ngxParam = new NgxParam();
                 ngxParam.addValue(String.format("server_name %s", webHost.getHost()));
                 ngxBlockWeb.addEntry(ngxParam);
             }
             NgxBlock ngxBlockLocation = new NgxBlock();
             ngxBlockLocation.addValue("location");
             ngxBlockLocation.addValue("/");
             NgxParam ngxParam = new NgxParam();
             ngxParam.addValue("proxy_pass http://backend_http");
             ngxBlockLocation.addEntry(ngxParam);
             ngxParam = new NgxParam();
             ngxParam.addValue("proxy_set_header Host $host");
             ngxBlockLocation.addEntry(ngxParam);
             ngxParam = new NgxParam();
             ngxParam.addValue("proxy_set_header X-Real-IP $remote_addr");
             ngxBlockLocation.addEntry(ngxParam);
             ngxParam = new NgxParam();
             ngxParam.addValue("proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for");
             ngxBlockLocation.addEntry(ngxParam);
             ngxBlockWeb.addEntry(ngxBlockLocation);
             String content = new NgxDumper(ngxConfig).dump();
             log.info("{}", content);
             return true;
         } catch (IOException e) {
             log.warn("write nginx.conf to file catch IOException!", e);
         }
         return false;
     }
添加结果示例:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1025;
}
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;
#gzip on;
upstream backend_http {
server 1.1.1.1:80 weight=2;
server 2.2.2.2:80 weight=2;
}
upstream backend_https {
server 1.1.1.1:443 weight=2;
server 2.2.2.2:443 weight=2;
}
server {
listen 80;
server_name aaaa.com;
location / {
proxy_pass http://backend_http;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 443 ssl;
server_name eeee.com;
ssl_certificate /etc/nginx/cert/eeee.com.https.cert;
ssl_certificate_key /etc/nginx/key/eeee.com.https.key;
location / {
proxy_pass http://backend_http;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
2、删除nginx配置
     public boolean deleteWebFromNginxConfig(String host, String fileName) {
         if (Strings.isNullOrEmpty(host) || Strings.isNullOrEmpty(fileName)) {
             return false;
         }
         try {
             NgxConfig ngxConfig = NgxConfig.read(fileName);
             NgxBlock ngxBlockHttp = ngxConfig.findBlock("http");
             List<NgxEntry> serverList = ngxBlockHttp.findAll(NgxConfig.BLOCK,"server");
             for (NgxEntry ngxEntry : serverList) {
                 NgxBlock ngxBlock = (NgxBlock) ngxEntry;
                 NgxParam ngxParam = ngxBlock.findParam("server_name");
                 if (host.equals(ngxParam.getValue())) {
                     ngxBlockHttp.remove(ngxBlock);
                 }
             }
             String content = new NgxDumper(ngxConfig).dump();
             log.info("{}", content);
             return true;
         } catch (IOException e) {
             log.warn("write nginx.conf to file catch IOException!", e);
         }
         return false;
     }
JAVA 解析、编辑nginx.conf的更多相关文章
- Nginx的配置文件(nginx.conf)解析和领读官网
		步骤一:vi nginx.conf配置文件,参考本博文的最下面总结,自行去设置 最后nginx.conf内容为 步骤二:每次修改了nginx.conf配置文件后,都要reload下. index.ht ... 
- Nginx的配置文件nginx.conf解析
		安装openresty的nginx.conf配置文件 0.ng运行的用户和用户组 1.ng进程数,设置为CPU总核心数 2.ng错误日志 3.进程文件,有时ng启动不了,将进程文件删除即可. 4.单进 ... 
- nginx.conf 配置解析之 server配置
		server{} 包含在http{}内部,每一个server{}都是一个虚拟主机(站点) 以下为nginx.conf配置文件中server{ }部分的内容. server { listen ; // ... 
- nginx.conf 配置解析之文件结构
		nginx.conf配置文件结构如下: ...... #主要定义nginx的全局配置 events{ #events(事件)块:主要配置网络连接相关 } http{ #http块:代理缓存和日志定义绝 ... 
- ubuntu 13.04   nginx.conf  配置详解
		1.nginx.conf 文件,路径为:/etc/nginx/agin.conf #使用的用户和组 user www-data; #指定工作衍生进程数(一般等于CPU总核数或总核数的两倍) worke ... 
- centos7下搭建JAVA项目运行环境。  JAVA+MYSQL+TOMCAT+NGINX
		环境: centos 7 64位 一.配置mysql 5.71.下载mysql源安装包wget http://dev.mysql.com/get/mysql57-community-release-e ... 
- Linux(7)- Nginx.conf主配置文件、Nginx虚拟主机/访问日志/限制访问IP/错误页面优化、Nginx反向代理、Nginx负载均衡
		一.Nginx.conf主配置文件 Nginx主配置文件conf/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的.一般,每个区块以一对大括号{}来表示开始与结束. 核心模 ... 
- docker学习(6) docker中搭建java服务及nginx反向代理
		先看下容器规划: 上图中mysql容器的搭建见上篇博客,service1/2为java rest service,创建脚本如下: docker run -d -h service1 \ -v /Use ... 
- CentOS下配置nginx conf/koi-win为同一文件的各类错误
		今天配置CentOS6.5下安装Nginx + php7 + mysql5.7.15遇到了一些坑.本来家里的电脑在配置环境的时候没有问题,拿去公司的电脑上就是到处报错.不知道是不是人品问题.今晚在家重 ... 
随机推荐
- 一些常用软件的静默安装参数(nsis,msi,InstallShield,Inno)
			打包的时候,经常需要安装一些其它的环境库,而又不想让用户繁锁的去选择,这时就需要静默安装,而不同的文件所加的参数了不一致,比如VS的环境库vcredist_x86.exe(这是32位的环境库)后面加/ ... 
- Redis在本地测试没有问题,上传的服务器后出现错误
			在服务器上,new Redis 可以拿到对象数据,但是其他操作就会报错. Redis 开启过程中,遇到错误 . :( protocol error, got 'S' as reply type byt ... 
- 逆波兰表达式POJ——2694
			问题描述: 逆波兰表达式是一种吧运算符前置的算术表达式,例如普通的表达式2+3的逆波兰表示为+23.逆波兰表达式的优点是运算符之间不必有优先级的关系,也不必有括号改变运算次序,例如(2+3)*4的逆波 ... 
- android扫描网页二维码进行网页登录
			转载请标明出处: http://www.cnblogs.com/dingxiansen/: 本文出自:丁先森-博客园 周六和朋友去网吧开黑,开机打开TGP,朋友那边开始输入账号密码,我看了他一眼low ... 
- eclipse 常用插件 整理
			开发过程中的常用Eclipse插件,按字母排序: (1) AmaterasUML 介绍:Eclipse的UML插件,支持UML活动图,class图,sequence图,usecas ... 
- MongoDb安装--yum安装
			本帖最后由 草包 于 2017-5-2 09:57 编辑 [Shell] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 ... 
- gis电子地图开发公司面临的挑战和机遇
			从上个世纪90年代开始电子地图应用就已经收到人们的关注,但是由于时代的局限性和市场经济发展的不成熟.地理信息系统系统的应用并没有得到很好的利用.只有少数的国家机构和军事系统才能够使用这些应用.随着技术 ... 
- Git命令汇总(补充篇)
			上一篇<Git命令汇总基础篇>总结了使用Git的基本命令,这一篇作为补充主要给大家讲一些平时使用中的技巧和总结 . 学会了这些命令,已经基本解决了使用Git中大部分问题. 1.gitign ... 
- Python冒号的解释
			1. "没什么首次没有为第二个,跳了三个".它得到的切片序列的每一个第三个项目. 扩展片是你想要的.新在Python 2.3 2. Python的序列切片地址可以写成[开始:结束: ... 
- 基于AOE网的关键路径的求解
			[1]关键路径 在我的经验意识深处,“关键”二字一般都是指临界点. 凡事万物都遵循一个度的问题,那么存在度就会自然有临界点. 关键路径也正是研究这个临界点的问题. 在学习关键路径前,先了解一个AOV网 ... 
