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

Nginx代理導(dǎo)致API 500錯誤的排查與修復(fù)指南

 更新時間:2026年07月02日 08:38:05   作者:SebastianLiam  
前端訪問 http://localhost:9527/dev-api/Login/getStaticResource 返回 500 Internal Server Error,直接訪問 http://anyu-portal.test/ 正常,所以本文給大家介紹了Nginx代理導(dǎo)致API 500錯誤的排查與修復(fù)指南,需要的朋友可以參考下

問題描述

前端訪問 http://localhost:9527/dev-api/Login/getStaticResource 返回 500 Internal Server Error,直接訪問 http://anyu-portal.test/ 正常。

技術(shù)棧

  • 前端:Vue.js + Vue CLI (devServer proxy)
  • 后端:ThinkPHP 5.x + PHP 7.4
  • 容器:Docker Compose (nginx, php-fpm)
  • 代理:Nginx 反向代理

請求鏈路分析

瀏覽器 localhost:9527/dev-api/Login/getStaticResource
    ↓ Vue devServer proxy (vue.config.js)
Nginx anyu-portal-frontend.test/api/Login/getStaticResource
    ↓ Nginx location /api/ proxy_pass (anyu-front.conf)
Nginx anyu-portal.test/Login/getStaticResource
    ↓ Nginx location ~ .php$ fastcgi_pass (anyu-portal.conf)
PHP-FPM anyu-portal/Public/index.php

配置文件檢查

1. Vue devServer 代理配置

vue.config.js

proxy: {
  [process.env.VUE_APP_BASE_API]: {
    target: 'http://anyu-portal-frontend.test/api',
    changeOrigin: true,
    pathRewrite: {
      ['^' + process.env.VUE_APP_BASE_API]: ''
    }
  }
}

VUE_APP_BASE_API = /dev-api,所以:

  • 請求 /dev-api/Login/getStaticResource
  • 被轉(zhuǎn)發(fā)到 http://anyu-portal-frontend.test/api/Login/getStaticResource

2. Nginx 前端站點(diǎn)配置

anyu-front.conf

server {
    listen 80;
    server_name anyu-frontend.test *.anyu-frontend.test;
    root "/www/anyu-portal-frontend";
    location / {
        try_files $uri $uri/ /index.html;
    }
    location /api/ {
        proxy_set_header Host $http_x_forwarded_host;
        proxy_pass http://anyu-portal.test/;
    }
}

3. Nginx 后端站點(diǎn)配置

anyu-portal.conf

server {
    listen 80;
    server_name anyu-portal.test;
    root /www/anyu-portal/Public;
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?s=$1 last;
    }
    location ~ \.php$ {
        fastcgi_pass php:9000;
        include fastcgi-php.conf;
        include fastcgi_params;
    }
}

4. Docker Compose 網(wǎng)絡(luò)配置

docker-compose.yml

services:
  nginx:
    extra_hosts:
      - "openapi:127.0.0.1"
      - "lvs:127.0.0.1"
      - "admin:127.0.0.1"
      - "portal:127.0.0.1"
    # 缺少: anyu-portal.test:127.0.0.1

排查過程

步驟 1:直接測試后端 API

從 nginx 容器內(nèi)部直接訪問后端:

docker exec nginx curl -v http://anyu-portal.test/Login/getStaticResource

結(jié)果:返回 200 OK,后端 API 本身正常。

步驟 2:測試代理鏈路

從 nginx 容器內(nèi)部通過前端域名訪問:

docker exec nginx curl -v http://anyu-portal-frontend.test/api/Login/getStaticResource

結(jié)果:返回 500 Internal Server Error。

步驟 3:檢查 Host 頭問題

直接訪問時 curl 會發(fā)送 Host: anyu-portal.test,但通過 /api/ 代理時:

proxy_set_header Host $http_x_forwarded_host;

$http_x_forwarded_host 是客戶端請求的 X-Forwarded-Host 頭,通常為空。當(dāng) Host 頭為空時,后端 ThinkPHP 的 getStaticResource 方法無法正確識別 SERVER_NAME,導(dǎo)致找不到合作伙伴配置。

步驟 4:檢查域名解析

