ubuntu 下部署 node 服務器環境 - 基礎篇

寫在最前

這是根據 imooc 上 Scott 老師的課程整理的,主要是方便本身查找,由於真的記不住...
附上連接:Node.js項目線上服務器部署與發佈 靜態網站,須要數據庫的電影網站、公衆號,小程序,app 五種項目的部署。
這裏只寫最簡單的靜態網站的部署html

部署思路

一、完成項目
二、購買域名,備案,解析一些二級域名出來備用
三、購買服務器
四、ssh 遠程登陸服務器 並進行一些安全配置
五、服務端搭建 node 環境
六、Nginx 反向代理。持有80端口,負責端口轉發
七、配置 數據庫 mongodb... 安裝教程
八、部署上線。本地和服務器上都安裝git、pm2(pm2 負責把git的項目更新到服務器)node

遠程登陸服務器

一、第一次 ssh 遠程登陸

  • 騰訊的超級管理員帳戶是 ubuntu ,阿里的是 root
  • ssh root@公網ip

二、委派一個欽差大臣Jerry,避免用超級管理員帳號進行直接操做

  1. 添加用戶 Jerry sudo adduser Jerry
  2. 給 Jerry 升官。sudo visudo 打開 GUN nano 配置文件, 在 User privilege specification 下添加 Jerry ALL=(ALL:ALL) ALL
    對全部sudo生效;Jerry 能夠以任何命令來執行操做;Jerry 能夠以任何組來執行操做;這個規則適用於全部命令
  3. 重啓 ssh 服務:service ssh restart。 而後就能夠用 Jerry 登陸啦(新開一個命令行,以避免登陸失敗無後路可退): ssh Jerry@外網IP

三、ssh 免密登陸

  1. 本地生成公鑰、私鑰

    密鑰存放在本地 .ssh 文件下, 若是沒有先建立一下 mkdir .ssh。若是文件夾和密鑰都已經存在,能夠先備份一下已存在的密鑰 mv id_rsa id_rsa_backup
    在 .ssh 目錄下作以下操做 : 註冊 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ,開啓代理 eval "$(ssh-agent -s)", 加入代理 ssh-add ~/.ssh/id_rsawebpack

  2. 服務端生成 並把本地的公鑰放在服務端的 authorized_keys
    使用 Jerry 登陸服務端,在 /home/Jerry/.ssh 目錄下也進行如上操做生成密鑰。接着建立受權文件 vi authorized_keys, vi 是 vim 的縮寫,把想要免密登陸服務器的電腦的公鑰 ip_rsa.pub 複製過來
  3. 服務端受權 chmod 600 authorized_keys 並重啓ssh 服務 service ssh restart 。 這樣就能夠經過 Jerry 免密登陸了, 經過 root 依然須要密碼
一個報錯
Host key verification failed
緣由:
本地 .ssh 文件夾下存在另外一個文件 known_hosts, 這裏記錄的是全部訪問過的計算機(服務器是臺遠程計算機)的公鑰,報錯的公鑰有問題
解決辦法:
清除對應的公鑰信息。 最粗暴的辦法是直接刪除文件 rm -rf known_hosts , 正確的公鑰也會被刪掉。含蓄一點就是打開文件找到公鑰刪掉它。 還有一種辦法 ssh-keygen -r 公網IP,惋惜報錯了 no keys found

提高安全等級

一、修改服務器默認登陸端口號

  1. 打開配置文件 sudo vi /etc/ssh/sshd_config ,服務器默認端口是 22 ,修改 Port 22 。0-1024 不用,被系統程序佔用,且必須 root 啓用,1024-65536可用。
  2. 文件末行添加 AllowUsers Jerry 。 順便確認一下 UseDNS no
  3. 重啓 ssh 服務 sudo service ssh restart
  4. 新開一個命令行登陸試試 ssh -p 39999 Jerry@外網IP

二、關閉 root 密碼登陸

sudo vi /etc/ssh/sshd_config

PermitRootLogin  no
PasswordAuthentication  no
PrimitEmptyPasswords  no (確認一下,默認也是no)

