前端渲染: vue、react等單頁面項目應該這樣子部署到服務器
貌似從前幾年,前后端分離逐漸就開始流行起來,把一些渲染計算的工作拋向前端以便減輕服務端的壓力,但為啥現在又開始流行在服務端渲染了呢?如vue全家桶或者react全家桶,都推薦通過服務端渲染來實現路由。搞得我們慌得不行,不禁讓我想起一句話:從來沒有任何一門語言的技術棧像Javascript一樣,學習者拼盡全力也不讓精通。
沒辦法,流行,咱們就得學!
前斷時間寫了一篇vue、react等單頁面項目應該這樣子部署到服務器,結果反響不錯!最近好多朋友私信或邀請問很多關於next.js和nuxt.js的問題,比如關於nextjs 和 nuxtjs如何部署?
,pm2如何配合?
...在這里我們就一起討論下在服務器上使用PM2守護next.js、nuxt.js等服務端渲染框架構建的項目!該篇我們只討論服務端渲染應用部署
,靜態應用部署
就是我前段時間寫的vue、react等單頁面項目應該這樣子部署到服務器。
Nginx配置
既然是應用,我們就應該有域名,在這里我們以 nginx配置
為例,簡單配置如下:
Next域名:http://next.sosout.com/
Nuxt域名:http://nuxt.sosout.com/
http {
.... # 省略其他配置
server {
listen 80;
server_name *.sosout.com;
if ($host ~* "^(.*?)\.sosout\.com$") {
set $domain $1;
}
location / {
if ($domain ~* "next") {
root /mnt/html/next;
}
if ($domain ~* "nuxt") {
root /mnt/html/nuxt;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
access_log /mnt/logs/nginx/access.log main;
}
#tcp_nopush on;
include /etc/nginx/conf.d/*.conf;
}
Nginx反向代理
由於服務端渲染的各個應用端口號各不相同,因此這個時候我們就需要反向代理了,配置如下:
#通過upstream nodejs 可以配置多台nodejs節點,做負載均衡
#keepalive 設置存活時間。如果不設置可能會產生大量的timewait
#proxy_pass 反向代理轉發 http://nodejs
upstream nodenext {
server 127.0.0.1:3001; #next項目 監聽端口
keepalive 64;
}
server {
listen 80;
server_name next.sosout.com;
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://nodenext; #反向代理
}
}
upstream nodenuxt {
server 127.0.0.1:3002; #nuxt項目 監聽端口
keepalive 64;
}
server {
listen 80;
server_name nuxt.sosout.com;
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; #反向代理
}
}
服務器的准備工作已完成,接下來我們就分別看看Next.js和Nuxt.js服務端渲染應用如何部署?
Next.js服務端渲染應用部署
部署 Next.js 服務端渲染的應用不能直接使用 next
命令,而應該先進行編譯構建,然后再啟動 Next 服務,官方通過以下兩個命令來完成:
next build
next start
官方推薦的 package.json 配置如下:
{
"name": "my-app",
"dependencies": {
"next": "latest"
},
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
}
}
而我更推薦如下配置,稍后你會發現這樣和 pm2
一起使用更方便,自動化部署也方便:
{
"name": "my-app",
"dependencies": {
"next": "latest"
},
"scripts": {
"dev": "next",
"start": "next start -p $PORT",
"build": "next build && PORT=3001 npm start"
}
}
next.js服務端渲染應用部署這樣就完成了,官方先后執行 npm run build 、npm start
即可完成部署。而我這邊只要執行 npm run build
,其實我只是把兩個合並成一個,並設置了端口以便區別其他應用,避免端口占用!
接下來簡單的說一下next這幾個命令:next:
啟動一個熱加載的Web服務器(開發模式)next build:
利用webpack編譯應用,壓縮JS和CSS資源(發布用)。next start:
以生成模式啟動一個Web服務器 (next build
會先被執行)。
Nuxt.js服務端渲染應用部署
其實部署 Nuxt.js 服務端渲染的應用和 Next.js
極其相似!在這里我就把代碼粘粘貼貼,復復制制,改改寫寫。。。。
Nuxt.js 服務端渲染的應用不能直接使用 nuxt
命令,而應該先進行編譯構建,然后再啟動 Nuxt 服務,官方通過以下兩個命令來完成:
nuxt build
nuxt start
官方推薦的 package.json 配置如下:
{
"name": "my-app",
"dependencies": {
"nuxt": "latest"
},
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start"
}
}
而我更推薦如下配置,稍后你會發現這樣和 pm2
一起使用更方便,自動化部署也方便:
{
"name": "my-app",
"dependencies": {
"nuxt": "latest"
},
"scripts": {
"dev": "nuxt",
"start": "PORT=3002 nuxt start",
"build": "nuxt build && npm start"
}
}
nuxt.js服務端渲染應用部署這樣就完成了,官方先后執行 npm run build 、npm start
即可完成部署。而我這邊只要執行 npm run build
,其實我只是把兩個合並成一個,並設置了端口以便區別其他應用,避免端口占用!
接下來簡單的說一下nuxt這幾個命令:nuxt:
啟動一個熱加載的Web服務器(開發模式)nuxt build:
利用webpack編譯應用,壓縮JS和CSS資源(發布用)。nuxt start:
以生成模式啟動一個Web服務器 (nuxt build
會先被執行)。
PM2守護程序
Next.js使用pm2,進入對應的應用目錄,執行以下命令:
pm2 start npm --name "my-next" -- run build
Nuxt.js使用pm2,進入對應的應用目錄,執行以下命令:
pm2 start npm --name "my-nuxt" -- run build
使用pm2時,把兩個部署命令合成一個更方便!
執行完pm2的啟動命令后,我們用 pm2 list
查看一下進程列表,我截一下我個人服務器的pm2列表:
以后您就可以用pm2進行維護了,比如我們的next應用更改了代碼,因為當時創建時給next應用命名的進程名稱為 my-next
,因此我們可以直接使用 pm2 reload my-next
進行重載。接下來我就簡單介紹一下pm2,如果有需要,我可以另寫一篇關於pm2的文章!
pm2 簡單介紹
pm2是nodejs的一個帶有負載均衡功能的應用進程管理器的模塊,類似有Supervisor,forever,用來進行進程管理。
一、安裝:
npm install pm2 -g
二、啟動:
pm2 start app.js
pm2 start app.js --name my-api #my-api為PM2進程名稱
pm2 start app.js -i 0 #根據CPU核數啟動進程個數
pm2 start app.js --watch #實時監控app.js的方式啟動,當app.js文件有變動時,pm2會自動reload
三、查看進程:
pm2 list
pm2 show 0 或者 # pm2 info 0 #查看進程詳細信息,0為PM2進程id
四、監控:
pm2 monit
五、停止:
pm2 stop all #停止PM2列表中所有的進程
pm2 stop 0 #停止PM2列表中進程為0的進程
六、重載:
pm2 reload all #重載PM2列表中所有的進程
pm2 reload 0 #重載PM2列表中進程為0的進程
七、重啟:
pm2 restart all #重啟PM2列表中所有的進程
pm2 restart 0 #重啟PM2列表中進程為0的進程
八、刪除PM2進程:
pm2 delete 0 #刪除PM2列表中進程為0的進程
pm2 delete all #刪除PM2列表中所有的進程
九、日志操作:
pm2 logs [--raw] #Display all processes logs in streaming
pm2 flush #Empty all log file
pm2 reloadLogs #Reload all logs
十、升級PM2:
npm install pm2@lastest -g #安裝最新的PM2版本
pm2 updatePM2 #升級pm2
十一、更多命令參數請查看幫助:
pm2 --help
十二、PM2目錄結構:
- 1、默認的目錄是:當前用於的家目錄下的.pm2目錄(此目錄可以自定義,請參考:十三、自定義啟動文件),詳細信息如下:
$HOME/.pm2 #will contain all PM2 related files
$HOME/.pm2/logs #will contain all applications logs
$HOME/.pm2/pids #will contain all applications pids
$HOME/.pm2/pm2.log #PM2 logs
$HOME/.pm2/pm2.pid #PM2 pid
$HOME/.pm2/rpc.sock #Socket file for remote commands
$HOME/.pm2/pub.sock #Socket file for publishable events
$HOME/.pm2/conf.js #PM2 Configuration
十三、自定義啟動文件:
- 1、創建一個test.json的示例文件,格式如下:
{
"apps":
{
"name": "test",
"cwd": "/data/wwwroot/nodejs",
"script": "./test.sh",
"exec_interpreter": "bash",
"min_uptime": "60s",
"max_restarts": 30,
"exec_mode" : "cluster_mode",
"error_file" : "./test-err.log",
"out_file": "./test-out.log",
"pid_file": "./test.pid"
"watch": false
}
}
- 2、參數說明:
apps:json結構,apps是一個數組,每一個數組成員就是對應一個pm2中運行的應用
name:應用程序的名稱
cwd:應用程序所在的目錄
script:應用程序的腳本路徑
exec_interpreter:應用程序的腳本類型,這里使用的shell,默認是nodejs
min_uptime:最小運行時間,這里設置的是60s即如果應用程序在60s內退出,pm2會認為程序異常退出,此時觸發重啟max_restarts設置數量
max_restarts:設置應用程序異常退出重啟的次數,默認15次(從0開始計數)
exec_mode:應用程序啟動模式,這里設置的是cluster_mode(集群),默認是fork
error_file:自定義應用程序的錯誤日志文件
out_file:自定義應用程序日志文件
pid_file:自定義應用程序的pid文件
watch:是否啟用監控模式,默認是false。如果設置成true,當應用程序變動時,pm2會自動重載。這里也可以設置你要監控的文件。
由於工作原因,一直沒光顧segmentfault,收到很多關於部署的私信和評論,特此補充以下內容:
部署(以nuxt為例)
基礎模板的部署方式
何為基礎模板?使用了 vue init nuxt-community/starter-template <project-name>
進行搭建的!
第一步,打包
在執行 npm run build
的時候, nuxt
會自動打包。
第二步,選擇要部署的文件(社友最關心的步驟):
-
.nuxt/
文件夾 -
package.json
文件 -
nuxt.config.js
文件(如果你配置proxy等,則需要上傳這個文件,建議把它傳上去)
第三步,啟動你的nuxt:
使用pm2啟動你的nuxt.js:
$ npm install // or yarn install 如果未安裝依賴或依賴有更改 $ pm2 start npm --name "my-nuxt" -- run start ```