标签: nginx-reverse-proxy

Nginx 不区分大小写的 proxy_pass

我有一个名为 的站点http://example.com,其中运行着一个可以在http://example.com/app1. app1 位于 nginx 反向代理后面,如下所示:

location /app1/ {
    proxy_pass http://localhost:8080/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}
Run Code Online (Sandbox Code Playgroud)

将尾部斜杠添加到该proxy_pass字段可以让我“删除” URL 的 /app1/ 部分,至少就应用程序而言。所以 app1 认为它正在获取对根 url 的请求(例如,我在 app1 中有一个路由位于'/',而不是'/app1')。

但是,我想让 nginx 不区分大小写。所以无论我去http://example.com/App1还是http://example.com/APP1,它仍然应该将请求转发到app1,删除url的/app1/部分。

当我尝试使用 nginx 不区分大小写的规则时,它不允许将 URI 的其余部分转发到 app1。

location ~* /app1/ {
    proxy_pass http://localhost:8080/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade; …
Run Code Online (Sandbox Code Playgroud)

nginx nginx-location nginx-reverse-proxy

6
推荐指数
1
解决办法
5312
查看次数

如何在cloudflare下配置nginx以支持signalr3?

我正在努力使用signalr3和nginx反向代理配置,我的nginx cfg看起来像这样:

server {
listen       80;
server_name  my.customdomain.com;

location / {
  root /pages/my.customdomain.com;
  index index.html index.htm;
  try_files $uri $uri/ /index.html =404;
}

## send request back to kestrel ##
location /proxy/ {
 proxy_pass  http://xxxxxxxxxx.westeurope.cloudapp.azure.com/;

 proxy_set_header        Host            $host;
 proxy_set_header        X-Real-IP       $remote_addr;
 proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
 }
}
Run Code Online (Sandbox Code Playgroud)

我在这里想念什么?

当我浏览我的页面时,我收到了OK

GET /proxy/notifications/negotiate 
Run Code Online (Sandbox Code Playgroud)

GET /proxy/notifications?id=uFQtMDg1dXib6LGvUssQhQ
Run Code Online (Sandbox Code Playgroud)

但是404用于POST

POST proxy/notifications?id=uFQtMDg1dXib6LGvUssQhQ
Run Code Online (Sandbox Code Playgroud)

请停下来!

PS.我的中心很简单......

[AllowAnonymous]
public class NotificationHub : Hub
{

}
Run Code Online (Sandbox Code Playgroud)

asp.net nginx signalr nginx-reverse-proxy

6
推荐指数
1
解决办法
141
查看次数

WebSocket握手期间出错:意外的响应代码:301

我已经研究了RoR 5.0.0 ActionCable wss WebSocket握手的答案:意外的响应代码:301,但不适用于我的情况。

我使用nginx代理作为在docker-containers中运行的多个Web服务器的前端。我使用来自https://github.com/jwilder/nginx-proxy的nginx-config-template

现在在我的docker-container中,我有另一个具有以下配置的nginx:

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

upstream websocket {
    server my-websocket-docker-container:8080;
}

server {
    root /src/html;


    location /websocket/ {
        resolver 127.0.0.11 ipv6=off;
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
    }

    ...

}
Run Code Online (Sandbox Code Playgroud)

当尝试连接到wss://example.com/websocket时,出现关于意外响应代码301的上述错误。当我手动卷曲websocket-url时,我可以看到nginx响应告诉我“ 301永久移动”。但为什么?这是哪里来的?

有人可以帮忙吗?谢谢!

nginx websocket nginx-reverse-proxy

6
推荐指数
1
解决办法
4597
查看次数

如果上游启动,则 Nginx 绕过缓存,如果关闭则使用缓存

如果上游启动(max-age 1)绕过缓存并在关闭时使用缓存(proxy_cache_use_stale),我创建了以下配置:

proxy_cache_path   /app/cache/ui levels=1:2 keys_zone=ui:10m max_size=1g inactive=30d;
server {
    ...
    location /app/ui/config.json {
        proxy_cache ui;
        proxy_cache_valid 1d;
        proxy_ignore_headers Expires;           
        proxy_hide_header Expires;
        proxy_hide_header Cache-Control;
        add_header Cache-Control "max-age=1, public";
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        add_header X-Cache-Status $upstream_cache_status;
        add_header X-Cache-Date $upstream_http_date;
        proxy_pass http://app/config.json;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当上游关闭并且客户端仅获得 504 Gateway Timeout 时不使用缓存。我已经阅读了以下文章:

https://nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy_cache_use_stale

如何配置 NginX 仅在后端关闭时才提供缓存内容(5xx 响应代码)?

https://serverfault.com/questions/752838/nginx-use-proxy-cache-if​​-backend-is-down

它不像我期望的那样工作。任何帮助表示赞赏。

caching nginx nginx-location nginx-reverse-proxy nginx-config

6
推荐指数
1
解决办法
2355
查看次数

NGINX 反向代理重定向而不是代理

我有一个 NGINX 服务器作为反向代理运行。代理适用于 Windows 主机,但是我有一个 owncloud 服务器,代理会将 url 重新写入内部主机名或 IP 地址。ex(我输入 cloud.example.com 并且我的网址栏将更改为 10.1.1.19,这是无法通过 wan 解析的

我检查了 DNS 记录并确保 NGINX 可以解析主机名。还尝试将 http 流量转发到云服务器以确保使用域名不是问题。

server {
  listen 80;
  listen [::]:80;

  server_name example.com;

  location / {
      proxy_pass http://10.1.1.16:80/;
  }
}

server {
  listen 80;
  listen [::]:80;

  server_name cloud.example.com;

  location / {
      proxy_pass http://10.1.1.19:80/;
  }
}

server {
  listen 80;
  listen [::]:80;

  server_name remote.example.com;

  location / {
      proxy_pass http://10.1.1.17:80/;
  }
}
Run Code Online (Sandbox Code Playgroud)

我只需要 NGINX 作为“cloud.example.com”的代理运行而不是重写 URL

nginx-reverse-proxy

6
推荐指数
1
解决办法
1665
查看次数

使用 Kubernetes NGINX 入口控制器后面的相对 URL 托管 web 应用程序

我在 NGINX入口控制器后面的 Kubernetes 1.13 集群中托管一个 Web 应用程序。的Ingress指定path: /my-webapp/?(.*)annotations: { nginx.ingress.kubernetes.io/rewrite-target: /$1 }使得所述web应用可以从在集群外部够到http://my-cluster/my-webapp。(入口控制器公开为my-cluster.)

剩下的一个问题是,webapp 包含引用例如 CGI 脚本和 CSS 样式表的“相对”URL。例如,<link rel="stylesheet" type="text/css" href="/my-stylesheet.css" />当前未加载样式表。我认为这是因为浏览器在错误的 URL 上请求它(http://my-cluster/my-webapp/my-stylesheet.css应该是正确的)并且需要更多的注释。

这种情况下正确的配置是什么?

UPDATE检查器显示浏览器当前从 URL 请求样式表http://my-cluster/my-stylesheet.css,这确实是错误的,需要修复。

更新 看起来像是一个与 NGINX 反向代理相关的问题,而不是 Kubernetes NGINX 入口控制器。我想知道建议的食谱是否以及如何在这种特殊情况下也适用。首先,我尝试切换到引用样式表的相对 URL(根据已接受答案中的配方 One),但这到目前为止还没有奏效: ,尽管它显示,但<link rel="stylesheet" type="text/css" href="my-stylesheet.css" />浏览器显然仍在尝试从 获取样式表在 URL 栏中,检查器报告的 URL 与.http://my-cluster/my-stylesheet.csshttp://my-cluster/my-webappbaseURI

nginx-reverse-proxy kubernetes-ingress

6
推荐指数
1
解决办法
2266
查看次数

nginx反向代理未检测到已删除的负载均衡器

我们的反向代理具有以下配置:

location ~ ^/stuff/([^/]*)/stuff(.*)$ {
    set $sometoken $1;
    set $some_detokener "foo";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Authorization "Basic $do_token_decoding";
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_redirect https://place/ https://place_with_token/$1/;
    proxy_redirect http://place/ http://place_with_token/$1/;
    resolver 10.0.0.2 valid=10s;
    set $backend https://real_storage$2;
    proxy_pass $backend;
}
Run Code Online (Sandbox Code Playgroud)

现在,所有这些工作都可以进行,直到real_storage旋转服务器为止。例如,say real_storage来自foo.com。这是一个负载均衡器,可直接连接到两个服务器:1.1.1.1和1.1.1.2。现在,将1.1.1.1删除并替换为1.1.1.3。但是,nginx继续尝试1.1.1.1,导致:

epoll_wait()报告客户端过早关闭了连接,因此在连接到上游时,上游连接也关闭了,客户端:...,服务器:...,请求:“ GET ... HTTP / 1.1”,上游:“ https: // 1.1.1.1:443 / ...“,主持人:” ...“

请注意,上游是旧服务器,如先前的日志所示:

[调试] 1888#1888:* 570837连接到1.1.1.1:443,FD:60#570841

这是在我们这边还是为我们的主机配置错误的东西real_storage

*我能发现的最接近我的问题的地方是https://mailman.nginx.org/pipermail/nginx/2013-March/038119.html ...

更多详情

我们添加了 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 …

nginx nginx-reverse-proxy

6
推荐指数
1
解决办法
171
查看次数

如何设置 nginx 反向代理到多个容器,每个容器都有自己的 nginx 服务器

请在标记为重复之前阅读完整的问题,因为它不是重复的问题。我有一个 VPS,我想在其上部署多个 Web 应用程序(我已经阅读了相关帖子,当我们直接拥有子容器时,它们是完美的)。我的问题是不同的。我想管理每个具有自己的 nginx 的 Web 应用程序以路由到它的子域以及一些与它们相关的静态网站。我有两个码头工人。我的网络如下所示。图片。

容器网络

我的 NGINX 反向代理应该负责将域路由到相应的 nginx 容器。我不确定是否可能(这就是我寻求帮助的原因)。如果有人可以提供更好的理解,我愿意接受建议。以下是我对 nginx 代理容器和其他 Web 应用程序 docker yaml 文件代码的配置。我用过NGINX 代理

NGINX 代理 Docker 撰写文件

version: "3.7"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

networks:
  default:
    external:
      name: nginx-proxy
Run Code Online (Sandbox Code Playgroud)

网络应用 1 docker-compose.yml

version: "3.7"
networks:
  default:
    external:
      name: nginx-proxy
  yoda-network:
    driver: bridge
services:
    adminer:
        container_name: ${APP_NAME}_adminer
        image: adminer
        depends_on:
            - mysql
        expose:
            - 8080
        environment:
            VIRTUAL_HOST: yodaledger.com
            VIRTUAL_PORT: 8080
        networks:
            - yoda-network …
Run Code Online (Sandbox Code Playgroud)

nginx docker jwilder-nginx-proxy nginx-reverse-proxy nginx-config

6
推荐指数
0
解决办法
1255
查看次数

如何将包含点的任何路径与nginx匹配?

我正在尝试使用Nginx配置实现代理

这个想法是让一个http服务器托管我的网站(我的SPA)。并使我的http服务器上的一条路由指向另一个api。

这是我下面的nginw配置文件

client_max_body_size 100M;

server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    index  index.html index.htm;

    location ^~ /proxyapi/ {
        proxy_read_timeout 180s;
        proxy_send_timeout 180s;
        proxy_pass http://localhost:5000/;
    }

    location ~* /static/* {
      try_files $uri =404;
      expires 1y;
      access_log off;
      add_header Cache-Control "public";
    }

    # Any route that doesn't have a file extension (e.g. /devices)
    location / {
        try_files $uri $uri/ /index.html;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = …
Run Code Online (Sandbox Code Playgroud)

nginx nginx-reverse-proxy nginx-config

5
推荐指数
1
解决办法
154
查看次数

如何在 nginx 中以有条件的方式将 proxy_protocol 设置为“on”?

有人熟悉 nginx 吗?我试图在流块中以有条件的方式启用 proxy_protocol,即对于某些端点,我希望添加代理协议标头。对于其他人我不想添加它。查看文档,proxy_protocol 无法获取变量(尝试了 map 指令) 关于如何实现此目的有什么建议吗?在这里添加了我的 nginx 配置。 http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_protocol

这是有问题的部分proxy_protocol $proxy_state;

   map $ssl_preread_server_name $proxy_state{
        default on;
        facebook.com off;
    }
    server {
        listen 8443 ;
        resolver 8.8.8.8 ipv6=off;        
        proxy_pass $server;
        proxy_protocol $proxy_state;
        ssl_preread on;

    }
Run Code Online (Sandbox Code Playgroud)

以下是完整的配置

error_log logs/error.log;

events {
}


stream {

    map $ssl_preread_server_name $server { 
        # default 127.0.0.1:8080;
        default unix:/var/run/nginx.sock;
        include /home/user/allow_url_list;

    } 
    map $ssl_preread_server_name $proxy_state{
        default on;
        facebook.com off;
    }
    server {
        listen 8443 ;
        resolver 8.8.8.8 ipv6=off;        
        proxy_pass $server;
        proxy_protocol $proxy_state;
        ssl_preread on;
        
    } …
Run Code Online (Sandbox Code Playgroud)

nginx nginx-location nginx-reverse-proxy nginx-config

5
推荐指数
1
解决办法
1591
查看次数