snowater

會當凌絕頂 少壯不努力老大徒傷悲 寶劍鋒從磨礪出梅花香自苦寒來

导航

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配置

 1     public boolean addWebToNginxConfig(WebHost webHost, String fileName) {
 2         if (webHost == null || Strings.isNullOrEmpty(fileName)) {
 3             return false;
 4         }
 5         try {
 6             NgxConfig ngxConfig = NgxConfig.read(fileName);
 7             NgxBlock ngxBlockHttp = ngxConfig.findBlock("http");
 8             NgxBlock ngxBlockWeb = new NgxBlock();
 9             ngxBlockWeb.addValue("server");
10             ngxBlockHttp.addEntry(ngxBlockWeb);
11             if ("https".equals(webHost.getProtocol())) {
12                 NgxParam ngxParam = new NgxParam();
13                 ngxParam.addValue("listen 443 ssl");
14                 ngxBlockWeb.addEntry(ngxParam);
15                 ngxParam = new NgxParam();
16                 ngxParam.addValue(String.format("server_name %s", webHost.getHost()));
17                 ngxBlockWeb.addEntry(ngxParam);
18 
19                 String virtualServerName = webHost.formatName();
20                 ngxParam = new NgxParam();
21                 ngxParam.addValue(String.format("ssl_certificate /etc/nginx/cert/%s.cert", virtualServerName));
22                 ngxBlockWeb.addEntry(ngxParam);
23                 ngxParam = new NgxParam();
24                 ngxParam.addValue(String.format("ssl_certificate_key /etc/nginx/key/%s.key", virtualServerName));
25                 ngxBlockWeb.addEntry(ngxParam);
26             } else {
27                 NgxParam ngxParam = new NgxParam();
28                 ngxParam.addValue("listen 80");
29                 ngxBlockWeb.addEntry(ngxParam);
30                 ngxParam = new NgxParam();
31                 ngxParam.addValue(String.format("server_name %s", webHost.getHost()));
32                 ngxBlockWeb.addEntry(ngxParam);
33             }
34 
35             NgxBlock ngxBlockLocation = new NgxBlock();
36             ngxBlockLocation.addValue("location");
37             ngxBlockLocation.addValue("/");
38             NgxParam ngxParam = new NgxParam();
39             ngxParam.addValue("proxy_pass http://backend_http");
40             ngxBlockLocation.addEntry(ngxParam);
41             ngxParam = new NgxParam();
42             ngxParam.addValue("proxy_set_header Host $host");
43             ngxBlockLocation.addEntry(ngxParam);
44             ngxParam = new NgxParam();
45             ngxParam.addValue("proxy_set_header X-Real-IP $remote_addr");
46             ngxBlockLocation.addEntry(ngxParam);
47             ngxParam = new NgxParam();
48             ngxParam.addValue("proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for");
49             ngxBlockLocation.addEntry(ngxParam);
50             ngxBlockWeb.addEntry(ngxBlockLocation);
51 
52             String content = new NgxDumper(ngxConfig).dump();
53             log.info("{}", content);
54             return true;
55         } catch (IOException e) {
56             log.warn("write nginx.conf to file catch IOException!", e);
57         }
58         return false;
59     }

添加结果示例:

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配置

 1     public boolean deleteWebFromNginxConfig(String host, String fileName) {
 2         if (Strings.isNullOrEmpty(host) || Strings.isNullOrEmpty(fileName)) {
 3             return false;
 4         }
 5         try {
 6             NgxConfig ngxConfig = NgxConfig.read(fileName);
 7             NgxBlock ngxBlockHttp = ngxConfig.findBlock("http");
 8             List<NgxEntry> serverList = ngxBlockHttp.findAll(NgxConfig.BLOCK,"server");
 9             for (NgxEntry ngxEntry : serverList) {
10                 NgxBlock ngxBlock = (NgxBlock) ngxEntry;
11                 NgxParam ngxParam = ngxBlock.findParam("server_name");
12                 if (host.equals(ngxParam.getValue())) {
13                     ngxBlockHttp.remove(ngxBlock);
14                 }
15             }
16             String content = new NgxDumper(ngxConfig).dump();
17             log.info("{}", content);
18             return true;
19         } catch (IOException e) {
20             log.warn("write nginx.conf to file catch IOException!", e);
21         }
22         return false;
23     }

 

posted on 2017-09-25 12:41  snowater  阅读(4103)  评论(0编辑  收藏  举报