分类: DevOps

运维、部署、工具链

  • NSGM CLI

    一个具有代码模板生成能力的全栈开发框架,帮助开发者高效构建Web应用。

    开源情况

    NSGM CLI 是一个活跃维护的开源项目,欢迎社区贡献和使用:

    快速安装

    # 全局安装
    npm install -g nsgm-cli
    
    # 或作为项目依赖安装
    npm install --save nsgm-cli
    

    为什么选择NSGM CLI?

    • 开箱即用:集成了现代Web开发所需的所有核心功能
    • 开发效率:通过代码模板生成大幅提高开发速度
    • 全栈解决方案:前后端一体化设计,无缝衔接
    • 活跃维护:定期更新和bug修复,确保框架稳定性
    • 社区支持:开源社区持续贡献和改进

    技术栈

    特性

    • 全栈架构设计
    • 自动代码模板生成
    • 快速开发工作流
    • 集成GraphQL API
    • MySQL数据库支持
    • 使用bcrypt加密的安全登录系统
    • 完整的项目脚手架
    • 开发与生产环境配置
    • 自动化部署支持

    适用场景

    • 企业级Web应用开发
    • 个人项目快速原型设计
    • 全栈开发学习与教学
    • 需要高效开发流程的团队
    • 需要统一技术栈的中大型项目

    命令行工具

    基本命令

    命令 描述
    nsgm init 初始化项目
    nsgm upgrade 升级项目基础文件
    nsgm create 创建模板页面
    nsgm delete 删除模板页面
    nsgm deletedb 删除模板页面和数据库表
    nsgm dev 开发模式
    nsgm start 生产模式
    nsgm build 构建项目
    nsgm export 导出静态页面

    参数说明

    • dictionary: 与export/init命令一起使用,默认值为webapp

      nsgm init dictionary=webapp
      # 或简化为
      nsgm init webapp
      
    • controller: 与create/delete命令一起使用,必需参数

      nsgm create math
      
    • action: 与create/delete命令一起使用,默认值为manage,跟在controller后面

      nsgm create math test
      

    开发流程示例

    1. 创建新项目

    # 安装CLI工具
    npm install -g nsgm-cli
    
    # 初始化新项目
    nsgm init myproject
    
    # 进入项目目录
    cd myproject
    
    # 安装依赖
    npm install
    

    2. 创建功能模块

    # 创建用户管理模块
    nsgm create user
    
    # 创建带自定义操作的产品模块
    nsgm create product detail
    

    3. 启动开发服务器

    # 启动开发模式
    nsgm dev
    

    快速设置

    1. 生成密码哈希:

      # 使用npm脚本
      npm run generate-password yourSecurePassword
      
    2. 创建.env文件:

      LOGIN_USERNAME=admin
      LOGIN_PASSWORD_HASH=your_generated_hash_here
      
    3. 确保.env在你的.gitignore文件中。

    ⚠️ 重要提示: 永远不要将密码或.env文件提交到版本控制系统。

    项目配置

    next.config.js

    const { nextConfig } = require('nsgm-cli')
    const projectConfig = require('./project.config')
    
    const { version, prefix, protocol, host } = projectConfig
    
    module.exports = (phase, defaultConfig) => {
      let configObj = nextConfig(phase, defaultConfig, {
        version,
        prefix,
        protocol,
        host
      })
    
      return configObj
    }
    

    mysql.config.js

    const { mysqlConfig } = require('nsgm-cli')
    const { mysqlOptions } = mysqlConfig
    const { user, password, host, port, database } = mysqlOptions
    
    module.exports = {
      mysqlOptions: {
        user,
        password,
        host,
        port,
        database
      }
    }
    

    project.config.js

    const { projectConfig } = require('nsgm-cli')
    const pkg = require('./package.json')
    
    const { prefix, protocol, host, port } = projectConfig
    const { version } = pkg
    
    module.exports = {
      version,
      prefix,
      protocol,
      host,
      port
    }
    

    服务器目录结构

    项目根目录中的server文件夹包含以下内容:

    目录说明

    • apis/ – 存储REST API接口
    • modules/ – 存储GraphQL解析器和模式
    • plugins/ – 存储GraphQL插件
    • *.js – 路由文件

    示例代码

    路由文件示例 (server/rest.js)

    const express = require('express')
    const moment = require('moment')
    
    const router = express.Router()
    
    router.use((req, res, next) => {
      const fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl
      console.log(moment().format('YYYY-MM-DD HH:mm:ss') + ' ' + fullUrl)
      next()
    })
    
    router.get('/*', (req, res) => {
      res.statusCode = 200
      res.json({ name: 'TEST' })
    })
    
    module.exports = router
    

    REST API示例 (server/apis/hello.js)

    const express = require('express')
    const router = express.Router()
    
    router.get('/*', (req, res) => {
      res.statusCode = 200
      res.json({ name: 'Hello' })
    })
    
    module.exports = router
    

    GraphQL模式示例 (server/modules/link/schema.js)

    module.exports = {
      query: `
            link: String
        `,
      mutation: `
            linkUpdate(link: Date): String
        `,
      subscription: ``,
      type: ``
    }
    

    GraphQL解析器示例 (server/modules/link/resolver.js)

    let localLink = ''
    
    module.exports = {
      link: () => {
        return localLink
      },
      linkUpdate: ({ link }) => {
        console.log('link', link)
        localLink = link
        return localLink
      }
    }
    

    GraphQL插件示例 (server/plugins/date.js)

    const moment = require('moment')
    const { Kind } = require('graphql/language')
    const { GraphQLScalarType } = require('graphql')
    
    const customScalarDate = new GraphQLScalarType({
      name: 'Date',
      description: 'Date custom scalar type',
      parseValue: (value) => moment(value).valueOf(),
      serialize: (value) => moment(value).format('YYYY-MM-DD HH:mm:ss:SSS'),
      parseLiteral: (ast) => (ast.kind === Kind.INT ? parseInt(ast.value, 10) : null)
    })
    
    module.exports = { Date: customScalarDate }
    

    社区与支持

    • 问题反馈:如果您在使用过程中遇到任何问题,请在GitHub Issues提交
    • 功能请求:有新功能建议?欢迎在Issues中提出
    • 贡献代码:我们欢迎Pull Requests,请确保遵循项目的代码规范
    • 联系作者:有任何问题可以通过GitHub联系项目维护者

    成功案例

    NSGM CLI已被用于多个成功的Web应用项目:

    • 企业内部管理系统
    • 数据可视化平台
    • 电子商务网站
    • 个人博客系统
    • 教育培训平台

    未来规划

    我们正在积极开发以下功能:

    • 更多数据库支持(MongoDB, PostgreSQL)
    • 容器化部署支持
    • 更丰富的UI组件库
    • 微服务架构支持
    • 更完善的文档和教程

    NSGM CLI – 让全栈开发更简单、更高效

  • Nginx 配置与故障排查指南

    1. 配置 Nginx 代理到特定端口

    1.1 编辑 Nginx 配置文件

    在 Nginx 的配置目录中创建或编辑一个配置文件,例如 /etc/nginx/conf.d/example.conf

    sudo nano /etc/nginx/conf.d/example.conf
    

    1.2 添加服务器块配置

    在配置文件中添加以下内容,将请求代理到 8080 端口:

    server {
        listen 80;
        server_name example.com;  # 替换为实际域名
    
        location / {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    1.3 验证并重新加载 Nginx 配置

    验证配置文件的语法正确性:

    sudo nginx -t
    

    重新加载 Nginx 以应用更改:

    sudo systemctl reload nginx
    

    2. 配置 SSL/TLS 证书

    2.1 安装 Certbot

    根据你的系统安装 Certbot:

    • Ubuntu:

      sudo apt update
      sudo apt install certbot python3-certbot-nginx
      
    • CentOS/RHEL:

      sudo yum install epel-release
      sudo yum install certbot python3-certbot-nginx
      

    2.2 生成证书

    使用 Certbot 自动配置 Nginx:

    sudo certbot --nginx -d example.com  # 替换为实际域名
    

    2.3 验证证书

    访问 https://example.com 并检查证书是否有效。你也可以使用 SSL Labs SSL Test 进行检测。

    2.4 配置 Nginx 以使用 SSL/TLS

    在 Nginx 配置文件中配置 SSL/TLS:

    server {
        listen 80;
        server_name example.com;  # 替换为实际域名
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl;
        server_name example.com;  # 替换为实际域名
    
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-CBC-SHA256:ECDHE-RSA-AES256-CBC-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384';
        ssl_prefer_server_ciphers on;
    
        location / {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    2.5 重新加载 Nginx 配置

    sudo systemctl reload nginx
    

    3. 解决端口冲突问题

    3.1 查找占用端口的进程

    使用以下命令查找占用 443 端口的进程:

    sudo netstat -tulnp | grep :443
    

    或:

    sudo ss -tulnp | grep :443
    

    3.2 停止占用端口的进程

    根据找到的进程 ID (PID),停止该进程:

    sudo kill -9 <PID>
    

    3.3 检查 Nginx 配置

    确保没有多个 Nginx 配置文件试图监听相同的端口:

    sudo grep -R "listen 443" /etc/nginx/
    

    3.4 检查 Apache 配置(如果适用)

    确认 Apache 配置文件中没有监听 443 端口:

    sudo grep -R "Listen 443" /etc/httpd/
    

    或:

    sudo grep -R "Listen 443" /etc/apache2/
    

    3.5 调整 Nginx 配置

    如果需要,同时运行 Nginx 和其他服务时,可以调整 Nginx 配置文件中的端口号:

    server {
        listen 8443 ssl;
        server_name example.com;  # 替换为实际域名
    
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-CBC-SHA256:ECDHE-RSA-AES256-CBC-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384';
        ssl_prefer_server_ciphers on;
    
        location / {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    3.6 重新启动相关服务

    重启 Nginx 和其他相关服务:

    sudo systemctl restart nginx
    sudo systemctl restart apache2  # 如果你使用的是 Apache
    

    3.7 检查系统状态

    检查系统是否有其他端口冲突情况或资源争用问题:

    sudo lsof -i :443
    

    3.8 确认系统时间

    确保服务器的系统时间准确:

    date
    

    总结

    通过以上步骤,你可以配置 Nginx 以使用 SSL/TLS,并解决端口冲突问题。确保你的服务配置正确,证书有效,且端口未被其他进程占用。如果问题仍然存在,请详细检查错误日志并与相关支持团队联系获取进一步帮助。

首页 简历 关于 隐私政策

© 2026 Erishen
沪ICP备2024079226号-1   沪公网安备31010502007082号