nginx部署發布Vite項目

1 引言

在之前的文章《Ubuntu云服務器上部署發布Vite項目》中筆者使用了Vite提供的預覽服務(npm run preview)來在云服務器上發布Web應用。這樣做輕量應用是沒問題的,不過遇到一些專業的問題就不行了,最好還是使用專業的HTTP服務器。除此之外,筆者還有一些其他的需求:

  1. 前后端分離的項目,需要將后端的服務轉發到前端服務IP相同的端口(443端口)。
  2. 子域名的項目,需要將服務轉發到主域名服務IP相同的端口(443端口)。

這個時候就需要使用nginx,畢竟nginx不僅是一款輕量、高性能的HTTP服務器,還支持轉發和代理服務功能。不過上述兩個問題后面在討論,本篇就詳細記錄一下部署發布單個Vite項目的問題。

2 詳述

2.1 操作

首先,還是需要先安裝nginx:

sudo apt install nginx

然后,準備Vite項目,需要確保項目已經通過npm run build構建好,并且生成了靜態文件目錄(通常是dist目錄下)。

接下來,在/etc/nginx/sites-available/目錄下創建一個新的配置文件,例如筆者這里創建一個charlee44文件。在這個文件中填入如下內容:

server { # 定義服務器listen 80; # 監聽80端口server_name charlee44.com; # 服務器域名root /path/to/your/project/dist; # 項目build后的實際路徑index index.html; # 主頁location / {  #位置塊,定義路由try_files $uri $uri/ /index.html;}
}

sites-available目錄下創建的配置是可用的配置,要真正啟用這個配置需要在sites-enabled目錄中,因此創建軟鏈接:

sudo ln -s /etc/nginx/sites-available/charlee44 /etc/nginx/sites-enabled/

最后就是測試Nginx配置并重啟服務,在終端輸入以下命令:

sudo nginx -t
sudo systemctl restart nginx

2.2 配置

上面的配置很好理解,基本已經注釋清楚了,就是位置塊部分有點難理解,具體意思是:

  • $uri:先看看有沒有和請求路徑完全一致的文件存在,比如 /about.html
  • $uri/:如果沒有,再看看是否是一個目錄,比如 /about/
  • 如果都沒有,就返回 /index.html

不太理解也沒關系,等以后有需求了再來了解清楚。如果這個配置測試沒有問題,在訪問主頁時頁面提示:

500 Internal Server Error
nginx/1.18.0 (Ubuntu)

那么有可能是權限不夠,可以檢查一下文件/var/log/nginx/error.log是否有類似“Permission denied”的提示。Ubuntu中有些目錄是受保護的目錄(例如/root目錄),可以將build項目移動到nginx可以正常訪問的目錄,例如/var下目錄。

如果想配置HTTPS服務,那么就可以使用如下配置:

# HTTP 跳轉 HTTPS
server {listen 80;server_name charlee44.com;return 301 https://$host$request_uri; # 返回301永久重定向,將請求跳轉到HTTPS版本
}# HTTPS 服務
server {listen 443 ssl;server_name charlee44.com;# SSL證書ssl_certificate /etc/nginx/ssl/charlee44.com/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/charlee44.com/charlee44.com.key;ssl_protocols TLSv1.2 TLSv1.3; # 啟用安全的加密協議版本ssl_ciphers HIGH:!aNULL:!MD5; # 設置加密套件,禁用不安全的算法root /var/www/charlee44.com;index index.html;location / {try_files $uri $uri/ =404; # 嘗試查找對應文件或目錄,否則返回404頁面}
}

這段配置的意思是如果用戶通過HTTP訪問網站,那么就將請求轉發到HTTPS的443端口上。另外,HTTPS最重要的一點還有需要申請SSL證書(可以參考筆者之前的文章《在Ubuntu上使用Certbot申請Let’s Encrypt SSL證書》來進行申請)。

2.3 優化

上述HTTPS服務的配置,經過筆者的實際測試,性能比不上Vite提供的預覽服務(npm run preview)。原因是因為nginx是高度可配,還有很多優化選項可以配置,具體配置如下:

# HTTP 跳轉 HTTPS
server {listen 80;server_name charlee44.com;return 301 https://$host$request_uri;
}# HTTPS 服務
server {listen 443 ssl http2;  # ? 啟用 HTTP/2server_name charlee44.com;ssl_certificate /etc/letsencrypt/live/charlee44.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/charlee44.com/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;root /var/www/charlee44.com;index index.html;# ? 靜態資源緩存 + Cache-Controllocation ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {expires max;add_header Cache-Control "public, immutable";log_not_found off;}# ? HTML 文件緩存短一些(可選)location ~ \.html$ {expires 1h;}# ? 默認處理入口location / {try_files $uri $uri/ =404;}# ? 啟用 Gzip 壓縮gzip on;gzip_types application/javascript text/css;gzip_comp_level 6;# ? 提升文件傳輸效率sendfile on;tcp_nopush on;tcp_nodelay on;
}