nginx 容器的 extra_hosts 中沒有配置 anyu-portal.test,雖然之前已經(jīng)添加了,但需要確認(rèn)是否生效。

根因分析

問題有兩個層面:

  1. Host 頭為空proxy_set_header Host $http_x_forwarded_host; 設(shè)置了一個通常為空的變量,導(dǎo)致轉(zhuǎn)發(fā)到后端時沒有正確的 Host 頭。
  2. 域名解析:nginx 容器內(nèi)部無法解析 anyu-portal.test(雖然之前已添加到 extra_hosts)。

后端 ThinkPHP 的 getStaticResource 方法依賴 SERVER_NAME 獲取合作伙伴配置:

public function getStaticResource() {
    $server_name = SERVER_NAME;  // 依賴 $_SERVER['SERVER_NAME']
    $redis = new Redis();
    $redis->connect(C("REDIS_HOST"), C("REDIS_PORT"));
    // ...
    if(!C('PARTNER')) {
        $this->setPartner($redis, $server_name);  // 根據(jù) server_name 獲取合作伙伴
    }
    // ...
}

當(dāng) Host 頭為空或不正確時,SERVER_NAME 無法正確識別,導(dǎo)致 C('PARTNER') 為空,后續(xù)操作失敗。

修復(fù)方案

修復(fù) 1:修改 Nginx 代理配置

文件services/nginx/conf.d/anyu-front.conf

# 修改前
location /api/ {
    proxy_set_header Host $http_x_forwarded_host;
    proxy_pass http://anyu-portal.test/;
}
# 修改后
location /api/ {
    proxy_set_header Host anyu-portal.test;
    proxy_pass http://anyu-portal.test/;
}

修復(fù) 2:添加域名解析

文件docker-compose.yml

services:
  nginx:
    extra_hosts:
      - "openapi:127.0.0.1"
      - "lvs:127.0.0.1"
      - "admin:127.0.0.1"
      - "portal:127.0.0.1"
      - "anyu-portal.test:127.0.0.1"  # 新增

修復(fù) 3:重載 Nginx 配置

docker exec nginx nginx -s reload

驗證

docker exec nginx curl -v http://anyu-portal-frontend.test/api/Login/getStaticResource

結(jié)果:返回 200 OK,JSON 數(shù)據(jù)正常。

總結(jié)

經(jīng)驗教訓(xùn)

  1. Host 頭很重要:反向代理時,proxy_set_header Host 必須設(shè)置正確的值,后端框架(如 ThinkPHP)依賴它來識別當(dāng)前站點(diǎn)。
  2. 容器內(nèi)部域名解析:Docker Compose 的 extra_hosts 只對容器內(nèi)部生效,宿主機(jī)的 hosts 文件不會自動同步到容器。
  3. 排查順序:先測試直接訪問后端,再測試完整代理鏈路,定位問題出在哪一層。
  4. 變量陷阱$http_x_forwarded_host 是客戶端請求頭,不是 Nginx 內(nèi)置變量,不要誤以為它會自動填充。

最佳實踐

location /api/ {
    proxy_set_header Host $proxy_host;  # 使用 proxy_pass 中指定的主機(jī)名
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://backend/;
}

使用 $proxy_host 可以自動獲取 proxy_pass 中指定的主機(jī)名,比硬編碼更靈活。

