背景: 公司中应用是部署在虚拟机中,原有一个接口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地址的重定向。Nginx的rewrite功能需要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`。
希望这些方法可以帮助您解决问题。