最近工程开发遇到一个需求:用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 }
时间: 2024-11-05 00:42:01