阿里雲服務器部署 nodejs + mongodb + nginx 反向代理 + https配置 ssl證書

感謝 Scott 老師,Scott老師的慕課網教程 https://coding.imooc.com/clas...

1. 購買阿里雲服務器及域名

2. 終端鏈接阿里雲服務器(mac環境)

  1. ssh root@39...* 輸入密碼(購買時的密碼)javascript

    • 若是出現這個問題的解決方案:root@39.106.220*.*: Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
    • 解決方法: https://blog.csdn.net/gigijin...
  2. 查看硬盤掛在狀況:fdisk -l (若是有數據盤的狀況下)
  3. 查看硬盤使用狀況 df -h
  4. 經過zsh設置快捷登陸 alias ssh_orange="ssh root@39.106.22*.*"
  5. root 權限,能夠增長几個擁有root權限的用戶css

    • https://www.cnblogs.com/wang3...
    • adduser [name]
    • Linux下 ssh 查看用戶列表
    • 複雜:cat /etc/passwd
    • 簡化:cat /etc/passwd|grep -v nologin|grep -v halt|grep -v shutdown|awk -F":" '{ print $1"|"$3"|"$4 }'|more
    • 刪除用戶: userdel orange001 直接刪除就好
    • 給新用戶 orange01 設置密碼 passwd orange01 根據提示填寫兩次密碼
    • 給新用戶升級權限 gpasswd -a orange001 sudo
    • (centos 環境)html

      配置用戶權限:
      修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,以下所示:
      ## Allow root to run any commands anywhere
      root    ALL=(ALL)     ALL
      orange01   ALL=(ALL)     ALL
      修改完畢,如今能夠用 orange01 賬號登陸,而後用命令 su -  ,便可得到root權限進行操做。
              :wq!  保存退出
  6. 重啓ssh 烏班圖上 srevice ssh restart centos7 命令:systemctl restart sshd.serviceservice sshd restart
  7. ssh 實現無密碼登陸java

    本地操做:
     本地生成 ssh key: ssh-keygen -t rsa -b 4096 -C "326242499.@qq.com"  同 git 操做同樣
     開啓 ssh 代理   eval "$(ssh-agent -s)"
     把ssh key 假如到代理中     ssh-add ~/.ssh/id_rsa  (在 .ssh 目錄下執行這一操做)
     
     遠程主機操做:
     再把上面本地操做的步驟重複一遍
    
     而後生成 authorized_keys 文件:         
     vi .ssh/authorized_keys
     而後將本地的公鑰的內容 (~/.ssh/id_rsa.pub)  拷貝到遠程主機的 authorized_keys 文件內
     
     受權 chmod 600 authorized_keys 
     重啓遠程主機 
     sudo service ssh restart(烏班圖) 
     systemctl restart sshd.service 或  service sshd restart (centos7)
    
     作完這些步驟就能夠ssh免密登陸遠程主機了
  8. 端口安全性node

    • ssh 默認登陸端口 22
    • 在 root 帳戶下修改默認登陸端口號
    • centos7 修改默認22端口 https://www.cnblogs.com/zhuzi8849/p/6254498.html
    • 不知道爲何我修改完以後 ssh -p 3600 root@39.**.**.* 登陸鏈接超時 (未設置成功)
  9. 配置安全項、防火牆(iptables) --- 未作nginx

3. 搭建nodejs環境

  1. 更新:sudo yum update 或者 sudo yum upgrade (這個會報錯)
  2. 安裝: sudo yum install vim openssl build-essential libssl-dev wget curl git
  3. 安裝:nvm wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
  4. 安裝完以後 nvm --version 檢查下是否安裝成功 安裝 node: nvm install v8.11.3git

    • 好像下面兩步都不用作了 ,自動作好了
    • nvm use v8.10.0 nvm 指定使用的 node 的版本
    • nvm alias default v8.10.0 設置 node 默認使用版本
  5. 設置淘寶鏡像 npm --registry=https://registry.npm.taobao.org install -g npm github

    • 配置 cnpm npm --registry=https://registry.npm.taobao.org install -g cnpm
    • cnpm sync koa 同步 npm 上的模塊
  6. 增長系統文件監控數目 echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p (不知道是作什麼)
  7. 全局安裝 pm2 npm install -g pm2
  8. 開啓一個靜態站點web

    • pm2 是一個 node.js 部署和進程管理工具,經過它能夠實現 node.js 後臺運行(不是向上邊那樣關閉命令行服務就沒了)和出錯自動重啓
    • pm2 運維 node 服務自己
    • 運行 pm2 start app.js 便可運行 node 服務
    • pm2 list 列出當前運行的 pm2-node 服務
    • pm2 show [App name|id] 查看詳細信息
    • pm2 log app 查看實時日誌
    • 退出 log ctrl + c
    • 出現的問題: 沒法使用 80 端口之外的端口開啓服務(會不會centos默認只對外暴露 80 端口)