三、配置iptables 和 Fail2Ban 加強安全防禦

  1. iptables 防火牆
  2. Fail2Ban 防護性的動做庫 監控系統的日誌中的行爲給相應的操做。可疑行爲IP鎖定...

搭建 node 生產環境

一、搭建 node 環境

  1. 更新系統 sudo apt-get update
  2. 一口氣安裝 sudo apt-get install vim openssl build-essential libssl-dev wget curl git
  3. 安裝 nvm。 在git上搜索 nvm , install script 下有安裝辦法 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash 或者 wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
  4. 安裝某版本的 node nvm install v6.9.5 或者安裝最新的 nvm install node
  5. 安裝一些全局工具包 npm i pm2 webpack gulp grunt-cli -g..

二、藉助 pm2 讓服務器常駐

  1. 能夠配置一個taobao鏡像,直接 npm 可能很慢nginx

    npm --registry=https://registry.npm.taobao.org install -g npm
       echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
       npm --registry=https://registry.npm.taobao.org install -g cnpm
  2. 安裝 pm2 cnpm i pm2 -g or npm i pm2 -g or npm --registry=https://registry.npm.taobao.org install -g pm2

Nginx 反向代理

  1. Nginx 持有 80 端口,負責端口轉發
  2. 更新 sudo apt-get update
  3. 安裝 nginx sudo apt-get install nginx
  4. 解析一個二級域名(A記錄)出來 test.segmentfault.com
  5. 配置 nginx cd /etc/nginx/conf.d 目錄下新增一個配置文件 sudo vi test-3000.conf。檢測配置 sudo nginx -t, 重啓nginx sudo nginx -s reloadgit

    upstream test {
        server 127.0.0.1:3000;
    }
    server {
        listen 80;
        server_name test.segmentfault.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_pass http://test;
            proxy_redirect off;
        }
    }
  6. 隱藏瀏覽器 Header 信息中 Nginx 的版本號。 配置 /etc/nginx 下的 nginx.conf,把Basic Settingserver_token off 的註釋拿掉。檢測配置 sudo nginx -t, 從新加載配置 sudo server nginx reload

靜態網站部署

一、項目上傳至 git 倉庫

  1. 把本地和服務端的 id-rsa.pub添加至 git
  2. 本地安裝 git ,建立並上傳項目到 git
  3. 服務端安裝 git sudo apt-get install git
  4. 服務端測試一下 clone 項目 git clone git@github.com:DoFind/test.git

二、配置 pm2 一鍵部署項目

  1. 在本地項目下新增配置文件ecosystem.json 並配置
  2. 在服務端新建發佈項目的文件夾 /www/test,粗暴給操做 test 的權限 sudo chmod 777 test
  3. vi .bashrc 註釋一些代碼 source .bashrcgithub

    找到如下這幾行代碼註釋掉:web

    # If not running interactively, don't do anything
    # case $- in
    #     *i*);;
    #       *)return;; 
    # esac
  4. 接送一下項目(從 git 到 服務器) pm2 deploy ecosystem.json production setup
  5. 以後的項目更新重啓服務 pm2 deploy ecosystem.json production
// ecosystem.json 內容以下:

{
  "apps": [
    {
      "name": "test",
      "script": "app.js",
      "env": {
        "COMMON_VARIABLE": "true"
      },
      "env_production": {
        "NODE_ENV": "production"
      }
    }
  ],
  "deploy": {
    "production": {
      "user": "Jerry",
      "host": ["公網IP"],
      "port": "39999", 
      "ref": "origin/master",
      "repo": "git@github.com:DoFind/test.git",
      "path": "/www/test/production",
      "ssh_options": "StrictHostKeyChecking=no",
      "post-deploy": "npm install --registry=https://registry.npm.taobao.org && pm2 startOrRestart ecosystem.json --env production",
      "env": {
        "NODE_ENV": "production"
      }
    }
  }
}
我本身遇到的一個問題,沒法訪問部署在 阿里雲上的站點: ERR_CONNECTION_TIMED_OUT。 網絡診斷的結果是 服務器 不接受 80 端口上的鏈接
解決:
ECS實例的安全組規則中添加 HTTP(80) ,順便把 HTTPS(443) 也加進來
相關文章
相關標籤/搜索