zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    1082 射击比赛 (20 分)
    1091 N-自守数 (15 分)
    1064 朋友数 (20 分)
    1031 查验身份证 (15 分)
    1028 人口普查 (20 分)
    1059 C语言竞赛 (20 分)
    1083 是否存在相等的差 (20 分)
    1077 互评成绩计算 (20 分)
    792. 高精度减法
    791. 高精度加法
  • 原文地址:https://www.cnblogs.com/snowater/p/7591329.html
Copyright © 2011-2022 走看看