4. nginx 實現反向代理

經過對80端口的監聽,將80端口的流量轉發到其餘端口
讓web經過 80 端口被外網訪問
只有 root 權限的用戶才能使用 80 端口
服務器有多個網站 能夠經過 nginx 代理 80端口,轉發給 特定的端口,實現負載均衡
  1. 刪除自帶的 阿帕奇服務,個人阿里雲輕量服務器上好像並無找到 httpd
  2. 安裝 nginx下載好就行,不要再往下進行
  3. 進入 /etc/nginx/conf.d 目錄下,而後建立配置文件
  4. 配置文件:一個服務一個配置文件microblog-yao-3002.conf 命名規則:域名 + 端口mongodb

    # 考慮負載均衡策略
        upstream microblog {
            server 127.0.0.1:3002; // 本地node服務
        }
    
        server {
            listen 80;
            server_name code-sky.cn; // 域名
    
            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://microblog; // 把域名代理到應用上
                proxy_redirect off;
            }
        }
    
        檢查 nginx/nginx.conf 配置文件 去掉 include 註釋 
        include /etc/nginx/conf.d/*.conf;  這句在 nginx.conf 必需要在 http 裏面 server 外面
        sudo nginx -t 檢查 nginx 配置文件是否正確
        nginx 重啓  sudo nginx -s reload
        隱藏 nginx 版本  nginx.conf   http  設置  server_tokens off;
  5. nginx 對 css,js 靜態資源的處理(可以讓瀏覽器緩存靜態資源)

    # 在單獨應用的nginx配置裏,放在server裏面同 location同級
    # 對靜態資源的處理
    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js|pdf|txt) {
        root /www/blog/production/current/admin/dist/;
    }
    
    # 開啓gizp壓縮
    # new config lines for gzip
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 8k;
    gzip_http_version 1.1;
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/css;
  6. nginx 轉發配置(用 80端口代理,而後分發到不一樣的服務上)學習鏈接

5. 域名備案與DNS解析

  • 一個域名只能指向一個 ip 地址,一個 ip地址能夠被多個域名指向
  • 域名記錄:A記錄 將一個域名指向到一個服務器的 ip地址
  • CNAME 將一個域名指向另外一個域名
  • 解析域名:阿里雲域名控制檯-雲解析DNS-添加記錄 根據提示設置域名及二級域名

6. 安裝 mongoDB 數據庫

在服務器上搭建 MongoDB數據庫(通常狀況下,數據應該與應用分開,本身學習就無所謂了)

homebrew 本地安裝 MongoDB數據庫

  • 安裝 homebrew
  • brew 安裝本地mongoDB數據庫 brew install mongodb brew安裝MongoDB
  • 啓動mongodb服務:終端執行: brew services start mongodb
  • 使用brew 默認下載地址爲 /usr/local/Cellar/ 下的 mongodb文件夾。
To have launchd start mongodb now and restart at login:
brew services start mongodb
Or, if you don't want/need a background service you can just run:
mongod --config /usr/local/etc/mongod.conf

服務器安裝 MongoDB數據庫(centos環境)

  1. 安裝mongodb-1
  2. 安裝mongodb-2
  3. mongoDB操做

    啓動報錯處理       mongod -repair
    
    啓動mongodb 
    systemctl start mongod.service  or  
    service mongod start
    
    重啓mongodb     
    systemctl restart mongod.service   or     
    service mongod restart
    
    中止mongodb     
    systemctl stop mongod.service       or      
    service mongod stop
    
    查看mongodb狀態 systemctl status mongod.service
    
    登陸         mongo
    查看數據庫    show dbs
  4. 修改 mongodb 默認鏈接端口號

    sudo vi /etc/mongod.conf
    # port: 27017
    # 將端口號修改成 19999
    port: 19999
    bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
    修改完端口   重啓mongodb  sudo service mongod  restart
    
    指定端口鏈接  指定端口鏈接 mongodb  mongo --port 19999
    注意:若是設置了防火牆,要將防火牆更新
備份本地MongoDB數據庫
  • mongodump -h 127.0.0.1:27017 -d test2 -o microblog
  • test2 數據庫名稱 microblog 備份文件夾名稱
將備份文件scp上傳至服務器
  • 打包 tar zcvf microblog.tar.gz microblog
  • 前面:打包後的文件名稱 後面:打包前的文件夾
  • 上傳 scp -p 80 ./microblog.tar.gz root@39.106.220.6:/root/dbmicroblog
  • -p 服務器端口 本地tar包位置 服務器地址 服務器存放 tar 包的位置
  • 對服務器上的 tar 包進行解壓縮 tar -xzvf microblog.tar.gz
  • tar 命令:
    壓縮文件:tar -czvf test.tar.gz a.c    // 壓縮 a.c 文件爲 test.tar.gz
    解壓文件:tar -xzvf test.tar.gz a.c    // 解壓 test.tar.gz 爲 a.c
  • 將這個 test2 數據庫導入到線上剛剛配置完端口的數據庫
  • mongorestore --host 127.0.0.1:19999 -d test2 ./test2
  • 前面test2 線上數據庫的名稱
  • 後面 ./ test2 線上備份數據庫存儲的位置

  • 查看是否導入成功

    mongo --port 19999
    show dbs    查看數據庫
    use test2    進入test2數據庫
    show tables 查看test2數據庫中的表
    db.user.find({})    查看錶中的數據
  • 導入到線上已有的數據庫,導入一張或多張單表

    本地導出單表
    mongoexport -d immoc-movie -c users -q '{"name": {$ne: null}}' -o ./movie-users.json
    
    -d immoc-movie   數據庫名稱
    -c users 要導出的表
    -q 可選  查詢條件
    -o 導出文件在本地存放的位置
    
    將該單表 scp 上傳到服務器
    
    將該單表導入到 線上數據庫 
    mongoimport --host 127.0.0.1:19999 -d immoc-movie -c users ./movie-users.json
    
    建議導入初始化數據時在配置數據庫權限以前,否則輸入的命令會麻煩不少,輸入各類命令
    
    刪掉數據庫 mongo --host 127.0.0.1:19999 immoc-movie --eval "db.dropDatabase()"
  • mongod 打開mongoDB 服務
  • mongo 打開 mongoDB客戶端
  • brew services start mongodb
爲數據庫配置權限
爲數據庫設置用戶權限
設置  添加mongoDB管理員

use admin 
db.createUser({user: 'orange', pwd: 'yao1024', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]})

每次對不一樣數據庫建立管理員都須要到 admin 去認證
對用戶進行登陸受權
use admin
db.auth('orange', 'yao1024')

切換到 test2
use test2

建立讀寫權限用戶
db.createUser({user: 'microblog', pwd: 'microblog', roles: [{role: 'readWrite', db: 'test2'}]})

建立備份角色
db.createUser({user: 'wheel', pwd: 'wheel', roles: [{role: 'read', db: 'test2'}]})
 

修改配置文件開啓mongoDB驗證模式
sudo vi /etc/mongod.conf

# security:  將 #去掉
authorization: 'enable'  (兩個空格)

重啓 mongoDB 讓配置生效
sudo service mongod restart

從新登陸 mongo --port 19999
show dbs  就會報錯

use admin
db.auth('orange', 'yao1024') 

直接登陸某個數據庫
mongo 127.0.0.1:19999/test2 -u microblog -p microblog
數據庫名  用戶名  密碼
向線上運行的數據庫導入數據表
遷移數據庫、遷移數據庫的一張單表

先將 庫或單表導出到服務器的某個目錄裏,而後 tar 打包
用 scp -P 80 root@xx.xx.xx:/root/db/microblog.tar.gz
而後再把這個包上傳到另外一臺服務器上

線上生產數據庫定時備份(上傳到雲平臺)

7. 代碼部署

  • pm2,git倉庫 自動部署項目
  • 建立一個新項目第一次時: pm2 deploy ecosystem.json production setup
  • 接下來部署代碼部署代碼 pm2 deploy ecosystem.json production
  • pm2文檔

    1. 服務器安裝 git,(和本地安裝git同樣,配置 rsa_pub 等文件,能夠實現免密)
    2. 本地代碼上傳到代碼倉庫
    3. 服務器拉取代碼倉庫代碼
    
    4. 在項目根目錄建立 pm2 自動部署文件  ecosystem.json,編輯部署文件內容
    
    5. 在服務器根目錄上新建 /www   目錄,與 pm2 配置文件映射起來
    
    6. 在本地執行  pm2 deploy ecosystem.json production setup  便可成功部署
    
    7.  可能部署失敗的緣由:帳號權限不夠,服務器 www 文件不存在  部署的 user 用戶必需要有建立文件夾的權限
        原理:經過本地 pm2 登陸遠程服務器,通知遠程服務器從代碼倉庫拉取代碼到部署目錄
    
    8. pm2 在服務器上使用的是 非交互 ssh 鏈接方式,須要註釋 .bashec 文件內容  (個人centos 沒找到那兩句,因此什麼也沒作)
    
    9. 將 代碼倉庫更新,確保 ecosystem.json 存在於 /www/production/current 目錄裏
    
    10. 執行 pm2 deploy ecosystem.json production   部署成功,即發佈成功
    
    11. 修改 nginx 配置文件  建立3000端口的 conf      
        問題:如何開啓兩個端口共存,防火牆容許3000端口訪問,仍是申請個域名吧
    
    12. 代碼更新 pm2 deploy 的 HEAD 指向不了最新的提交,仍是指向上次的提交
        解決方法:須要在 pm2 配置文件中多加一行配置
        "post-deploy": "git pull && npm install && pm2 startOrRestart ecosystem.json --env production",
    
    13. 若是數據庫設置了用戶權限:代碼裏鏈接數據庫要以
    
    14.  若是沒有域名,怎麼在 nginx 配置映射二級域名,有 二級 ip地址之說嗎? 不要搞了,仍是備案域名吧

    8. 配置HTTPS 協議

    • 騰訊雲申請免費 SSL 證書(亞洲誠信DV SSL證書)
    • SSL證書管理頁面 -> 申請證書 -> 填入信息 -> 手動DNS 驗證 -> 驗證成功以後會獲得一條記錄包括(主機記錄 記錄類型(CNAME) 記錄值)-> 在阿里雲域名管理後臺新添加一條記錄(將剛纔獲得驗證記錄填寫進去)-> 填寫生效後,證書就頒發好了 參考連接
    • 將下載好的 SSL 證書上(Nginx目錄下)傳到 服務器上 scp -p 80 ./admin.code-sky.cn/Nginx/2_admin.code-sky.cn.key root@39.106.220.6:/root scp -p 80 ./admin.code-sky.cn/Nginx/1_admin.code-sky.cn_bundle.crt root@39.106.220.6:/root
    • 將上傳好的文件放到 一個名爲 ssl 的文件夾,而後將 ssl 文件夾移動到 /www 目錄下
    • 修改 nginx 配置文件

      upstream admin {
              server 127.0.0.1:3003;
          }
      
          server {
              listen 80;
              server_name admin.code-sky.cn;
              # rewrite ^(.*) https://$host$1 permanent;
              return 301 https://admin.code-sky.cn$request_uri;
          }
      
          server {
              listen 443;
              server_name admin.code-sky.cn; #填寫綁定證書的域名
              ssl on;
              ssl_certificate /www/ssl/1_admin.code-sky.cn_bundle.crt;
              ssl_certificate_key /www/ssl/2_admin.code-sky.cn.key;
              ssl_session_timeout 5m;
              ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個協議配置
              ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個套件配置
              ssl_prefer_server_ciphers on;
      
              if ($ssl_protocol = "") {
              rewrite ^(.*) https://$host$1 permanent;
              }
      
              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://admin;
                  proxy_redirect off;
              }
              location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js|pdf|txt) {
                  root /www/blog/production/current/admin/dist/;
              }
      
              # new config lines for gzip
              gzip on;
              gzip_min_length 1k;
              gzip_buffers 4 8k;
              gzip_http_version 1.1;
              gzip_types text/plain application/javascript application/x-javascript text/javascript text/css;
          }
    • 檢查 nginx 文件配置是否正確 sudo nginx -t
    • 重啓nginx sudo nginx -s reload 即完成 https 配置

相關文章
相關標籤/搜索