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

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

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

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

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

  2. 查看硬盤掛在情況:fdisk -l (如果有數據盤的情況下)
  3. 查看硬盤使用情況 df -h
  4. 通過zsh設置快捷登錄 alias ssh_orange="ssh [email protected]*.*"
  5. root 權限,可以增加幾個擁有root權限的用戶

    • 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 環境)

      配置用戶權限:
      修改 /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 實現無密碼登錄

     本地操作:
     本地生成 ssh key: ssh-keygen -t rsa -b 4096 -C "[email protected]"  同 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. 端口安全性

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

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.3

    • 好像下面兩步都不用做了 ,自動做好了
    • 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

    • 配置 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. 開啓一個靜態站點

    • 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 命名規則:域名 + 端口

    # 考慮負載均衡策略
        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 [email protected]:/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 [email protected]:/root/db/microblog.tar.gz
然後再把這個包上傳到另一臺服務器上

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

7. 代碼部署

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

    1. 服務器安裝 git
    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 [email protected]:/root scp -p 80 ./admin.code-sky.cn/Nginx/1_admin.code-sky.cn_bundle.crt [email protected]:/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 配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章