最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx部署前端項(xiàng)目實(shí)戰(zhàn)指南及常見錯誤

 更新時間:2026年02月07日 09:39:17   作者:鯊莎分不晴  
在前端開發(fā)過程中經(jīng)常是需要把前端靜態(tài)資源放到服務(wù)器中看效果,這時經(jīng)常用到nginx來配置,這篇文章主要介紹了Nginx部署前端項(xiàng)目實(shí)戰(zhàn)指南及常見錯誤的相關(guān)資料,需要的朋友可以參考下

1. 前言與場景描述

在現(xiàn)代前后端分離的架構(gòu)中,前端通常使用 Vue.js、React 等框架開發(fā)。開發(fā)完成后,通過構(gòu)建工具(Webpack/Vite)打包成一堆靜態(tài)文件(HTML, CSS, JS, Images)。

我們的目標(biāo)是

將這些靜態(tài)文件放到服務(wù)器上,利用 Nginx 作為 Web 服務(wù)器響應(yīng)用戶的 HTTP 請求。同時,Nginx 還需要充當(dāng)“反向代理”,將前端對 /api 的請求轉(zhuǎn)發(fā)給后端的 Java/Go/Python 服務(wù),從而解決跨域問題。

假設(shè)環(huán)境

  • 操作系統(tǒng):CentOS 7 / Ubuntu 20.04 或 Docker 環(huán)境
  • 前端項(xiàng)目:一個標(biāo)準(zhǔn)的 Vue 3 項(xiàng)目
  • 后端地址http://192.168.1.100:8080
  • 域名www.example.com

2. 準(zhǔn)備工作:獲取前端包

首先,你需要在本地開發(fā)環(huán)境中將代碼打包。

# 在項(xiàng)目根目錄下執(zhí)行
npm run build
# 或者
yarn build

執(zhí)行完畢后,項(xiàng)目根目錄下會生成一個 dist(或 build)文件夾。結(jié)構(gòu)大致如下:

dist/
├── css/
├── js/
├── img/
├── favicon.ico
└── index.html  <-- 入口文件

關(guān)鍵點(diǎn):你需要把這個 dist 文件夾完整地上傳到服務(wù)器的某個目錄,例如 /usr/share/nginx/html/my-app。

3. Nginx 基礎(chǔ)安裝與配置(Linux 宿主機(jī)模式)

如果直接在 Linux 服務(wù)器上運(yùn)行 Nginx:

3.1 安裝 Nginx

# CentOS
sudo yum install epel-release
sudo yum install nginx

# Ubuntu
sudo apt update
sudo apt install nginx

# 啟動并設(shè)置開機(jī)自啟
sudo systemctl start nginx
sudo systemctl enable nginx

3.2 配置文件結(jié)構(gòu)

Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf。為了便于管理,我們通常不直接修改主文件,而是在 /etc/nginx/conf.d/ 目錄下創(chuàng)建一個新的 .conf 文件,例如 my-app.conf。

3.3 編寫最基礎(chǔ)的配置

新建文件 /etc/nginx/conf.d/my-app.conf

server {
    # 監(jiān)聽端口,HTTP 默認(rèn)為 80
    listen       80;
    # 服務(wù)器域名或 IP
    server_name  www.example.com;

    # 日志路徑(建議配置,方便排錯)
    access_log  /var/log/nginx/my-app.access.log;
    error_log   /var/log/nginx/my-app.error.log;

    # 核心配置:靜態(tài)資源映射
    location / {
        # 指定靜態(tài)資源文件的根目錄
        # 這里對應(yīng)你上傳 dist 文件夾的絕對路徑
        root   /usr/share/nginx/html/my-app;
        
        # 指定默認(rèn)首頁
        index  index.html index.htm;
    }
}

測試并重載

nginx -t   # 檢查語法是否正確
nginx -s reload # 重載配置

此時,訪問 http://www.example.com,你應(yīng)該能看到你的頁面了。但是,這還只是個開始,接下來的配置才是重頭戲。

