Java动态生成Nginx服务配置

下载Nginx并解压
进入conf目录,并打开nginx.conf文件
在nginx.conf中加上自定义的配置文件,第一次使用建议创建一个空白的自定义配置
Java相关代码,重新生成配置后自动重载Nginx服务
java 复制代码
public class CommonService implements ICommonService {

    /* Nginx路径 */
    private final String NGINX_DIR = "F:\\nginx-1.22.1";

    /* Nginx配置文件路径 */
    private final String NGINX_FILE_NAME = "\\conf\\custom-nginx.conf";

    @Autowired
    private IProjectInfoDao projectInfoDao;


    /**
     * 刷新 Nginx 配置
     *
     * @Auther: czw
     * @Description:
     * @Date: 2025/06/16 11:40
     * @Version: 1.0
     */
    @Override
    public RetType refreshNginxConfig() {
        RetType retType = new RetType();

        String nginxConfig = generateNginxConfig();

        // 将配置写入文件
        if (writeConfigToFile(NGINX_DIR + NGINX_FILE_NAME, nginxConfig)) {

            // 重启 Nginx
            restartNginx();
        }

        retType.doSuccess();
        return retType;
    }

    /**
     * 动态生成 Nginx 的配置内容
     *
     * @Auther: czw
     * @Description:
     * @Date: 2025/06/16 11:48
     * @Version: 1.0
     */
    private String generateNginxConfig() {

        StringBuilder config = new StringBuilder();
        config.append("server {\n");
        config.append("    listen       8084;\n");
        config.append("    server_name  192.168.2.17;\n\n");
        config.append("    #charset koi8-r;\n\n");
        config.append("    #access_log  logs/host.access.log  main;\n\n");
        config.append("    #这块是自动测试地址(平台地址)\n");
        config.append("    location /test {\n");
        config.append("        proxy_pass http://192.168.2.12:5173;\n");
        config.append("    }\n\n");

        List<ProjectInfo> list = projectInfoDao.getNginxProjectList();
        if (ObjectUtil.isNotEmpty(list)) {

            StringBuilder configBuilder = new StringBuilder();
            List<String> targetList = new ArrayList<>();

            int count = 1;
            for (ProjectInfo projectInfo : list) {

                configBuilder.append("    #被测试的" + projectInfo.getProjectName() + "服务地址\n");
                configBuilder.append("    location /" + projectInfo.getUri() +"/ {\n");
                configBuilder.append("        proxy_pass " + projectInfo.getHost() + projectInfo.getUri() +"/;\n");
                configBuilder.append("    }\n\n");

                String targetName = "@targetTestFile" + count;
                targetList.add(targetName);
                configBuilder.append("    #被测试的静态文件地址\n");
                configBuilder.append("    location "+ targetName +" {\n");
                configBuilder.append("        proxy_pass "+ projectInfo.getHost() +";\n");
                configBuilder.append("    }\n\n");
            }

            configBuilder.append("    #要转发被测试的静态文件地址\n");
            configBuilder.append("    location / {\n");
            configBuilder.append("        try_files $uri $uri/ "+ targetList.stream().collect(Collectors.joining(" ")) +";\n");
            configBuilder.append("    }\n\n");

            config.append(configBuilder);
        }

        config.append("    error_page   500 502 503 504  /50x.html;\n");
        config.append("    location = /50x.html {\n");
        config.append("        root   html;\n");
        config.append("    }\n");
        config.append("}");
        return config.toString();
    }

    /**
     * 将生成的配置写入文件
     *
     * @Auther: czw
     * @Description:
     * @Date: 2025/06/16 11:49
     * @Version: 1.0
     */
    private boolean writeConfigToFile(String filePath, String configContent) {
        try {
            File configFile = new File(filePath);
            if (!configFile.exists()) {
                configFile.createNewFile();  // 如果文件不存在则创建文件
            }
            BufferedWriter writer = new BufferedWriter(new FileWriter(configFile));
            writer.write(configContent);  // 写入内容
            writer.close();
            System.out.println("Nginx 配置文件已成功生成: " + filePath);
            return true;
        } catch (IOException e) {
            System.err.println("写入文件时发生错误: " + e.getMessage());
            return false;
        }
    }

    /**
     * 重启 Nginx 服务
     *
     * @Auther: czw
     * @Description:
     * @Date: 2025/06/16 11:50
     * @Version: 1.0
     */
    private void restartNginx() {
        try {
            // 执行 Nginx 重启命令
            String command = NGINX_DIR + File.separator + "nginx.exe -s reload";  // 重载配置

            Process process = Runtime.getRuntime().exec(command, null, new java.io.File(NGINX_DIR));

            int exitCode = process.waitFor();
            if (exitCode == 0) {
                ALogFactory.getLog().info("----------------Nginx 已成功重启----------------");
            } else {
                ALogFactory.getLog().error("----------------重启 Nginx 失败,退出代码: " + exitCode + "----------------");
            }

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            ALogFactory.getLog().error("----------------重启 Nginx 时发生错误: " + e.getMessage() + "----------------");
        }
    }

}
生成的配置文件
相关推荐
科比不来it16 分钟前
Go语言数据竞争Data Race 问题怎么检测?怎么解决?
开发语言·c++·golang
biter down18 分钟前
c语言14:字符指针
c语言·开发语言
SimonKing26 分钟前
Mybatis-Plus的竞争对手来了,试试 MyBatis-Flex
java·后端·程序员
光军oi32 分钟前
JAVA全栈JVM篇————初识JVM
java·开发语言·jvm
我命由我1234537 分钟前
PDFBox - PDFBox 加载 PDF 异常清单(数据为 null、数据为空、数据异常、文件为 null、文件不存在、文件异常)
java·服务器·后端·java-ee·pdf·intellij-idea·intellij idea
7哥♡ۣۖᝰꫛꫀꪝۣℋ1 小时前
Spring Boot
java·spring boot·后端
Moniane1 小时前
C++深度解析:从核心特性到现代编程实践
java·开发语言·jvm
uxiang_blog1 小时前
C++进阶:重载类型转换
linux·开发语言·c++
攻城狮CSU1 小时前
C# 数据加载专题 之泛型序列化
java·servlet·c#
浩泽学编程1 小时前
【源码深度 第1篇】LinkedList:双向链表的设计与实现
java·数据结构·后端·链表·jdk