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

}
生成的配置文件
相关推荐
百锦再21 分钟前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂1 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
风吹落叶花飘荡1 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript
失败又激情的man1 小时前
python之requests库解析
开发语言·爬虫·python
专注VB编程开发20年2 小时前
常见 HTTP 方法的成功状态码200,204,202,201
开发语言·网络协议·tcp/ip·http
有没有没有重复的名字2 小时前
线程安全的单例模式与读者写者问题
java·开发语言·单例模式
开开心心_Every3 小时前
便捷的电脑自动关机辅助工具
开发语言·人工智能·pdf·c#·电脑·音视频·sublime text
程序员的世界你不懂3 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(4)集成Allure报表
java·selenium·maven
isNotNullX3 小时前
数据中台架构解析:湖仓一体的实战设计
java·大数据·数据库·架构·spark
皮皮林5513 小时前
“RPC好,还是RESTful好?”,这个问题不简单
java