IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Nginx反向代理端口丢失问题解决方案,同时支持域名访问和IP访问 -> 正文阅读

[系统运维]Nginx反向代理端口丢失问题解决方案,同时支持域名访问和IP访问

问题描述

项目通过Nginx反向代理后,在通过相对路径跳转页面后,报404错误问题,最后排查出来是端口丢失导致。

输入url: http://192.168.xxx.10:8080/myApp/a.html 可以正常访问到页面
但是在这个页面跳转到 myApp/b.html页面,
实际跳转后url: http://192.168.xxx.10/myApp/b.html 这样就出现无法正常显示页面了
若手工将url改为 http://192.168.xxx.10/myApp/b.html 可以正常访问页面

运行环境

举个栗子:项目名称为myApp 运行端口为8080
内网访问地址(只是个🌰,不能访问的哟):
http://192.168.xxx.10:8080/myApp
外网访问地址
http://test.com/myApp

Nginx 配置如下:

http {
	upstream myApp{
        server 127.0.0.1:8081;
    }
	upstream myApp2{
        server 127.0.0.1:8082;
    }
	
    server {
        listen       8080;
        server_name  localhost;
        charset utf-8;
        
        location /myApp {
            proxy_pass  http://myApp2;
            proxy_buffer_size 64k;
            proxy_buffers   32 32k;
            proxy_busy_buffers_size 128k;
            proxy_set_header Host $host;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_redirect default;
            proxy_connect_timeout 600s;
            proxy_send_timeout 600s;
            proxy_read_timeout 600s;
        }
        location /myApp2 {
            proxy_pass http://myApp2;
            proxy_buffer_size 64k;
            proxy_buffers   32 32k;
            proxy_busy_buffers_size 128k;
            proxy_set_header Host $host;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_redirect default;
            proxy_connect_timeout 600s;
            proxy_send_timeout 600s;
            proxy_read_timeout 600s;
        }
    }
}

解决方案

这个问题出现的原因为nginx没有正确的把端口信息传送到后端,没能正确的配置nginx,关键配置如下:

proxy_set_header Host $host:$server_port;

加上这个配置以后,通过IP访问的方式可以正常跳转,若你的服务只是通过ip访问当然可以完美解决了。
若还要提供域名无端口访问那就麻烦了,输入url: http://test.com/myApp/a.html 可以正常访问到页面
但是在这个页面跳转到 myApp/b.html页面,
实际跳转后url: http://test.com:8080/myApp/b.html 这样就出现无法正常显示页面了,因Nginx
配置了$host:$server_port,这样导致所有连接都会加上端口。要处理这个问题需要对ip访问和域名访问进行区分。

Nginx关键代码

        	set $serverPort '';
			if ($host = '192.168.0.10') {
				set $serverPort ':${server_port}';
			}
			proxy_set_header Host $host$serverPort;

Nginx修改后的完整代码:

http {
	upstream myApp{
        server 127.0.0.1:8081;
    }
	upstream myApp2{
        server 127.0.0.1:8082;
    }
	
    server {
        listen       8080;
        server_name  localhost;
        charset utf-8;
        
        location /myApp {
        	set $serverPort '';
			if ($host = '192.168.0.10') {
				set $serverPort ':${server_port}';
			}
            proxy_pass  http://myApp;
            proxy_buffer_size 64k;
            proxy_buffers   32 32k;
            proxy_busy_buffers_size 128k;
            proxy_set_header Host $host$serverPort;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_redirect default;
            proxy_connect_timeout 600s;
            proxy_send_timeout 600s;
            proxy_read_timeout 600s;
        }
        location /myApp2 {
        	set $serverPort '';
			if ($host = '192.168.0.10') {
				set $serverPort ':${server_port}';
			}
            proxy_pass http://myApp2;
            proxy_buffer_size 64k;
            proxy_buffers   32 32k;
            proxy_busy_buffers_size 128k;
            proxy_set_header Host $host$serverPort;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_redirect default;
            proxy_connect_timeout 600s;
            proxy_send_timeout 600s;
            proxy_read_timeout 600s;
        }
    }
}

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:29:48  更:2022-06-01 15:30:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 18:35:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码