4. 進(jìn)階配置一:解決 SPA(單頁應(yīng)用)刷新 404 問題

問題描述

如果你的前端使用了 History 路由模式(例如 Vue Router 的 history mode),當(dāng)你點(diǎn)擊頁面跳轉(zhuǎn)到 /user/profile 時一切正常,但如果你在 /user/profile 頁面點(diǎn)擊瀏覽器的刷新按鈕,或者直接復(fù)制這個 URL 打開,Nginx 會報(bào) 404 Not Found。

原因

Nginx 默認(rèn)會去 root 目錄下找名為 user 文件夾下的 profile 文件。但這是一個單頁應(yīng)用,實(shí)際上只有 index.html,不存在物理路徑 /user/profile。

解決方案

利用 try_files 指令。

server {
    listen       80;
    server_name  www.example.com;
    root   /usr/share/nginx/html/my-app;
    index  index.html;

    location / {
        # 核心指令 try_files
        # 含義:嘗試按照順序訪問文件
        # 1. $uri: 找有沒有對應(yīng)的具體文件(比如 style.css)
        # 2. $uri/: 找有沒有對應(yīng)的目錄
        # 3. /index.html: 如果前兩個都找不到,無條件重定向到 index.html
        try_files $uri $uri/ /index.html;
    }
}

這樣配置后,Nginx 發(fā)現(xiàn)找不到文件時,就會把請求交給 index.html,前端的 JS 路由接管 URL 并渲染正確的組件。

5. 進(jìn)階配置二:反向代理(解決跨域與 API 轉(zhuǎn)發(fā))

問題描述

前端代碼中請求接口寫的是 axios.get('/api/users')。
如果不配置代理,請求會發(fā)送到 http://www.example.com/api/users。但后端接口實(shí)際上在 http://192.168.1.100:8080/api/users。此外,如果前后端域名不同,還會產(chǎn)生 CORS 跨域問題。

解決方案

在 Nginx 中配置 proxy_pass。

server {
    # ... 省略前面的配置 ...

    # 匹配所有以 /api/ 開頭的請求
    location /api/ {
        # 后端服務(wù)地址
        # 注意:結(jié)尾是否有斜杠 '/' 區(qū)別很大,下面詳細(xì)說明
        proxy_pass http://192.168.1.100:8080/;
        
        # 代理設(shè)置(標(biāo)準(zhǔn)配置,直接復(fù)制即可)
        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;

        # 可選:如果后端接口響應(yīng)慢,可以增加超時時間
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
    }
}

關(guān)于 proxy_pass 結(jié)尾斜杠的“天坑”說明

  1. 帶斜杠proxy_pass http://ip:port/;
    • 請求 http://domain/api/user -> 轉(zhuǎn)發(fā)到 http://ip:port/user
    • Nginx 會把 /api/ 切掉。
  2. 不帶斜杠proxy_pass http://ip:port;
    • 請求 http://domain/api/user -> 轉(zhuǎn)發(fā)到 http://ip:port/api/user
    • Nginx 會把完整的路徑拼接到后端地址后。

通常后端接口本身包含 /api 前綴時,使用不帶斜杠的方式;如果后端不包含前綴,使用帶斜杠的方式剔除前綴。

6. 進(jìn)階配置三:性能優(yōu)化(Gzip 與 緩存)

前端構(gòu)建出的 app.jschunk-vendors.js 往往比較大,必須開啟 Gzip 壓縮,并設(shè)置強(qiáng)緩存。

