• 博客网站项目部署问题汇总


    最近在使用koa2+mysql+nodejs+weback+vue+redis技术搭建了一个博客网站,奈何遇到了种种问题,现在一一总结一番:

    问题1. 使用 ecosystem.json 配置文件部署项目, "post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production", //项目发布到服务器上执行的命令 

    发现按照教程或者网络给出的配置文件,无法访问网站,网站报nginx代理问题,或者直接502 Bad Gateway

     

    打印 pm2 的日志:

     发现服务貌似一直被 killed 然后在唤起,然后在killed。。。。。

    问题2.于是修改配置文件,怀疑是执行命令的问题:

    "post-deploy" : "npm install &&npm run prd &&pm2 startOrRestart ecosystem.json --env production", //项目发布到服务器上执行的命令

    注意这里多了 npm run prd,对应的package.json 文件中的命令:

    "prd": "cross-env NODE_ENV=production pm2 start bin/www --watch",

    即让服务启动的命令,然后页面就能访问了,但是会有几个问题:

      问题:在服务端使用pm2 ls 会发现在原来myblog进程上多了一个www的进程:

    类似如上图所示,当然这个是正确之后的图,实际上这里会多一行 name为www的进程,实际上这个进程就是执行 npm run prd 后起的进程。

    类似的在服务器端的 www/website/myblog/current文件夹中执行npm run prd 同样会起这个服务,然后进程也是www;

    好了,即使我们使用npm run prd唤起了服务,但是仍有以下问题:

      问题1:网站引用的js、css等静态资源无法缓存;

      问题2: 每次执行部署代码命令  pm2 deploy ecosystem.json production ,都会提示服务器正在运行该进程【即npm run prd】,每次都要在服务器关闭该进程再执行该命令,或者加上-f命令,却导致进程数过多。

      问题3:最为致命的是,网站在运行半天之后,只能访问静态css、js等资源,koa脚手架搭建的api接口全部不能访问了!!!!!

    ------------

    那么问题究竟在哪里呢?

    折腾了很久,对pm2配置文件各种修改尝试,还有nginx的配置文件,甚至重新格式化磁盘,重新搭建环境,都不行。。。。。

    直到在一次服务器又不能访问api接口后,我打印pm2日志看了一下:

     纳尼???报了一个错误:loveNum未定义,然后在看下面的日志:

     因错误太多,导致服务器挂了。。。。挂了。。。。。。

    终于明白了,原来是本身逻辑有问题,代码无法获取到loveNum的值,刚开始还可以运行,但是时间过长之后,越来越多的错误导致服务卡死,于是表现为每每运行半天左右,接口就挂了。

    好了,直到原因后,排查业务逻辑代码,修改loveNum的bug,然后在ecosystem.json 配置文件中,删掉npm run prd;并且修改 "script": "./bin/www",//启动的入口脚本,最终ecosystem.json 配置文件如下:

    {
      "apps":[{
        "name": "myblog", //部署的应用的名字
        "script": "./bin/www",//启动的入口脚本
        "watch":true,//是否监听文件发生变化
        "env": {
          "COMMON_VARIABLE": "true"//启动时传入的变量
        },
        // Environment variables injected when starting with --env production
        // http://pm2.keymetrics.io/docs/usage/application-declaration/#switching-to-different-environments
        "env_production" : {
          "NODE_ENV": "production" //生产环境的变量
        }
      }],
      // Deployment part
      // Here you describe each environment
      "deploy" : { //部署的任务
        "production" : {
          "user" : "zyl", //服务器上用来发布的用户名
          // Multi host is possible, just by passing IPs/hostname as an array
          "host" : ["39.106.194.136"],//主机ip
        "port":"22",//端口号
    // Branch
          "ref"  : "origin/master", //指定主分支master
          // Git repository to clone
          "repo" : "git@github.com:zhenyulei/koa-blog.git", //仓库地址
          // Path of the application on target servers
          "path" : "/home/zyl/www/website/myblog", //把项目部署到服务器的那个目录下
          // Can be used to give options in the format used in the configura-
          // tion file.  This is useful for specifying options for which there
          // is no separate command-line flag, see 'man ssh'
          // can be either a single string or an array of strings
          "ssh_options": "StrictHostKeyChecking=no", //把ssh的key校验取消掉
          // To prepare the host by installing required software (eg: git)
          // even before the setup process starts
          // can be multiple commands separated by the character ";"
          // or path to a script on your local machine
          "pre-setup" : "",
          // Commands / path to a script on the host machine
          // This will be executed on the host after cloning the repository
          // eg: placing configurations in the shared dir etc
          "post-setup": "ls -la",
          // Commands to execute locally (on the same machine you deploy things)
          // Can be multiple commands separated by the character ";"
          "pre-deploy-local" : "echo 'This is a local executed command'",
          // Commands to be executed on the server after the repo has been cloned
          "post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production", //项目发布到服务器上执行的命令
    // Environment variables that must be injected in all applications on this env 
          "env" : { "NODE_ENV": "production" } } }
    }

    再次执行:

    pm2 deploy ecosystem.json production setup 
    
    pm2 deploy ecosystem.json production

    binggo!!网站终于能够访问了!

    不但解决了网站能够访问的问题,而且网站的静态资源也有了缓存,此外再来看pm2的ls

    在看其日志,已经正常:

     终于好了。

    ---

    其他问题,在设置服务器缓存的时候,发现

    其中conf.d 是设置nginx路由对应关系的文件夹,而nginx.conf是设置nginx中的http的配置文件。

    所以设置缓存和压缩应该是放在nginx.conf文件中设置。

    此外,加上favicon.icon: 使用webpack打包的单页面项目如何设置favicon.icon文件

    最简单的方法是在koa端直接放在public文件夹中,注意名字一定要标准:favicon.icon

    upstream myblog {
        server 127.0.0.1:8000;
    }
    server {
        listen 80;
        server_name www.blog.xiaozhumaopao.com;
        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Nginx-Proxy true;
            proxy_set_header X-Forwarded-Host $server_name;
    
            proxy_pass http://myblog;
            proxy_redirect off;
        }
    
        location ~* ^.+.(jpg|jpeg|gif|png|ico|css|js|pdf|txt){
          root /home/zyl/www/website/myblog/current/public;
        }
    
    }

    =======

    mysql数据库链接一段时间后断开报错:

    { Error: Connection lost: The server closed the connection.

        at Protocol.end (/home/zyl/www/website/myblog/source/node_modules/mysql/lib/protocol/Protocol.js:112:13)

        at Socket.<anonymous> (/home/zyl/www/website/myblog/source/node_modules/mysql/lib/Connection.js:97:28)

        at Socket.<anonymous> (/home/zyl/www/website/myblog/source/node_modules/mysql/lib/Connection.js:525:10)

        at Socket.emit (events.js:185:15)

        at endReadableNT (_stream_readable.js:1106:12)

        at process._tickCallback (internal/process/next_tick.js:178:19) fatal: true, code: 'PROTOCOL_CONNECTION_LOST' }

     

     https://blog.csdn.net/jsyuger/article/details/80531073

    https://blog.csdn.net/wb_001/article/details/79000522

     

  • 相关阅读:
    线程池略略观
    spring-mvc的工作原理
    openstack cinder-backup流程与源码分析
    为何说只有 1 种实现线程的方法?
    经典排序算法原理解析与优劣对比
    Java中List和ArrayList的区别
    openstack-taskflow 组件记录
    递归:如何利用递归求解汉诺塔问题?
    登录MySQL提示ERROR 1045 (28000)错误解决方法
    回归JavaScript基础(九)
  • 原文地址:https://www.cnblogs.com/xiaozhumaopao/p/11785537.html
Copyright © 2020-2023  润新知