服務端渲染應用部署應該先編譯構建,然后再啟動 Nuxt 服務,可通過以下兩個命令來完成:
nuxt build
nuxt start
我們已經在pakage.json里配置好script命令
{ "scripts": { "dev": "nuxt", "build": "nuxt build", "start": "nuxt start", "generate": "nuxt generate" }, }
即先用npm run build編譯打包,然后用npm run start發布項目,如果在本地http://localhost:3000 依然可以啟動項目,說明打包是ok的
這時我們只需要在本地npm run build打包后,會在.nuxt生成一些新的文件,我們把.nuxt 、nuxt.config.js、pakage.json 、static四個文件/文件夾放到服務器上,然后安裝依賴:npm install
最后用pm2來啟動項目
pm2 是一個帶有負載均衡功能的Node應用的進程管理器。當你要把你的獨立代碼利用全部的服務器上的所有CPU,並保證進程永遠都活着,0秒的重載, PM2是完美的。在服務器shell中,先安裝pm2,安裝后pm2 list查看進程列表,如果說pm2未找到,需要設置下環境變量
安裝pm2,直接全局安裝 (pm2 官網地址:http://pm2.keymetrics.io )
npm install -g pm2
pm2安裝ok后,進入nuxt項目目錄,執行
pm2 start npm --name ‘project-name’ -- start
project-name,就是package.json里的name名
啟動項目,這時項目運行在你服務器上的3000端口上,我們還需要使用nginx 作為反向代理把這個端口專門映射到一個域名上
#通過upstream nodejs 可以配置多台nodejs節點,做負載均衡
#keepalive 設置存活時間。如果不設置可能會產生大量的timewait
#proxy_pass 反向代理轉發 http://nodejs
upstream nodenuxt { server 127.0.0.1:3000; #nuxt項目 監聽端口 keepalive 64; }
配置代碼參考了很多的文檔,主要參考這篇:next.js、nuxt.js等服務端渲染框架構建的項目部署到服務器,並用PM2守護程序,代碼如下
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream nodenuxt { server 127.0.0.1:3000; # nuxt 項目監聽PC端端口 keepalive 64; } server { listen 80; server_name localhost; location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Nginx-Proxy true; proxy_cache_bypass $http_upgrade; proxy_pass http://nodenuxt;
}
location ^~/api/ {
proxy_pass http://119.3.166.247:8080/;
} error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
如果之后需要更新代碼,本地重啟打包把上述文件替換到服務器上,然后重啟pm2即可
pm2 restart all
在使用pm2中遇到的問題
這是第一次使用Nodejs 啟動服務, pm2 也還有更多高級的配置需要學習, 記錄的過程也比較粗糙打算自己重復幾次完善一下 ,這里有遇到一個pm2的一個問題, 在啟動服務的時候遇到這個錯誤
SyntaxError: Unexpected token : at createScript (vm.js:80:10) at Object.runInThisContext (vm.js:139:10) at Module._compile (module.js:616:28) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) at Function.Module._load (module.js:497:3) at Object.<anonymous> (C:\Users\關文峰\AppData\Roaming\npm\node_modules\pm2\lib\ProcessContainerFork.js:27:21) at Module._compile (module.js:652:30) at Object.Module._extensions..js (module.js:663:10)
GitHub 上面有解決方案 https://github.com/Unitech/pm2/issues/2808
There's your problem - when you do that, you're telling pm2 to interpret the "npm script" with an argument of start.
Try putting a npm-cmd call into a start script called startscript.js, and then doing pm2 start startscript.js. Eg npm install node-cmd --save; in startscript.js: var cmd=require('node-cmd'); cmd.run('npm start'); pm2 start startscript.js
也就是說:需要安裝 node-cmd 這個包,之后創建一個 start.js 文件使用指令啟動該文件
cnpm install node-cmd --save-dev
然后啟動命令:pm2 start start.js
這樣就解決了這個問題。解決完這個問題之后我發現啟動完一直有一個 npm 命令框存在也關不掉好像也沒啥影響就是看着有點不舒服