server {
    # ... 基礎(chǔ)配置 ...

    # --- 開啟 Gzip 壓縮 ---
    gzip on;
    # 啟用 gzip 壓縮的最小文件,小于設(shè)置值的文件將不會壓縮
    gzip_min_length 1k;
    # gzip 壓縮級別,1-9,數(shù)字越大壓縮的越好,也越占用CPU時間
    gzip_comp_level 6;
    # 進(jìn)行壓縮的文件類型
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    # 是否在http header中添加Vary: Accept-Encoding,建議開啟
    gzip_vary on;

    # --- 瀏覽器緩存策略 ---
    
    # 1. 針對 index.html:永遠(yuǎn)不緩存
    # 因?yàn)?index.html 引用了帶 hash 的 js/css,如果它被緩存了,發(fā)版后用戶將無法加載新資源
    location = /index.html {
        add_header Cache-Control "no-cache, no-store, must-revalidate";
        add_header Pragma "no-cache";
        add_header Expires "0";
        # 這里需要重新指定 root,或者利用外層的 root 配置
        try_files $uri $uri/ =404; 
    }

    # 2. 針對靜態(tài)資源(JS/CSS/圖片):設(shè)置超長緩存
    # Webpack/Vite 打包后的文件名都帶 hash (e.g., app.a1b2c3d4.js)
    # 文件內(nèi)容變了 hash 才會變,所以可以放心設(shè)置永久緩存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires 1y; # 緩存一年
        add_header Cache-Control "public, no-transform";
        access_log off; # 靜態(tài)資源訪問不記錄日志,減少磁盤 I/O
    }

    # 其他配置...
}

7. 高級部署:Docker 化(推薦)

現(xiàn)在很少直接在物理機(jī)上裝 Nginx 了,使用 Docker 部署更加干凈、可移植。

我們將使用 Multi-stage builds (多階段構(gòu)建):在一個 Dockerfile 中完成“構(gòu)建”和“部署”兩步。

7.1 準(zhǔn)備 Dockerfile

在項(xiàng)目根目錄下(和 package.json 同級)創(chuàng)建名為 Dockerfile 的文件:

# --- 第一階段:構(gòu)建階段 ---
# 使用 Node 鏡像打包
FROM node:18-alpine as build-stage

# 設(shè)置工作目錄
WORKDIR /app

# 先復(fù)制 package.json 安裝依賴(利用 Docker 緩存層)
COPY package*.json ./
RUN npm install --registry=https://registry.npmmirror.com

# 復(fù)制源代碼并構(gòu)建
COPY . .
RUN npm run build

# --- 第二階段:生產(chǎn)環(huán)境 Nginx ---
FROM nginx:stable-alpine as production-stage

# 復(fù)制第一階段構(gòu)建好的 dist 目錄到 Nginx 默認(rèn)目錄
# 注意:Vite 默認(rèn)打包目錄是 dist,如果是 create-react-app 可能是 build
COPY --from=build-stage /app/dist /usr/share/nginx/html

# 復(fù)制自定義的 Nginx 配置文件(見下文 7.2)
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 暴露端口
EXPOSE 80

# 啟動 Nginx,daemon off 保證容器不退出
CMD ["nginx", "-g", "daemon off;"]

7.2 準(zhǔn)備 nginx.conf

在項(xiàng)目根目錄下創(chuàng)建一個 nginx.conf 文件(這個文件會被 copy 進(jìn)鏡像):

