Запомните полное развертывание проекта

сервер Nginx JavaScript PM2

Некоторое время назад при развертывании проекта в компании одноклассник по эксплуатации и обслуживанию много чего говорил о сервере и вдруг почувствовал себя растерянным и туманным. . .

banner

Просто возьмите этот проект на практику и вкратце поймите, как обрабатывается процесс развертывания проекта на сервере.

Предварительные знания

pm2

pm2 — запустить инструмент управления процессами узла.

Общие команды

···

pm2 start app.js : запустить службу, файл входа — app.js

список pm2, чтобы увидеть, какие процессы запущены

pm2 show xxx Просмотр сведений об услуге

npm restart [имя или идентификатор]: перезапустить службу

pm2 monit : мониторинг служб

···

Файл package.json проекта

package.json

Чтобы запустить службу, мы можем использовать node run app.js

Если вы используете pm2 для запуска службы, вы можете ввести pm2 start app.js

Введите список pm2 в командной строке, чтобы просмотреть запущенные проекты.

pm2 list

pm2 поддерживает запуск файла конфигурации

pm2配置文件

  • путь к сценарию запуска сценария
  • exec_mode режим запуска приложения, поддерживает режим форка и кластера
  • instances Количество запускаемых экземпляров приложения, допустимо только в кластерном режиме, по умолчанию — fork

форк и кластерный режим

fork — это кластер одного процесса, который может запускать несколько процессов

Добавьте в проект файл конфигурации pm2 pm2.config.json.

{
  "name": "mxx-project",
  "script": "./index.js",
  "error_file": "./logs/err.log",
  "out_file": "./logs/out.log",
  "log_date_format": "YYYY-MM-DD HH:mm Z",
  "instances": 3,
  "merge_logs": true,
  "exec_mode": "cluster",
  "node_args": "",
  "ignore_watch": ["node_modules"],
  "env": {
    "NODE_ENV": "development"
  }
}

Введите в командной строке

pm2 start pm2.config.json

будут созданы три процесса

cluster

Примечание. Если ваш сервер многоядерный, весьма вероятно, что несколько процессов будут созданы в режиме кластера.

Вы можете проверить, сколько ядер у вашего сервера

cluster

shipit

shipit — инструмент для автоматизированного развертывания серверов.

Простой файл конфигурации shipit

module.exports = shipit => {
  require('shipit-deploy')(shipit)
  shipit.initConfig({
    default: {
      workspace: '/tmp/myapp',
      deployTo: '/var/myapp',
      repositoryUrl: '你的GitHub地址',
      ignores: ['.git', 'node_modules'],
      keepReleases: 2,
      deleteOnRollback: false,
      key: '/path/to/key',
      shallowClone: true,
    },
    staging: {
      servers: '你的服务器地址',
    },
  })
}

подключиться к серверу

После покупки сервера вы можете получить IP адрес и попробовать зайти на сервер

Как правило, ваш собственный сервер может войти в систему как root для работы.

ssh root@ipipip

Поскольку более поздний проект будет развернут на сервере, рекомендуется сначала выполнить ssh-copy-id, чтобы установить доверие, чтобы вам не приходилось повторно вводить пароль.

ssh-copy-id

Настроить среду на сервере

Вообще говоря, вам нужно установить npm cnpm node pm2 git nginx

  • установить нпм
yum install npm  
  • установить cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
  • установить pm2
npm i pm2 
  • установить узел
npm i n
  • установить git
yum install git
  • Установите NVM.
 wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

Нужно настроить Vim ~ / .bashrc

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

Укажите версию узла по умолчанию

nvm alias defalut 8

Запустить простую услугу

Напишем простой скрипт, на сервере создал новый app.js в каталоге /home/work (выполнять по порядку)

cd home
mkdir work
touch app.js

Напишите простейший сервис в app.js

const http = require('http')
const port = 3389

http.createServer((req, res) => {
  res.end('Hello word!')
}).listen(port, () => {
  console.log(port, 'port')
})

запустить app.js

node app.js

node

Затем откройте браузер, введите IP + номер порта, и вы увидите приветственное слово на странице.

hello word

--Пополнить--

