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() + "----------------");
        }
    }

}
生成的配置文件
相关推荐
泡海椒22 分钟前
PDF 表格样式优化:jquick-pdf 边框、圆角、背景色
java·开发语言·pdf
Beyond_System|系统之外1 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55232 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
wno7042 小时前
Spring Security权限控制
java·python·spring
杨运交3 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
Geek-Chow3 小时前
CountDownLatch in Java
java
SL_staff3 小时前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
传奇开心果编程4 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff4 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
Bruce_Liuxiaowei4 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