server {
    listen       80;
    server_name  localhost; # Docker 內(nèi)部通常用 localhost 即可

    # 開啟 gzip
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        # 解決 Router History 模式 404
        try_files $uri $uri/ /index.html;
    }

    # 接口代理
    location /api/ {
        # 注意:在 Docker 中,如果后端也在 Docker 里,這里寫后端容器的服務(wù)名
        # 如果后端在宿主機(jī),可以使用 host.docker.internal (Mac/Win) 或 宿主機(jī)真實(shí) IP
        proxy_pass http://backend-service:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

7.3 構(gòu)建與運(yùn)行

# 1. 構(gòu)建鏡像
docker build -t my-frontend-app:v1 .

# 2. 運(yùn)行容器
# -d 后臺運(yùn)行
# -p 80:80 將宿主機(jī)的 80 端口映射到容器的 80 端口
docker run -d -p 80:80 --name my-frontend my-frontend-app:v1

8. 完整 Nginx 配置文件模板 (Summary)

為了方便你直接復(fù)制使用,這里提供一個整合了上述所有特性的完整配置文件:

# /etc/nginx/conf.d/frontend.conf

server {
    # 1. 端口與域名
    listen       80;
    server_name  www.example.com;
    
    # 2. 根目錄設(shè)置
    root   /usr/share/nginx/html/dist;
    index  index.html;

    # 3. 日志設(shè)置
    access_log  /var/log/nginx/host.access.log  main;
    error_log   /var/log/nginx/host.error.log  warn;

    # 4. Gzip 壓縮優(yōu)化
    gzip on;
    gzip_static on; # 如果存在 .gz 文件直接使用,不現(xiàn)場壓縮
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 6;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";

    # 5. 主應(yīng)用路由 (SPA 支持)
    location / {
        # 解決單頁應(yīng)用 History 模式刷新 404 問題
        try_files $uri $uri/ /index.html;
        
        # 針對 index.html 設(shè)置協(xié)商緩存或不緩存
        add_header Cache-Control "no-cache, no-store, must-revalidate";
    }

    # 6. 靜態(tài)資源長緩存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
        access_log off;
    }

    # 7. 反向代理接口
    location /api/ {
        # 假設(shè)后端接口地址
        proxy_pass http://127.0.0.1:8080/api/;
        
        # 傳遞真實(shí) IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 支持 WebSocket (如果需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # 8. 錯誤頁面處理
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

9. 常見報(bào)錯排查 (Troubleshooting)

Q1: 訪問頁面出現(xiàn)403 Forbidden

原因:Nginx 啟動用戶(通常是 nginxnobody)沒有權(quán)限讀取你的 dist 目錄。
解決

  1. 修改 nginx.conf 頭部,將 user nginx; 改為 user root;(簡單粗暴,但不安全)。
  2. 或者賦予目錄權(quán)限:chmod -R 755 /usr/share/nginx/html/dist

Q2: 訪問頁面白屏,控制臺報(bào)錯Uncaught SyntaxError: Unexpected token <

原因:這通常是因?yàn)?Nginx 沒找到 JS/CSS 文件,觸發(fā)了 try_files 回退到了 index.html。瀏覽器把 index.html 的 HTML 內(nèi)容當(dāng)成了 JS 解析,所以報(bào)錯。
排查

  1. 檢查 build 時的 publicPathbase 設(shè)置。如果項(xiàng)目部署在子路徑(如 /app/),前端構(gòu)建配置必須設(shè)置對應(yīng)的 base。
  2. 檢查 Nginx root 路徑是否正確。

Q3: 反向代理接口報(bào) 502 Bad Gateway

原因:Nginx 連不上后端服務(wù)。
排查

  1. 后端服務(wù)沒啟動。
  2. 防火墻攔截了端口。
  3. 如果用了 Docker,檢查容器網(wǎng)絡(luò)(Docker 容器內(nèi)無法通過 127.0.0.1 訪問宿主機(jī)服務(wù))。

10. 總結(jié)

Nginx 掛載前端包的核心步驟可以概括為:

  1. Build:生成 dist 靜態(tài)資源。
  2. Root:配置 Nginx 指向該目錄。
  3. Try_files:配置兜底策略解決 SPA 路由問題。
  4. Proxy:配置反向代理打通后端 API。

掌握了這份指南,無論是簡單的個人博客還是復(fù)雜的企業(yè)級中臺系統(tǒng),你都能從容應(yīng)對其前端部署工作。希望這份翔實(shí)的教程對你有所幫助!

到此這篇關(guān)于Nginx部署前端項(xiàng)目實(shí)戰(zhàn)指南及常見錯誤的文章就介紹到這了,更多相關(guān)Nginx部署前端項(xiàng)目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nginx+lua+redis實(shí)現(xiàn)限流的示例代碼

    nginx+lua+redis實(shí)現(xiàn)限流的示例代碼

    本文主要介紹了nginx+lua+redis實(shí)現(xiàn)限流的示例代碼,包括HttpRedis模塊、HttpRedis2Module模塊和lua-resty-redis庫,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-12-12
  • nginx常用配置conf的示例代碼詳解

    nginx常用配置conf的示例代碼詳解

    這篇文章主要介紹了nginx常用配置conf,包括配置vue項(xiàng)目,配置接口代理的代碼詳解,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • nginx結(jié)合openssl實(shí)現(xiàn)https的方法

    nginx結(jié)合openssl實(shí)現(xiàn)https的方法

    這篇文章主要介紹了基于nginx結(jié)合openssl實(shí)現(xiàn)https的方法,準(zhǔn)備工作大家需要安裝nginx服務(wù),具體操作過程跟隨小編一起看看吧
    2021-07-07
  • nginx降權(quán)與匹配php詳細(xì)講解

    nginx降權(quán)與匹配php詳細(xì)講解

    大部分網(wǎng)站開發(fā)語言都要運(yùn)行在服務(wù)器,比如主流的nginx、apache等等,下面這篇文章主要給大家介紹了關(guān)于nginx降權(quán)與匹配php的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Nginx 流量鏡像使用的方法示例

    Nginx 流量鏡像使用的方法示例

    Nginx流量鏡像技術(shù)可以在不影響原始請求的情況下復(fù)制請求數(shù)據(jù),用于數(shù)據(jù)分析、安全監(jiān)控等方面,本文就來介紹一下Nginx 流量鏡像使用的方法示例,感興趣的可以了解一下
    2024-10-10
  • 使用nginx同域名下部署多個vue項(xiàng)目并使用反向代理的方法

    使用nginx同域名下部署多個vue項(xiàng)目并使用反向代理的方法

    這篇文章主要介紹了使用nginx同域名下部署多個vue項(xiàng)目并使用反向代理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • nginx打印請求頭日志方法(親測可用)

    nginx打印請求頭日志方法(親測可用)

    之前想用nginx打印收到的請求的請求頭,但是只找到打印請求體的,沒有打印請求頭的,本文就來介紹一下nginx打印請求頭日志方法,感興趣的可以了解一下
    2023-11-11
  • nginx提示:500 Internal Server Error錯誤的解決方法

    nginx提示:500 Internal Server Error錯誤的解決方法

    本文章來給大家總結(jié)了大量關(guān)于導(dǎo)致nginx中提示500 Internal Server Error錯誤的原因總結(jié)與解決方法分析有需要了解的朋友可參考參考
    2013-04-04
  • linux上nginx安裝部署及使用過程詳解

    linux上nginx安裝部署及使用過程詳解

    這篇文章主要介紹了linux上nginx安裝部署及使用過程,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2019-11-11
  • Nginx負(fù)載均衡詳細(xì)介紹

    Nginx負(fù)載均衡詳細(xì)介紹

    nginx不單可以作為強(qiáng)大的web服務(wù)器,也可以作為一個反向代理服務(wù)器,而且nginx還可以按照調(diào)度規(guī)則實(shí)現(xiàn)動態(tài)、靜態(tài)頁面的分離,可以按照輪詢、ip哈希、URL哈希、權(quán)重等多種方式對后端服務(wù)器做負(fù)載均衡,同時還支持后端服務(wù)器的健康檢查
    2016-09-09

最新評論

绥德县| 茌平县| 绥江县| 广州市| 湛江市| 遂川县| 苍溪县| 金华市| 精河县| 横山县| 安陆市| 克拉玛依市| 枞阳县| 仲巴县| 绥棱县| 通榆县| 青川县| 林州市| 新龙县| 清水县| 宁城县| 北安市| 汝州市| 周口市| 乌兰察布市| 奇台县| 黄石市| 林西县| 梅州市| 南川市| 罗定市| 霍城县| 上犹县| 大兴区| 永登县| 云安县| 文安县| 广西| 六盘水市| 缙云县| 翁牛特旗|