微服务: 配置Nginx反向代理

简介

本来是一件很小的事情,但我觉得还是很有必要跟大家分享一下,勿以善小而不为。

事情是这样的…

有个小伙伴告诉我说自己想学习一下 SpringBoot 结合 Nginx,毕竟用了 Tomcat 那么久(启动 SpringBoot 项目会自动启动 Tomcat)也是时候玩玩 Nginx 了。这个想法很赞,去探索和了解自己没有学过的东西本来就是一种进步。

他说按照网上教程配置了一下 Nginx,但是通过配置的方式访问 Nginx 死活都不能访问到 SpringBoot Web 项目提供的接口中去。

今天我们一起来看看这个问题,我也把实践的内容分享给大家,希望能帮助到有需要的人。

关于微服务相关的文章,有兴趣的可以参阅 微服务项目系列 这篇文章。

大写的 404

经过一番的沟通,他给我大致描述了一下经过,我就开始了复现之路。

这个小伙伴是想通过 Nginx 的反向代理能力访问所有 SpringBoot Web 项目的接口,关于什么是反向代理、正向代理,可以参考我之前名为 反向代理 的一篇文章。

我所用依旧是 SpringBoot 项目源代码 中的代码,代码托管在 Github 上面了,有需要的朋友可以 clone 下来。

报错如下图所示:

我在本机(Windows 10系统)安装的 Nginx 版本是 1.15.12,上图可以看出访问对应的 url 出现了 404 错误,关于 404 这个错误码,百度百科是这样解释的:

404,是一种HTTP状态码,指网页或文件未找到。

HTTP 404或Not Found错误信息是HTTP的其中一种“标准回应信息”(HTTP状态码),此信息代表客户端在浏览网页时,服务器无法正常提供信息,或是服务器无法回应且不知原因。

直白来讲,就是找不到资源。首先我们来看一下我是如何配置 Nginx 反向代理的。

配置文件 nginx.conf (在Nginx安装目录conf目录下),内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 自定义虚拟主机1
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
# 自定义虚拟主机2:配置转发给ms-user服务(springboot)
server {
listen 80;
server_name user.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}
}

从配置可以看到,配置了两个虚拟主机,问题就出现在这里。

让 404 消失

我们再来看一下刚才报 404 的访问地址 http://localhost/signin/name?username=fooboy&userpwd=123,其中 http://localhost 本质是 http://localhost:80,再结合看一下 Nginx 的配置文件,其实是访问到了 自定义虚拟主机1 上面了。

有两个比较简单的解决方案,下面的两种方案无需修改 SpringBoot 项目的任何配置,你只需要启动你的 SpringBoot 项目即可。

方案一:配置主机 host

修改系统主机 C:\Windows\System32\drivers\etc 目录下面的 HOSTS 文件,记得要用管理员身份打开才有权限去写。

在 HOSTS 文件中,增加如下配置:

1
127.0.0.1 user.com

在浏览器访问 http://user.com/signin/name?username=fooboy&userpwd=123 就可以成功了(注意访问的域名是 user.com),如下图所示(该API需要输入登录账号和密码):

方案二:修改虚拟主机的端口

这个需要修改 Nginx 的配置文件,将 自定义虚拟主机2 中的端口改为非 80 端口号,修改如下:

1
2
3
4
5
6
7
8
9
10
11
# 自定义虚拟主机2:配置转发给ms-user服务(springboot)
server {
listen 8085;
server_name user.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}

修改完成后,保存文件。

需要重新加载 Nginx 的配置,可以在终端输入如下命令:

1
nginx.exe -s reload

重新加载成功后,在浏览器访问 http://localhost:8085/signin/name?username=fooboy&userpwd=123 就可以成功了(注意访问的端口改为了 8085),如下图所示:

至此问题解决。


只要你愿意,一切都来得及~

坚持原创技术分享!