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

}
生成的配置文件
相关推荐
还是奇怪14 分钟前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
zfoo-framework29 分钟前
1.ansible安装 2.虚拟机克隆
java
码上解惑38 分钟前
从 Dify 工作流说起:常用节点怎么选、怎样组合?
java·人工智能·ai·agent·dify·智能体·spring ai
小大宇1 小时前
python flask框架 SSE流式返回、跨域、报错
开发语言·python·flask
青山木2 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
柒星栈2 小时前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
勉灬之2 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
程序员-珍2 小时前
报错下载android sdk失败
android·java
糖果店的幽灵2 小时前
langgraph分支之 - 动态分支(Dynamic Branch)
java·前端·javascript·人工智能·langgraph
吃饱了得干活2 小时前
亿级订单表分库分表设计,从0到1全流程
java·数据库·面试