记录在使用nginx中遇到的问题。
文章目录
- 1,网关路由匹配不生效
- 2,网关路由配置前后顺序导致的问题(非nginx问题)
- 3,nginx.conf upstream配置缺少端口
- 4,配置结尾少分号
- 5, proxy_pass 后跟的服务器 URL 是否以 / 结尾
- 5.1 `proxy_pass` 后跟URL的结尾
- 无斜杠结尾的URL
- 有斜杠结尾的URL
- 应用场景
- 5.2 设置Nginx代理的HTTP版本
- 配置HTTP 1.1
1,网关路由匹配不生效
在网关中配置工具域名来进行路由转发,测试发现并未生效,原因是nginx转发请求会丢失域名信息,需要在nginx的server块配置文件gulimall.conf中配置中重设请求头域名信息,配置如下。
location / {
proxy_set_header Host $host;
proxy_pass http://gulimall;
}
2,网关路由配置前后顺序导致的问题(非nginx问题)
如果将下列配置放在路由配置的最前面,将会出现一些问题。
路由规则gulimall-index-route
使用Host
谓词匹配所有以.gulimall.com
结尾的请求。
如果这个规则gulimall-index-route
放在最前面,可能出现的问题包括:
-
匹配优先级问题:
- 路由规则是从上到下匹配的,一旦匹配成功,就不会再考虑下面的规则。如果
gulimall-index-route
放在最前面,所有.gulimall.com
的请求都会被这个规则捕获,即使这些请求的路径可能更适合下面的某个Path
谓词规则。
- 路由规则是从上到下匹配的,一旦匹配成功,就不会再考虑下面的规则。如果
-
路径路由失效:
- 由于
gulimall-index-route
会捕获所有.gulimall.com
的请求,其他基于特定API路径(如/api/search/**
、/api/coupon/**
等)的路由规则将不会生效,因为请求在到达这些规则之前已经被gulimall-index-route
匹配并路由了。
- 由于
-
服务发现问题:
- 如果
gulimall-product
服务不能处理所有可能的API请求(例如,它不包含搜索、优惠券、库存等API的实现),那么将所有请求都路由到这个服务将导致错误或不期望的响应。
- 如果
3,nginx.conf upstream配置缺少端口
重启nginx和网关后,仍然不能正常访问页面,查看nginx日志,发现转发到80端口,而网关是在88端口,说明配置nginx.conf
中upstream
配置缺少端口。
如下图修改之后,即能正常访问。
4,配置结尾少分号
nginx不能正常工作,查看日志,有如下错误信息。
nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/gulimall.conf:10
这说明在nginx的配置中,某一行的配置可能缺失了分号,nginx配置规范要求每一行配置要以分号结尾。
5, proxy_pass 后跟的服务器 URL 是否以 / 结尾
在使用Nginx作为反向代理服务器时,配置的每一个细节都可能影响到代理的效率和行为。
5.1 proxy_pass
后跟URL的结尾
在配置Nginx的proxy_pass
指令时,URL的结尾是否包含斜杠/
是一个重要的考量点。这将直接影响到被代理服务器接收到的请求路径。
无斜杠结尾的URL
如果代理路径没有以斜杠结尾,例如设置为/hello
,当Nginx接收到URL请求https://nginx_server_name/hello/world
时,被代理的服务器将会收到完整的请求路径/hello/world
。
有斜杠结尾的URL
相对地,如果代理路径以斜杠结尾,如/hello/
,被代理服务器收到的请求路径将会是/world
。这是因为Nginx会将代理路径后面的部分(/hello/
)从原始请求URL中剥离。
应用场景
选择哪种方式取决于应用场景。如果希望在同一个域名下通过不同的路径来分配不同的应用程序,推荐使用以斜杠结尾的代理路径。这样,每个应用程序可以独立地处理进入的请求,而无需处理前缀。
5.2 设置Nginx代理的HTTP版本
Nginx的代理模块默认使用HTTP 1.0版本。然而,在某些情况下,你需要将代理的HTTP版本设置为1.1,以支持更现代的HTTP特性,如持久连接。
配置HTTP 1.1
要设置Nginx代理使用HTTP 1.1,你可以在配置文件中添加以下指令:
proxy_http_version 1.1;
proxy_set_header Connection "";
这两条指令指示Nginx在代理请求时使用HTTP 1.1协议,并且通过清除Connection
头部来确保与上游服务器的连接可以被适当地管理。