背景: 公司中应用是部署在虚拟机中,原有一个接口getparam接口,是由nginx 跳转到对应的虚拟机去处理,现在应用升级了, 不在直接到虚拟机去处理, 而是经过网管工程去进行分发处理:

即 : 原 nginx ---> xxx-service   变成 nginx --->api-gateway-->xxx-service

上下文由   /xxx/getparams/key ----> api-gateway/xxx/getparams/key

先附上解决方案:

rewrite ^(.*)  api-gateway$1 break; 
proxy_pass http://uc_login_state_new; 

原nginx配置:

location ~  /xxx/getparam/* { (注:涉及机密,故公司上下文用xxx表示)
            proxy_set_header Host $host; #当为$host变量时,它的值在请求包含Host请求头时为Host 
                 字段的值,在请求未携带Host请求头时为虚拟主机的主域名;
			proxy_set_header HTTP_CLIENT_IP $remote_addr; # 在web服务器端获得用户的真实ip 需 
                      配置条件①    【 $remote_addr值 = 用户ip 】
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在web服务器端获得 
                   用户的真实ip 需配置条件②
			proxy_pass http://uc_login_state; 
upstream uc_login_state{
		  server 127.0.0.1:8080  weight=1  max_fails=3 fail_timeout=30s;
		  server 127.0.0.2:8080  weight=1  max_fails=3 fail_timeout=30s;
		  check interval=5000 rise=2 fall=3 timeout=3000 type=http;

为了做到重新url ,而且不重定位,故使用rewrite 和    proxy_pass 结合的方式。如下修改:

location ~  /xxx/getparam/* { (注:涉及机密,故公司上下文用xxx表示)
            proxy_set_header Host $host; #当为$host变量时,它的值在请求包含Host请求头时为Host字段的值,在请求未携带Host请求头时为虚拟主机的主域名;
			proxy_set_header HTTP_CLIENT_IP $remote_addr; # 在web服务器端获得用户的真实ip 需配置条件①    【 $remote_addr值 = 用户ip 】
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在web服务器端获得用户的真实ip 需配置条件②
			rewrite ^(.*)  api-gateway$1 break; // ^代表以什么开头 (.*)表示任何; $1 表示符合要求的第一个字符串,这里就是值原url rewrite ^(.*)  api-gateway$1: 含义就是 在原来的url前面加上 api-gateway  ; break: 匹配之后就不进行匹配 
			proxy_pass http://uc_login_state_new; 
		 upstream uc_login_state_new{
		   server user.app.cb.cc  weight=1  max_fails=3 fail_timeout=30s;
		   check interval=5000 rise=2 fall=3 timeout=3000 type=http;

按理说此时应该大功告成了,但是使用  nginx  -s reload 重启nginx  ,进行测试的时候就会报如下的错误: 

 提示: host 不存在, 为此我百思不得其解

为此研究了下 发现是 :

 proxy_set_header Host $host; 

这个家伙搞的鬼 : 

nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header
指令就是该模块需要读取的配置文件。
在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。
Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真是的服务器设置
有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx
不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】

为此需要改为反向代理的新的域名:

proxy_set_header Host user.app.cb.cc; 

至此完工。 

                                                                                                                              2021.11.24 20:49 

nginx 修改URL,不重定位 ;rewrite ^(.*) api-gateway$1 break; proxy_pass http://uc_login_state_new;
背景:在日常运维中经常会碰到需要从一个链接跳转到另一个链接的情况,此类需求分为两种情况,一种是浏览器url变,一种是浏览器url不变。 一、Url变,使用nginx rewirte模块 rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。 flag标记分为下面4仲: last #本条规则匹配完成后,继续向下匹配新的l...
三台主机:nginx主机,hostname: master.lansgg.com  IP: 192.168.10.128             apache主机,hostname: client1.lansgg.com IP:  192.168.10.129 一、nginx 地址重定向 二、nginx 反向代理 1、地址重定向:是指当使用者浏览某个网址时,将他导向到另一个网址的技术。常用在把一串很长的网址,转成较短的网址。因为当要传播某网站时,常常因为网址太长,不好记忆;又有可能因为换了网路的免费网页空间,网址又必须要变更,不知情的使用者还以为 通过k8s访问http://192.168.1.2:32156/devops/index.html需跳转到http://192.168.1.2:32156/jenkins/ location = /devops/index.html { rewrite ^ $scheme://$http_host/jenkins/ permanent; location = /jenkins/ { root /usr/share/nginx/html; index /jen 子配置文件: include conf.d/*.conf fastcgi, uwsgi,scgi 等协议相关的配置文件 mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网 邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定 某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自 nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案。 一、location作用 location作用:根据用户请求的URL来执行 如果location 后面没有 location配置中: 当用户请求“/”时,将匹配configuration A 当用户请求“/index
Nginx URL重写rewrite)配置及信息详解 URL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中 Nginx URL重写rewrite)介绍 和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向Nginxrewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持 rewrite是实现URL重写的关键指令,根据
这个错误提示表明您尝试在终端中使用 `sudo` 命令运行 `nginx`,但系统无法找到 `nginx` 命令。这通常是因为 `nginx` 没有被正确安装或者没有被添加到系统环境变量中。 您可以尝试以下方法来解决这个问题: 1. 检查 `nginx` 是否已正确安装并添加到系统环境变量中。您可以在终端中运行 `nginx -v` 来检查是否安装成功。如果没有安装,请根据您的操作系统和版本安装 `nginx`。 2. 如果 `nginx` 已经安装但没有被添加到系统环境变量中,您可以手动设置环境变量来解决这个问题。您可以在终端中运行以下命令: export PATH=$PATH:/path/to/nginx 其中 `/path/to/nginx` 是 `nginx` 安装目录的路径。 3. 如果您已经正确安装并添加了 `nginx`,但仍然无法使用 `sudo nginx` 命令,您可以尝试使用绝对路径来运行 `nginx`。例如,如果 `nginx` 安装在 `/usr/local/nginx` 目录下,您可以使用以下命令来启动 `nginx`: sudo /usr/local/nginx/sbin/nginx 这将使用 `sudo` 命令来以管理员权限启动 `nginx`。 希望这些方法可以帮助您解决问题。