最近項目中需要解析nginx配置文件,幾經查找在github上找到nginx-java-parser工具,項目地址:https://github.com/odiszapc/nginx-java-parser
解析nginx.conf過程可以參考該項目的README.md,不知道調用哪些方法來完成功能,可以查看相應的源碼即可找到。下面給出我的解析demo。
2 3 import com.github.odiszapc.nginxparser.NgxBlock; 4 import com.github.odiszapc.nginxparser.NgxConfig; 5 import com.github.odiszapc.nginxparser.NgxEntry; 6 import com.github.odiszapc.nginxparser.NgxParam; 7 8 import java.io.File; 9 import java.util.*; 10 import java.util.regex.Matcher; 11 import java.util.regex.Pattern; 12 13 public class TestParase { 14 15 16 public static void main(String args[]){ 17 try { 18 // 1.讀取指定的文件夾下的配置文件 **:\work\document\nginxconf\test 19 ArrayList<File> filesArray=TestParase.getFiless("*:\\work\\document\\nginxconf\\test\\"); 20 // 2.循環解析文件夾下的conf配置文件 21 for(int i=0;i<filesArray.size();i++){ 22 String filePath=filesArray.get(i).getPath(); 23 TestParase.paraseNginx(filePath); 24 } 25 26 } catch (Exception e) { 27 e.printStackTrace(); 28 } 29 30 31 } 32 33 public static void paraseNginx(String filePath) throws Exception{ 34 35 NgxConfig conf=NgxConfig.read(filePath); 36 // 解析ngxin配置文件中的params 37 NgxParam workers = conf.findParam("worker_processes"); 38 workers.getValue(); 39 System.out.println("workers:"+workers.getValue()); 40 41 // 獲取http下面的upstream block 42 List<NgxEntry> rtmpServers = conf.findAll(NgxConfig.BLOCK, "http", "upstream"); 43 Set<String> noRepeatRtmpServers=new HashSet<String>(); 44 for (NgxEntry entry : rtmpServers) { 45 // 獲取upstream下的所有的server 46 List<NgxEntry> entryParamList=((NgxBlock)entry).findAll(NgxConfig.PARAM,"server"); 47 for(NgxEntry entryParam : entryParamList){ 48 String str=entryParam.toString(); 49 String[] enrryParamStrArr=entryParam.toString().split(" "); 50 noRepeatRtmpServers.add(enrryParamStrArr[1]); 51 } 52 } 53 for(String noRepeatRtmpServer:noRepeatRtmpServers){ 54 System.out.println(noRepeatRtmpServer); 55 } 56 57 // 獲取http下的server 58 List<NgxEntry> locationServers = conf.findAll(NgxConfig.BLOCK, "http", "server","location"); 59 Set<String> noRepeatLocationServers=new HashSet<String>(); 60 for (NgxEntry entry : locationServers) { 61 NgxParam locationParam=((NgxBlock)entry).findParam("proxy_pass"); 62 if(locationParam==null){ 63 continue; 64 } 65 String[] enrryParamStrArr=locationParam.toString().split(" "); 66 String enrryParamStr=enrryParamStrArr[1]; 67 String[] enrryParamStrArry=enrryParamStr.split("/"); 68 noRepeatRtmpServers.add(enrryParamStrArry[2]); 69 } 70 //循環遍歷 noRepeatRtmpServers 71 for(String noRepeatRtmpServer:noRepeatRtmpServers){ 72 System.out.println(noRepeatRtmpServer); 73 } 74 } 75 public static ArrayList<File> getFiless(String path) throws Exception{ 76 ArrayList<File> fileList=new ArrayList<File>();//目標集合fileList 77 File file =new File(path); 78 if(file.isDirectory()){ 79 File[]files=file.listFiles(); 80 for(File fileIndex:files){ 81 if(fileIndex.isDirectory()){ 82 TestParase.getFiless(fileIndex.getPath());//如果這個文件是目錄,則進行遞歸搜索 83 }else{ 84 fileList.add(fileIndex);//如果文件是普通文件,則將文件句柄放入集合中 85 } 86 } 87 } 88 return fileList; 89 } 90 91 }