使用Nginx和pm2部署Next.js項(xiàng)目
概述
只有一臺服務(wù)器,所以上圖服務(wù)都都在一個云服務(wù)器上。其中Nginx
分別在用戶和Next
服務(wù)之間代理、在Next
和后臺之間代理。
常規(guī)的前臺頁面不需要這樣做,例如Vue
中直接把build
之后的dist
文件拷貝到nginx
的html
目錄并配置nginx指向即可,但是Next
可以做到服務(wù)端渲染(SSR
)所以Next
的前臺頁面實(shí)際上是一個nodejs
服務(wù),所以nginx
在這里是代理用戶請求,proxy_pass
到這個nodejs
服務(wù)上。
而前后臺之間的nginx代理屬于反向代理,一般也通過proxy_pass
去rewrite
路徑進(jìn)行代理,我沒配置這個。
Next.js配置
在需要SSR
的page
中需要添加 getStaticProps
(getStaticProps
這些function只能寫在page
文件夾中,不可以在components
中用),注意可以設(shè)置revalidate
定時重新build
頁面,這樣頁面也可以定期更新,如下:
export async function getStaticProps() { //后臺取數(shù)據(jù) const result = await queryTimelineList() // console.log(result) return { props: { timelineData: result.data, }, // 重新繪制頁面時長 1200 ,單位秒 revalidate: 1200 }; }
另外,注意在動態(tài)路由的page中,需要設(shè)置fallback
為true
,且頁面中要增加對fallback
為false
的處理,否則build的時候會報錯,如下 一個名為 [postId].js
的page:
const PostId = ({postId, postDetail, recentPosts,curTags}) => { const router = useRouter() // 注意,這里要處理 if (router.isFallback) { return <div>Loading...</div> } ... } // Fetch data at build time export async function getStaticProps(context) { const postId = context.params.postId const [postDetailResult, recentPostsResult, curPostTagsResult] = await Promise.all([ queryPostDetailByPostId(postId), queryRecentPostList(), queryTagListByPostId(postId) ] ) return { props: { postId: postId, postDetail: postDetailResult?.data, recentPosts: recentPostsResult?.data, curTags: curPostTagsResult?.data }, revalidate: 300 }; } // Specify dynamic routes to pre-render pages based on data. // The HTML is generated at build time and will be reused on each request. export async function getStaticPaths() { const postIdsResult = await queryPostIdList(); const postIdList = postIdsResult.data return { paths: postIdList.map((postId) => { // 這里如果傳的是數(shù)字會報錯,必須轉(zhuǎn)為字符串 return {params: {postId: postId.toString()}} }), // 設(shè)置為true fallback: true, }; }
Nginx配置
完整的nginx.conf
配置文件如下:
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # HTTPS server # server { listen 443 ssl; server_name btyhub.site, www.btyhub.site; # ssl兩個文件,放在 nginx的conf目錄中 ssl_certificate btyhub.site_bundle.pem; ssl_certificate_key btyhub.site.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 代理到Next的服務(wù),默認(rèn)3000端口,也可以在start的時候指定 location / { proxy_pass http://127.0.0.1:3000/; } } # 監(jiān)聽普通http請求,重寫至https server{ listen 80; server_name btyhub.site, www.btyhub.site; rewrite ^(.*)$ https://$host$1 permanent; } }
pm2啟動
ps:除了使用pm2
啟動Next
服務(wù)外,也可以npm run build
之后直接nohup npm run start
。
首先要安裝node環(huán)境,安裝完了將命令添加到全局bin中:
# /usr/local/node是我的node安裝目錄 ln -s /usr/local/node/bin/npm /usr/local/bin/ ln -s /usr/local/node/bin/npx /usr/local/bin/ ln -s /usr/local/node/bin/node /usr/local/bin/
其次,全局安裝pm2
并加入全局bin:
npm install -g pm2 ln -s /usr/local/node/bin/pm2 /usr/local/bin/
測試,是否安裝成功:
pm2 -version
運(yùn)行next服務(wù)
需要將項(xiàng)目源文件上傳至云服務(wù)器:
運(yùn)行npm run build
運(yùn)行pm2 start --name yourappname npm -- start
后記:
域名配置完要隔幾天才可以給網(wǎng)站備案,備案之后才可以通過域名訪問,在這之前可以先用ip地址測試。
到此這篇關(guān)于使用Nginx和pm2部署Next.js項(xiàng)目的文章就介紹到這了,更多相關(guān)Nginx和pm2部署Next.js內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx tcp負(fù)載均衡的具體實(shí)現(xiàn)
Nginx是比較不錯的開源Web服務(wù)器之一,它也可以用作TCP和UDP負(fù)載均衡器,本文主要介紹了nginx tcp負(fù)載均衡的具體實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-05-05Nginx的安裝和多域名配置的實(shí)現(xiàn)方法
這篇文章主要介紹了Nginx的安裝和多域名配置的實(shí)現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09nginx禁止直接通過ip進(jìn)行訪問并跳轉(zhuǎn)到自定義500頁面的操作
這篇文章主要介紹了nginx禁止直接通過ip進(jìn)行訪問并跳轉(zhuǎn)到自定義500頁面的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Nginx實(shí)現(xiàn)404頁面的配置方法的兩種方法
在使用Nginx作為Web服務(wù)器時,配置404頁面是一項(xiàng)基本需求,本文介紹了兩種配置404頁面的方法,這兩種方法各有特點(diǎn),可以根據(jù)實(shí)際需求選擇適合的配置方式2024-09-09解決Nginx location中配置proxy_pass轉(zhuǎn)發(fā)時斜線‘/‘導(dǎo)致404問題
這篇文章主要介紹了解決Nginx location中配置proxy_pass轉(zhuǎn)發(fā)時斜線‘/‘導(dǎo)致404問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05keepalived+nginx實(shí)現(xiàn)網(wǎng)站高可用性
本文主要介紹了keepalived+nginx實(shí)現(xiàn)網(wǎng)站高可用性,包含配置Keepalived實(shí)現(xiàn)雙主熱備集群架構(gòu),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02nginx proxy_set_header設(shè)置自定義header的實(shí)現(xiàn)步驟
在Nginx中,使用?proxy_set_header指令可以自定義header并在反向代理時傳遞到后端服務(wù)器,本文就來詳細(xì)的介紹一下,具有一定的參考價值,感興趣的可以了解一下2024-05-05