相比之前的配置,在性能上主要優化了以下幾點:

2.3.1 啟用HTTP/2

使用HTTP/2協議可以實現多路復用、頭部壓縮等特性,顯著提升加載速度:

listen 443 ssl http2;  # ? 啟用 HTTP/2

2.3.2 靜態資源緩存控制

設置瀏覽器緩存策略,減少重復請求,加快頁面加載速度:

# ? 靜態資源緩存 + Cache-Control
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {expires max;  # 設置些資源永不過期add_header Cache-Control "public, immutable";   # 設置緩存策略:公開可緩存,內容不變log_not_found off; # 不記錄不存在的文件的404日志
}# ? HTML 文件緩存短一些(可選)
location ~ \.html$ {expires 1h; # HTML文件可能經常更新,設置較短緩存時間
}

2.3.3 Gzip壓縮

啟用Gzip并指定壓縮類型,以減少傳輸體積,加快網頁加載速度(尤其對 JS/CSS):

# ? 啟用 Gzip 壓縮
gzip on;
gzip_types application/javascript text/css;
gzip_comp_level 6; # 啟用 Gzip 壓縮時,使用壓縮級別 6(共 1 到 9 級)

2.3.4 文件傳輸優化

提升網絡傳輸效率,降低延遲,提高吞吐量:

# ? 提升文件傳輸效率
sendfile on;
tcp_nopush on;  # 合并頭部+正文,減少小包數量
tcp_nodelay on;   # 對動態請求或 WebSocket 立即發送數據

3 結語

其實HTTP服務器的性能優化遠不止這點內容,針對本篇內容的性能優化配置,筆者就可以想到兩點:

  1. 靜態資源緩存控制的性能優化是通知客戶端緩存文件資源,那么是否可以在服務器上緩存文件資源到內存呢?這樣當客戶端請求過來,就可以不經過硬盤直接傳輸內存中的數據,這樣可以節省一次磁盤IO。
  2. 啟用Gzip壓縮,壓縮文件也是算在客戶端請求響應時間的,那么是否可以預先將文件按照最高級別進行壓縮,然后需要的時候再直接傳輸出去呢?這樣可以節省臨時文件的時間,同時也最大程度的減少的文件傳輸體積。

其實這兩個問題,甚至更多的性能優化思路,nginx都有一定程度的解決方案,就留待以后再研究吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913170.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913170.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913170.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity文件夾標簽 —— FolderTag

GitHub地址 FolderTag 下載之后解壓,將FolderTag文件夾拖進Unity項目的Assets文件夾 選中文件夾,填上標簽

【0基礎開發油猴腳本】某漫畫網站圖片旋轉

有朋友在用某漫畫網站在線看漫畫,但是那個網站會把漫畫圖片右旋90度,如圖。于是,他就像我發起了求助,問我能不能寫個腳本。我說,AI都發展到2025了,前端(腳本)這種東西還用自己寫嗎&a…

Vue Router 中,params參數的名稱必須與路由配置中的動態路徑參數名完全一致

路由配置與 params 參數的綁定關系 在路由配置中,使用 冒號(:) 定義動態路徑參數: // router.js(路由配置) { path: /search/:keyword, // 這里的:keyword是動態路徑參數 name: Search, component: S…

Spring Boot 應用開發實戰指南:從入門到實戰(內含實用技巧+項目案例)

📘 Spring Boot 應用開發實戰指南:從入門到實戰(內含實用技巧項目案例)🚀 你是否還在為 Spring 配置復雜、開發效率低下而苦惱?Spring Boot 早已成為 Java 后端開發的“標配”,本篇文章將帶你全…

【NLP入門系列五】中文文本分類案例

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 博主簡介:努力學習的22級本科生一枚 🌟?;探索AI算法,C,go語言的世界;在迷茫中尋找光芒…

【微信小程序】- 監聽全局globalData數據

【微信小程序】- 監聽全局globalData數據 數據劫持(Object.defineProperty)實現適用場景 數據劫持(Object.defineProperty) 實現 通過攔截 globalData 的屬性讀寫實現自動監聽,適合精確監聽特定變量。 ?實現步驟?&…

高速公路閑置土地資源化利用:廣西浦北互通3MW分布式光伏監控實踐

摘要: 分布式光伏項目在清潔能源轉型中扮演重要角色,其創新的空間利用模式有助于緩解能源開發與土地資源間的矛盾。廣西大唐至浦北高速公路(浦北互通)項目,利用高速公路沿線閑置空地建設光伏電站,發揮了分布…

