百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

nginx实战之反向代理

off999 2025-03-05 20:20 26 浏览 0 评论

1、反向代理

所谓反向代理就是nginx接受到请求后,将请求转发给内部的一台服务器处理,比如我们启动了一个tomcat是8081端口,但是我们防火墙不会开放8081端口,只会开放nginx的80端口,那么我们需要再nginx上进行反向代理配置,让到80端口的请求转发给8081端口处理,这样安全性也有很大的提高,并且后续可以进行负载均衡:80端口进来,从代理的多台服务器按策略选一台处理。

1.1、8081端口服务搭建

我们这里就不启动tomcat来模拟服务了,直接在nginx上配置个8081端口的server即可,nginx配置文件做如下处理

server {
        listen       8081;
        server_name  localhost;
        location / {
            root   html;
            index  index8081.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

这里的意思是,请求从8081进来,会返回index8081.html的页面,这个页面会在nginx目录下面的html里面,内容如下




Welcome to nginx!



    

Welcome to 8081!

到这里就相当于有一个新的服务了。

1.2、nginx反向代理配置

下面我们来配置负载均衡,我们在nginx.conf的http配置里面新增upstream.

 upstream first { 
   server  localhost:8081; 
}

然后,在80的server进行代理配置

server {
        listen       80;
        server_name  localhost;
        location / {
        #反向代理配置
            proxy_pass         http://first; 
            proxy_set_header   Host             $host; 
            proxy_set_header   X-Real-IP        $remote_addr; 
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

1.3、重新启动nginx

我们可以先用-t命令校验下配置文件是否正确

./nginx -t

检查正确后,进行重新加载

./nginx -s reload

1.4、访问测试

我们访问80端口,然后可以看到返回了index8081.html的页面内容,表面反向代理成功。

1.5、proxy_set_header

我们看到,反向代理设置的时候,有进行proxy_set_header设置,那这个的作用是什么呢?

即允许重新定义或添加字段传递给代理服务器的请求头,简而言之,proxy_set_header 就是可设置请求头-并将头信息传递到服务器端,不属于请求头的参数中也需要传递时,重定义下即可!

主要有三个参数需要设置

Host

若客户端发过来的请求header中有HOST这个字段,$http_host和$host表示的就是原始请求

X-Real-IP

是指客户端的真实IP,如果设置了$remote_addr这个值,后端服务器就能获取到客户端的真实IP

X-Forwarded-For

这个变量的值有$proxy_add_x_forwarded_for,可以真实的显示出客户端原始ip。

我们这里来测试下

环境搭建

在本机搭建一个springboot应用,springboot应用搭建方法参考:从官网开始用IDEA在JDK1.8环境搭建springboot2.7.14项目,然后代码如下

@RestController
public class DemoController {
    @GetMapping("/hello")
    public Map hello(HttpServletRequest request){
        Map result = new TreeMap();
        result.put("hello","Hello World");
        String scheme = request.getScheme();
        String xForwardedFor = request.getHeader("X-Forwarded-For");
        String xRealIp = request.getHeader("X-Real-IP");
        String host = request.getHeader("Host");
        String serverName = request.getServerName();
        int serverPort = request.getServerPort();
        String remoteName = request.getRemoteAddr();
        int remotePort = request.getRemotePort();
        result.put("scheme",scheme);
        result.put("serverName",serverName);
        result.put("serverPort",serverPort);
        result.put("remoteName",remoteName);
        result.put("remotePort",remotePort);
        result.put("xForwardedFor",xForwardedFor);
        result.put("xRealIp",xRealIp);
        result.put("host",host);
        return result;
    }
}

我本机的ip为:192.168.192.1
nginx所在的ip:192.168.192.11

nginx的反向代理的配置为

upstream first { 
   server  192.168.192.1:8080; 
}
server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass         http://first; 
            #proxy_set_header   Host             $host; 
            #proxy_set_header   X-Real-IP        $remote_addr; 
            #proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

这样客户端通过访问nginx暴露的80服务就是反向代理到我本机启动的springboot应用。下面我们来测试proxy_set_header的作用

不配置proxy_set_header的测试

我们上面是把proxy_set_header都注释了,此时在浏览器上访问
http://192.168.192.11/hello
返回了

{"hello":"Hello World","host":"first","remoteName":"192.168.192.11","remotePort":35058,"scheme":"http","serverName":"first","serverPort":80,"xForwardedFor":null,"xRealIp":null}

可以看到完全没有拿到任何客户端的信息.

配置proxy_set_header的测试

server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass         http://first; 
            proxy_set_header   Host             $host; 
            proxy_set_header   X-Real-IP        $remote_addr; 
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

在浏览器上访问
http://192.168.192.11/hello
返回了

{"hello":"Hello World","host":"192.168.192.11","remoteName":"192.168.192.11","remotePort":35060,"scheme":"http","serverName":"192.168.192.11","serverPort":80,"xForwardedFor":"192.168.192.1","xRealIp":"192.168.192.1"}

request.getRemoteAddr():获取的永远都是代理对象的IP
X-Forwarded-For和X-Real-IP:都获取了客户端的真实IP

X-Forwarded-For和X-Real-IP有什么区别呢

我们上面的例子发现,这两个获取的都是客户端的真实IP地址,其实如果只有一个反向代理服务器,那结果都是一样的,但是如果有多个,这里可以就用一个nginx来模拟一下。配置如下

我们首先在nginx配置一个服务,代理到我们的springboot应用.

upstream second { 
   server  192.168.192.1:8080; 
}
server {
        listen       8081;
        server_name  localhost;
        location / {
            proxy_pass         http://second; 
            proxy_set_header   Host             $http_host; 
            proxy_set_header   X-Real-IP        $remote_addr; 
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

这里相当于我们的应用被一个nginx服务器代理了,端口是8081,我们再配置一个80端口代理到8081,就模拟了两台代理服务器的情况

upstream first { 
   server  localhost:8081; 
}
server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass         http://first; 
            proxy_set_header   Host             $host; 
            proxy_set_header   X-Real-IP        $remote_addr; 
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

我们再尝试在本机的浏览器请求:http://192.168.192.11/hello,返回了

{"hello":"Hello World","host":"192.168.192.11","remoteName":"192.168.192.11","remotePort":35086,"scheme":"http","serverName":"192.168.192.11","serverPort":80,"xForwardedFor":"192.168.192.1, 127.0.0.1","xRealIp":"127.0.0.1"}

可以看到X-Real-IP获取的就不是客户端的地址了,而是第一次代理发起的地址,但是我们的X-Forwarded-For却有全部的客户端IP地址,我们想要获取真实客户端,只需要获取X-Forwarded-For第一个即可。

总结:X-Forwarded-For记录服务器的地址,会把记录添加到结尾,X-Real-IP用来记录服务器的地址,它不把记录添加到结尾,而是直接替换。所以用X-Forwarded-For就不会错。

相关推荐

笔记本内存怎么扩大(笔记本电脑内存怎么扩大)

笔记本系统内存怎么的扩大,答笔记本内存可用下列方法扩大:1、打开【我的电脑】。2、在【计算机】位置点右键,选择【属性】。3、进入系统界面,点击【高级系统设置】。4、点击【高级】-【设置】。5、在【性能...

visio2010安装包(visio 2010安装)

在该对话框中的“选择页”列表中,显示了目前绘图文档中所有的绘图页,包括前景页和背景页等。单击选择所需要的任意页,然后即可单击“确定”...Visio2010和2016都有各自的优势。Visio201...

windows11开机密码忘了(windows11开机密码忘了怎么办)

1.使用安装光盘重装系统:如果你有安装Windows11的光盘,可以用它重装系统,这样就可以抹掉原来的密码,重新设置新的开机密码。2.使用系统安全模式:可以尝试使用Windows11的安全模式...

电脑怎么刷bios教程(电脑刷bios有什么好处)

刷主板bios的方法一  升级主板bios需要主板的最新biosS文件以及刷bios的工具,这些都可以在主板厂商的官方网站上获取到。首先,是下载你的最新版的bios,打开下载的winflash软件,备...

win7gho和iso区别(windows7区别)

区别一:来源不一样1、ISO光盘镜像文件可以直接刻录成光盘使用(带启动),也可以说是一个压缩包!2、GHO是GHOST境像文件、是用GHOST备份的克隆文件,是用ghost恢复系统的时候使用的。区别二...

笔记本电脑突然蓝屏怎么解决
笔记本电脑突然蓝屏怎么解决

、可能是磁盘问题所导致的,将电脑关机后重新开机,在开机时不断按F8选择进入安全模式;2、按win+r打开运行窗口;3、输入cmd并确定;4、然后输入chkdsk/f/r并回车;5、最后按y退出页面,重启电脑系统会自动修复硬盘进行恢复即可。...

2025-12-23 07:51 off999

win9系统下载链接(win101909版本怎么下载)
  • win9系统下载链接(win101909版本怎么下载)
  • win9系统下载链接(win101909版本怎么下载)
  • win9系统下载链接(win101909版本怎么下载)
  • win9系统下载链接(win101909版本怎么下载)
序列号官方查询(序列号查询工具)

华为提供了3个查询入口,华为官网、服务APP、华为终端客户服务公众号,您可选择其中一个入口查询设备权益信息。入口一、华为官网:登录华为消费者业务官网-服务支持-保修状态查询-填写序列号-查询-设备权益...

windows8度(windows8度盘符怎么设置)

小度音箱配置网络失败怎么办?1、小度智能音箱连接的路由器名称一定要是英文,不能有中文和符号,这个大家要注意一下。ZNSJW.cow2、路由器网络的选择也有讲究,我们要选用2.4G的网络,5G的是连不上...

系统集成项目管理工程师成绩公布时间

中级系统集成考试成绩一般需要一个月左右的时间才能出来。1、因为中级系统集成考试是比较复杂且专业的考试,需要对考生的各种能力进行综合考察,需要时间进行精细评估和核查。2、同时,中级系统集成考试的参加人数...

苹果序列号查询方法(苹果序列号查询方式)

苹果查序列号入口可登陆苹果官网checkcoverage.apple.com进行查询,具体步骤如下:1、打开手机设置,点击“通用”2、进入页面后点击“关于本机”;3、页面跳转后,我们就可以看到本机的序...

字根表五笔口诀(字根表五笔口诀如何理解)
字根表五笔口诀(字根表五笔口诀如何理解)

1区横起笔、G键:王旁青头兼五一;F键:土士二干十寸雨;D键:大三肆头古石厂;S键:木丁西边要无女;A键:工戈草头右框七。2区竖起笔、H键:目止具头卜虎皮;J键:日曰两竖与虫依;K键:口中两川三个竖;L键:田框四车甲单底;M键:山由贝骨下...

2025-12-23 04:51 off999

如何笔记本重装系统(笔记本重装系统的步骤)

重装系统就可以解决了,系统U盘制作及重装系统的操作步骤为:1.制作启动U盘:到实体店买个4-8G的U盘(可以要求老板帮忙制作成系统U盘即可省略以下步骤),上网搜索下载装机员U盘启动PE制作工具,将U盘...

win7旗舰版显卡驱动(win7电脑显卡驱动)

步骤如下:1、首先我们打开桌面,右键单击此电脑再右键菜单选择属性。2、进入属性界面,点击设备管理器进入。3、进入设备管理器界面,点击显示适配器。4、展开显示适配器,可以看到一般电脑又集成显卡和独立显卡...

进入ie浏览器网页官网(贴吧热门评论)

ie浏览器的网页版登录入口是about:blank,即为“空白页”。空白页也被称为首页,是登录的入口,是用户打开浏览器时默认打开的网页,主要包含个人主页、网站网页、组织或活动主页、公司主页等。没有手...

取消回复欢迎 发表评论: