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

}
生成的配置文件
相关推荐
鬼蛟几秒前
Spring_MVC
java·spring·mvc
瓦哥架构实战1 分钟前
CentOS 7 编译安装 Python 3.9 解决 SSL 模块缺失问题
开发语言·python
宵时待雨9 分钟前
C++笔记归纳13:map & set
开发语言·数据结构·c++·笔记·算法
xiangpanf11 分钟前
PHP与Vue:前后端技术深度对比
开发语言·vue.js·php
怀旧诚子1 小时前
timeshift之Fedora43设置,已在VM虚拟机验证,待真机验证。
java·服务器·数据库
1104.北光c°1 小时前
滑动窗口HotKey探测机制:让你的缓存TTL更智能
java·开发语言·笔记·程序人生·算法·滑动窗口·hotkey
for_ever_love__2 小时前
Objective-C学习 NSSet 和 NSMutableSet 功能详解
开发语言·学习·ios·objective-c
云原生指北4 小时前
GitHub Copilot SDK 入门:五分钟构建你的第一个 AI Agent
java
似水明俊德8 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
Leinwin8 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库