1 Используемый здесь номер порта — 3389, поскольку номер порта 3389 был настроен в группе безопасности моего сервера.

Если вы используете другие порты, обратите внимание, настроена ли группа безопасности

2 О запуске сервиса

Если вы используете узел, то после выхода с сервера вы больше не сможете получить доступ к этой службе.

Его можно заменить на pm2 для запуска, поэтому после запуска, если не будет сообщено об ошибке, этот процесс всегда будет существовать.

pm2

готов к развертыванию

  • Подготовить проект

В проекте используется koa1 + React

адрес проекта реакцииНажмите на меня, чтобы просмотреть адрес GitHub

Номер порта запуска изменен на 3389.

  • Подготовьте файл запуска pm2

pm2 создать папку, в которой начать писать production.json pm2

  • Создать Shipit.js в проектной базовой конфигурации выглядит следующим образом
module.exports = function (shipit) {
  require('shipit-deploy')(shipit)
  require('shipit-cnpm')(shipit)
  require('shipit-pm')(shipit)
  shipit.initConfig({
    default: {
      workspace: '/tmp/deploy/your-project',
      deployTo: '/home/work/your-project',
      repositoryUrl: 'https://github.com/youproject.git',
      ignores: ['.git', 'node_modules'],
      keepReleases: 2,
      deleteOnRollback: false,
      key: '/path/to/key',
      shallowClone: true,
      cnpm: {
        flags: '--production',
        local: false,
        npm: 'cnpm',
        remote: true
      },
      pm: {
        production: {
          path: '/home/work/your-project/current/pm2/production.json'
        }
      }
    },
    production: {
      servers: ['root@你的IP地址']
    }
  })
}

Здесь pm2 использует файл конфигурации для запуска, поэтому, если параметр pm настроен, pm2 будет запущен в соответствии с этим путем к файлу.

  • Добавьте два поля в package.json вашего проекта.
    "deploy": "shipit production deploy",
    "rollback": "shipit production rollback",
  • Отправьте проект на GitHub
  • Выполнить развертывание запуска npm

После развертывания проекта перейдите на сервер, чтобы просмотреть процесс проекта.

pm2 list

pm2

Откройте страницу, чтобы увидеть эффект

server

На данный момент развертывание завершено

Проблемы с процессом развертывания

  • Ошибка 1

git

Решение: забыли установить git на сервер

  • Ошибка 2

cnpm

Это очевидно, cnpm не установлен

  • После успешного развертывания зайдите на сервер, чтобы проверить, что проект не запущен

Исходное развертывание

shipit

Потом я спросил у великого бога и обнаружил, что в конфигурационном файле шипита этого не написано

require('shipit-pm')(shipit)

[Бросьте стол! ]

Вернитесь в онлайн после настройки файла

pm2

запустит три процесса

Настройте Alibaba Cloud в соответствии с номером порта проекта

Если номер порта не настроен в группе безопасности при запуске вашего проекта, вам необходимо добавить группу безопасности в фоновом режиме.

9093

При заходе на страницу также необходимо ввести номер порта 3389. Очень ленив и не хочет вводить номер порта

Добавьте порт 80 по умолчанию в группу безопасности и настройте порт в файле запуска app.js на 80. Таким образом, вам не нужно вводить номер порта

port

port

Так что, если вы не хотите изменять файл app.js, используйте NGINX

Настроить NGINX

  • установить нгинкс

yum install nginx

Просмотр файлов конфигурации NGINX

cat  /etc/nginx/nginx.conf

Очень простая конфигурация

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

Номер порта файла записи проекта app.js изменен на 9999.

Обработать Nginx.conf.js

Наконец-то скорректировано (более важно то, что сервер показывает здесь только серверную часть)

 server {
        listen       80;
        server_name  localhost;
 
        location / {
          proxy_pass  http://127.0.0.1:9999/;
        }
    }

Запустить Nginx

nginx -s reload

Проблемы с настройкой Nginx

  • Перезапустите Nginx

Я продолжаю получать сообщение об ошибке при перезапуске Nginx

error

После просмотра статьи

nginx -c /etc/nginx/nginx.conf
nginx -s reload

получить это ~

Добро пожаловать в гостиНажмите, чтобы посмотреть проект

Справочная статья