【Linux網絡編程】網絡基礎

目錄 計算機網絡背景 初識協議 網絡協議 協議分層 OSI七層模型 TCP/IP五層(或四層)模型 再識協議 為什么要有TCP/IP協議? 什么是TCP/IP協議? 重談協議 網絡傳輸基本流程 局域網傳輸流程 跨網絡傳輸流程 Socket編程預備 理解源IP地址與目的…

BlenderBot對話機器人大模型Facebook開發

文章目錄 🚀 BlenderBot 的關鍵特性🧪 版本與改進📊 應用實例 Blender是攪拌機,果汁機,混合機的意思。 BlenderBot 是由 Facebook AI Research (FAIR) 開發的一種先進的對話生成模型。它旨在通過融合多種對話技能&…

60天python訓練計劃----day59

在之前的學習中,我們層層遞進的介紹了時序模型的發展,從AR到MA到ARMA,再到ARIMA。本質就是把數據處理的操作和模型結合在一起了,實際上昨天提到的季節性差分也可以合并到模型中,讓流程變得更加統一。 季節性差分用S來…

學習日志05 python

我相信事在人為,人定勝天,現在還是在基礎語法上面打轉,還是會提出一些很低級的很基礎的問題,不要著急,波浪式前進、螺旋式上升的過程吧,雖然現在的確是很絕望吧...... 今天要做一個練習:編寫猜…

LiteHub中間件之gzip算法

gzip算法理論部分LZ777算法霍夫曼編碼算法改進型的LZ777算法代碼實現壓縮對象gzip實現運行分析日志查看wireshark抓包查看后臺管理界面查看理論部分 gzip是一種無損壓縮算法,其基礎為Deflate,Deflate是LZ77與哈弗曼編碼的一個組合體。它的基本原理是&…

java+vue+SpringBoo校園失物招領網站(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔(1萬字以上)開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言:后端:Java 前端:vue框架:springboot數據庫:mysql 開發工具 JDK版本:JDK1.…

Qt Quick 與 QML(五)qml中的布局

QML布局系統主要分為三大類:錨布局、定位器布局、布局管理器。一、錨布局(Anchors)通過定義元素與其他元素或父容器的錨點關系實現精確定位,支持動態調整。核心特性屬性??作用??示例?anchors.left左邊緣對齊目標元素anchors.…

【Java|集合類】list遍歷的6種方式

本文主要是總結一下Java集合類中List接口的遍歷方式&#xff0c;以下面的list為例&#xff0c;為大家講解遍歷list的6種方式。 List<Integer> list new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);文章目錄1.直接輸出2.for循環遍…

博弈論基礎-筆記

取石子1 性質一&#xff1a;12345可以確定先手贏&#xff0c;6不論取那個質數都輸&#xff0c;789 10 11可以分別取12345變成6 性質二&#xff1a;6的倍數一定不能取出之后還是6的倍數&#xff08;不能轉換輸態&#xff09; #include <bits/stdc.h> using namespace st…

多任務學習-ESMM

簡介 ESMM&#xff08;Entire Space Multi-task Model&#xff09;是2018年阿里巴巴提出的多任務學習模型。基于共享的特征表達和在用戶整個行為序列空間上的特征提取實現對CTR、CVR的聯合訓練 解決的問題 SSB&#xff08;sample selection bias&#xff09; 如下圖1所示&am…

K8S 集群配置踩坑記錄

系統版本&#xff1a;Ubuntu 22.04.5-live-server-amd64 K8S 版本&#xff1a;v1.28.2 Containerd 版本&#xff1a; 1.7.27 kubelet logs kuberuntime_sandbox.go:72] "Failed to create sandbox for pod" err"rpc error: code Unknown desc failed to cre…

超濾管使用與操作流程-實驗操作013

超濾管使用與操作流程 超濾管&#xff08;或蛋白濃縮管&#xff09;是一種重要的實驗設備&#xff0c;廣泛應用于分離與純化大分子物質&#xff0c;尤其是蛋白質、多糖和核酸等。其工作原理依賴于超濾技術&#xff0c;通過半透膜對分子進行篩分&#xff0c;精準地將大分子物質…

GitHub已破4.5w star,從“零樣本”到“少樣本”TTS,5秒克隆聲音,沖擊傳統錄音棚!

嗨&#xff0c;我是小華同學&#xff0c;專注解鎖高效工作與前沿AI工具&#xff01;每日精選開源技術、實戰技巧&#xff0c;助你省時50%、領先他人一步。&#x1f449;免費訂閱&#xff0c;與10萬技術人共享升級秘籍&#xff01;你是否為錄音成本高、聲音不靈活、又想為多語言…