以上就是Nginx代理導(dǎo)致API 500錯誤的排查與修復(fù)指南的詳細(xì)內(nèi)容,更多關(guān)于Nginx代理導(dǎo)致API 500錯誤的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • nginx中proxy_pass各種用法詳解

    nginx中proxy_pass各種用法詳解

    nginx中配置location代理轉(zhuǎn)發(fā)規(guī)則的時候不同寫法對應(yīng)不同轉(zhuǎn)發(fā)規(guī)則。本文就介紹幾種常見的匹配情況,感興趣的可以了解一下
    2021-11-11
  • shell腳本定時統(tǒng)計Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫

    shell腳本定時統(tǒng)計Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫

    這篇文章主要介紹了shell腳本定時統(tǒng)計Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫的實現(xiàn)方法 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • Nginx添加內(nèi)置模塊過程

    Nginx添加內(nèi)置模塊過程

    文章指導(dǎo)如何檢查并添加Nginx的with-http_gzip_static模塊:確認(rèn)該模塊未默認(rèn)安裝后,需下載同版本源碼重新編譯,備份替換原有二進(jìn)制文件,最后重啟服務(wù)驗證功能
    2025-08-08
  • 國內(nèi)一些常用PHP的CMS的Nginx服務(wù)器的偽靜態(tài)規(guī)則整理

    國內(nèi)一些常用PHP的CMS的Nginx服務(wù)器的偽靜態(tài)規(guī)則整理

    當(dāng)我們從apache服務(wù)器轉(zhuǎn)向Nginx服務(wù)器的時候,它們的偽靜態(tài)規(guī)則就不一樣了,所以你熟悉Nginx服務(wù)器的偽靜態(tài)規(guī)則,自己寫當(dāng)然也好
    2011-03-03
  • Nginx實現(xiàn)精準(zhǔn)IP訪問控制的方法全攻略

    Nginx實現(xiàn)精準(zhǔn)IP訪問控制的方法全攻略

    在日常服務(wù)器運(yùn)維、前后端聯(lián)調(diào)、測試環(huán)境部署中,精準(zhǔn)控制訪問權(quán)限是高頻且核心的需求,Nginx?作為當(dāng)下最流行的?Web?服務(wù)器和反向代理工具,本文將從基礎(chǔ)用法入手,結(jié)合實際測試場景,拆解?Nginx?IP?訪問控制的核心指令、實用技巧、常見坑點(diǎn),需要的朋友可以參考下
    2026-03-03
  • Nginx手動編譯、安裝超詳細(xì)教程

    Nginx手動編譯、安裝超詳細(xì)教程

    Nginx安裝除了編譯以外,我們還可以直接用操作系統(tǒng)上自帶的工具比如說yum、apt-get直接安裝,這篇文章主要介紹了Nginx手動編譯、安裝超超詳解,需要的朋友可以參考下
    2023-09-09
  • Nginx+SSL+Node.js運(yùn)行環(huán)境配置教程

    Nginx+SSL+Node.js運(yùn)行環(huán)境配置教程

    這篇文章主要介紹了Nginx+SSL+Node.js運(yùn)行環(huán)境配置教程,本文用反向代理的方式代理基于Node.js的Web應(yīng)用,需要的朋友可以參考下
    2014-09-09
  • 強(qiáng)大的 Web 應(yīng)?服務(wù)器OpenResty安裝(Nginx倉庫)

    強(qiáng)大的 Web 應(yīng)?服務(wù)器OpenResty安裝(Nginx倉庫)

    OpenResty 是?個強(qiáng)大的 Web 應(yīng)?服務(wù)器,Web 開發(fā)?員可以使用 Lua 腳本語?調(diào)動 Nginx ?持的各種 C 以及 Lua 模塊,更主要的是在性能方面,OpenResty可以快速構(gòu)造出足以勝任 10K 以上并發(fā)連接響應(yīng)的超高性能 Web 應(yīng)用系統(tǒng)
    2023-06-06
  • nginx.conf配置兩個前端路徑

    nginx.conf配置兩個前端路徑

    本文主要介紹了nginx.conf配置兩個前端路徑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 詳解Nginx HTTP負(fù)載均衡和反向代理配置

    詳解Nginx HTTP負(fù)載均衡和反向代理配置

    這篇文章主要介紹了詳解Nginx HTTP負(fù)載均衡和反向代理配置,有需要的同學(xué)可以了解一下。
    2016-11-11

最新評論

日照市| 中方县| 崇仁县| 平陆县| 石棉县| 大埔县| 礼泉县| 宜章县| 弥渡县| 武陟县| 增城市| 施秉县| 甘泉县| 宁强县| 莒南县| 南皮县| 高清| 色达县| 华安县| 科技| 塘沽区| 淮阳县| 曲周县| 浠水县| 微博| 新泰市| 南昌县| 开原市| 交城县| 正定县| 苏州市| 阆中市| 石河子市| 晋城| 云浮市| 射阳县| 衡东县| 鄂尔多斯市| 新蔡县| 晋宁县| 泾川县|