标签: reverse-proxy

如何使用 nginx 和 proxy_pass 为每个子域创建子域

我目前在我的服务器上设置了 nginx my.server.com。使用当前配置,我使用http://my.server.com/app1或访问不同的应用程序http://my.server.com/app2

我有一个这样的apps.conf位置:/etc/nginx/sites-enabled/

upstream app1_servers {
    server 172.12.11.10:8080;
}
upstream app2_servers{
    server 172.12.11.10:9090;
}
server {
    listen 80;
    server_name my.server.com;
    return 301 https://my.server.com/$request_uri; #force https
}

server {
    listen 443;
    ssl on;
    ssl_certificate /etc/ssl/my.server.com/cert.pem;
    ssl_certificate_key /etc/ssl/my.server.com/priv.pem;
    server_name my.server.com;

    location /app1 {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-Proto https;
            proxy_pass http://app1_servers/app1;
            proxy_redirect http://$host https://$host;
          proxy_set_header Host $host;
    }
    location /app2 {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $host; …
Run Code Online (Sandbox Code Playgroud)

nginx reverse-proxy subdomain

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

NGINX 双反向代理

我的反向代理遇到一些奇怪的问题。

我的设置如下所示: 设置

localhost:3000现在,我的内部网络内的主机可以访问服务器上运行的应用程序srv1.my.domain.org,因此我知道配置正在运行。但是,一旦我尝试从网络外部(通过gateway.my.domain.org)访问该应用程序,我就会看到 NGINX 测试页面。我不明白为什么,因为我已经为多个其他应用程序完成了这个配置,并且它们正在工作。

注意:server_name与物理服务器的主机名相同。

以下是配置:

gateway.my.domain.org

小路:/etc/nginx/conf.d/app.my.domain.org.conf

upstream srv {
     server srv1.my.domain.org;
}

server {
     listen 443;
     server_name gateway.my.domain.org;

     ssl on;
     ssl_certificate /.../fullchain.pem;
     ssl_certificate_key  /.../privkey.pem;
     ssl_session_cache  builtin:1000  shared:SSL:10m;
     ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
     ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
     ssl_prefer_server_ciphers on;

     access_log            /var/log/nginx/gateway.access.log;
     error_log            /var/log/nginx/gateway.error.log;

     client_max_body_size 150M;

     location / {
         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        X-Forwarded-Proto $scheme;
         proxy_pass              http://srv;
         proxy_read_timeout      90;
     }
}
Run Code Online (Sandbox Code Playgroud)

srv1.my.domain.org

小路:/etc/nginx/sites-enabled/app

server {
    listen …
Run Code Online (Sandbox Code Playgroud)

nginx reverse-proxy

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

负载均衡器如何绕过 64k 端口限制?

当请求到来时,它会被重新路由到该请求的多个可用服务器之一。但只有 64k 端口可用,因此在任何给定时间最多只能有 64k 传出请求。那么一些网站如何服务数百万并发请求呢?如果有人能够消除这种混乱,那就太棒了。谢谢!

port reverse-proxy load-balancing haproxy azure

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

nginx 作为具有多个域和主机的反向代理

这个问题可能已经被问过好几次了,但是考虑到我能找到的所有结果和我所知甚少,我有点迷失了。我使用的是 Fedora 29。

我尝试用 nginx 做什么:

  • 使用一个让我们加密多个域名的 ssl 证书
  • 将每个域映射到特定的内部主机(配置文件中的 DNS 或 IP,我不介意,无论什么都可以)
  • 所有主机都已在内部使用 ssl(没有可用的 http - 多个侦听端口)
  • 如果您从外部使用 http,我希望重定向到 https

样本 :

我怎样才能做到这一点?让我们加密自动配置我的 nginx 配置,但这似乎有点太多了。


非常感谢您的回答,我觉得我得到了一些进步,即使暂时没有工作。我在这里发布了我的完整配置文件,因为我现在遇到了“502 Bad Gateway”错误。IP 与反向代理不在同一子网中,但完全可访问,没有防火墙或路由问题。

知道我可以在哪里继续前进吗?在原始配置中,还有一个包含密码和协议的 certbot conf 文件。也许我需要重新包含它?

另外:我尝试访问的内部服务器具有使用我自己的 AD CS 签名的证书,但反向代理上尚未安装根证书。也许我应该 ?

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log …
Run Code Online (Sandbox Code Playgroud)

ssl nginx fedora reverse-proxy lets-encrypt

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

基于 Docker 的反向代理和 NginX 用于多个域

我正在尝试创建一个基于 docker 的多容器设置,其中包含多个域的反向代理以提供服务,其中网站、数据库和基于 nginx 的反向代理在容器中运行,但我不知道我在做什么丢失(我是 nginx 新手)。

\n\n

细节:

\n\n
    \n
  • 基于 NginX 的 docker 容器用于反向代理
  • \n
  • 我拥有 2 个域\n\n
      \n
    • 例如:my_example_domain_1.com,my_example_domain_2.net
    • \n
  • \n
  • 我想在每个域名后面放置一个容器来服务这两个域\n\n
      \n
    • 我想运行两个独立的网站:例如:两个 WordPress 网站
    • \n
  • \n
  • 我需要两个域和相应容器之间的 NginX 路由
  • \n
\n\n

我的例子: (basedir multi-container:)

\n\n

nginx_revproxy/default.conf:

\n\n
server {\n    listen       80;\n    server_name  localhost;\n\n    location / {\n        root   /usr/share/nginx/html;\n        index  index.html index.htm;\n    }\n\n    error_page   500 502 503 504  /50x.html;\n    location = /50x.html {\n        root   /usr/share/nginx/html;\n    }\n}\n\nserver {\n    listen       80;\n    server_name  my_example_domain_1.com;\n    location …
Run Code Online (Sandbox Code Playgroud)

nginx routing reverse-proxy docker docker-compose

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

Apache2 mod_substitute 无法在 <Location> 中工作

我有一个正在工作的反向代理,它仅在我的站点中的特定位置上处于活动状态,在本例中例如:www.example.com/reverseproxy/site1我正在反向代理 site1。我想替换每个代理页面正文的某些部分,所以我尝试使用 mod_substitute,问题是我无法让它在<Location /reverseproxy>

这是我的 httpd(启用了 SSL):

<VirtualHost _default_:443> 

    ProxyPassInterpolateEnv On
    RewriteEngine On

    ... Some rewrite rules
    RewriteRule /?reverseproxy/http(s*):/([^\/]*)/*(.*) "http$1://$2/$3" [P]
    SSLProxyEngine On
    ProxyPassReverse "/reverseproxy/http${ssl}://${page}" http${ssl}://${page} interpolate

    SetOutputFilter INFLATE;proxy-html;SUBSTITUTE;DEFLATE;
    ProxyHTMLInterp On
    ProxyHTMLExtended Off

    ...Some ProxyURLMap
    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s|<body>|<body1>|"
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这个替代品确实有效,但它适用于所有页面,而不仅仅是/reverseproxy. 当我尝试将其放入时,<Location /reverseproxy>它不起作用,它只是忽略它:

<Location /reverseproxy>
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|<body>|<body1>|"
</Location>
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

我尝试添加

 RequestHeader unset Accept-Encoding
Run Code Online (Sandbox Code Playgroud)

在标签之外<Location>但它不起作用

我尝试添加这个

SetOutputFilter SUBSTITUTE;DEFLATE
Run Code Online (Sandbox Code Playgroud)

<Location /reverseproxy>标签中但没有运气

正如有人建议尝试使用这个过滤器链

FilterDeclare filter
FilterProvider filter SUBSTITUTE …
Run Code Online (Sandbox Code Playgroud)

mod-rewrite reverse-proxy mod-proxy apache-2.4 apache2

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

Apache 中的间歇性代理错误:“部分结果有效,但处理不完整”,并显示“AH01110:读取响应时出错”

我在 CentOS 7.8 上使用 Apache 2.4.43 以及 Varnish 6 和 PHP-FPM 来为 Magento 2 网站提供服务。

Varnish 侦听端口 80。Apache 侦听 8080 以向 Varnish 提供内容,并且还侦听端口 443,该端口将 HTTPS 请求代理到 Varnish,如下所示:

ProxyPreserveHost On
ProxyPass         / http://127.0.0.1:80/
RequestHeader     set X-Forwarded-Port  "443"
RequestHeader     set X-Forwarded-Proto "https"
Run Code Online (Sandbox Code Playgroud)

这适用于大多数请求,但偶尔(约 10% 的请求)我会收到来自 Varnish 和 Apache 的 503 响应。我在 Apache 日志中看到的唯一错误是:

[proxy_http:error] [pid 6719:tid 140054596265728] (70008)Partial results are valid but processing is incomplete: [client x.x.x.x:53760] AH01110: error reading response, referer: http://example.com
Run Code Online (Sandbox Code Playgroud)

如果我重试该请求,它通常会立即起作用,尽管有时我必须刷新几次才能满足请求。我注意到,当发出大批量请求时(即包含数百个外部资源的页面),这种情况会更频繁地发生。我还注意到,这种情况似乎发生在较大的文件上,而不是较小的文件上。

我猜测这可能是某种超时,但我不确定要调整哪些值或如何进一步调试它。

我尝试过的事情包括以下内容:

  • 这个答案涉及更改我不使用的模块(Forge Rock OpenAm)。 …

proxy varnish reverse-proxy mod-proxy apache-2.4

5
推荐指数
0
解决办法
6458
查看次数

如何使用 Caddy 通过反向代理维护所有标头

我使用 Caddy 作为反向代理,这样我只需要在网关中打开 2 个端口(一个用于 http,一个用于 https)。

我更喜欢使用80443,但我的 UniFi USG(网关)会干扰 443 并破坏 SSL。如果我选择另一个端口并为其添加端口转发,它工作正常......但这对于我需要的每个服务器路由来说都是不合理的,因为我的防火墙将变成瑞士奶酪。

因此,反向代理非常适合此目的。我只会打开 2 个端口:88这些444端口将连接到反向代理。在 Caddy 中,我可以轻松地在 Caddyfile 中设置目标端口:

// DNS points to the gateway's IP
mysubdomain.mydomain.com {
    reverse_proxy {
      to https://192.168.1.IP:443
      transport http {
          read_buffer 4096
      }
    {
}
Run Code Online (Sandbox Code Playgroud)

问题

在我的第一次尝试中,我的 SSL 不起作用(感谢代理修改的标头),因此我查看了Caddy 反向代理标头文档,发现它们确实修改了 2 个标头:

  • 它添加或扩充了X-Forwarded-For标头字段。
  • 它设置X-Forwarded-Proto标头字段。

我应该使用什么值,以便 Caddy 传递原始值,或者不添加任何内容?

当前配置

这是我目前拥有的,我应该使用什么来确保 X-Forwarded 标头不被更改或添加?

mysubdomain.mydomain.com {
    reverse_proxy {
      to https://192.168.1.IP:443
      transport http { …
Run Code Online (Sandbox Code Playgroud)

reverse-proxy caddy

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

Nginx 反向代理 + URL 重写 + websockets

我看到了这个问题,但它似乎对我不起作用。

目前(工作)情况是:

server {
    listen 443 ssl;

    server_name updates.example.com;
    ssl_certificate     fullchain.pem;
    ssl_certificate_key privkey.pem;

    location /update {
        proxy_pass              "http://localhost:5000";

        proxy_connect_timeout   60;
        proxy_read_timeout      60;
        proxy_send_timeout      60;
        proxy_intercept_errors  off;
        proxy_http_version      1.1;
        proxy_set_header        Host               $http_host;
        proxy_set_header        X-Real-IP          $remote_addr;
        proxy_set_header        X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto  $scheme;
        proxy_set_header        X-Client-Subject   $ssl_client_s_dn;
        proxy_set_header        X-Client-Cert      $ssl_client_cert;
    }

    location / {
        proxy_pass              "http://localhost:5001";

        proxy_connect_timeout   60;
        proxy_read_timeout      60;
        proxy_send_timeout      60;
        proxy_intercept_errors  off;
        proxy_http_version      1.1;
        proxy_set_header        Host               $http_host;
        proxy_set_header        X-Real-IP          $remote_addr;
        proxy_set_header        X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto  $scheme;
        proxy_set_header        Upgrade            $http_upgrade;
        proxy_set_header …
Run Code Online (Sandbox Code Playgroud)

nginx reverse-proxy websocket

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

当位于 Nginx 反向代理后面时,来自 Nginx 的意外 301 重定向

类似的问题之前在这里这里被问过,但没有一个匹配或解决我遇到的问题。经过几个小时的拼命解决问题后,我找到了一个出乎意料但简单的解决方案,我想以问答的方式分享它。

背景

一家公司有两台服务器:反向代理(Ubuntu 20.04 + Nginx 1.17)和上游应用程序服务器(也是 Ubuntu 20.04 + Nginx 1.17)。反向代理处理各种子域,例如通过使用proxy_passhttp://demo.example.com指令将它们映射到上游服务器的目录。http://12.12.12.12:8000/demo/

然后,客户端发出 HTTP 请求,其中路径指向目录,但没有尾部斜杠,例如http://demo.example.com/items。默认的 Nginx 行为是进行 301 重定向到相同的 URL,并添加尾部斜杠,例如位置文档http://demo.example.com/items/中所述。

如果 301 重定向发生在上游应用程序服务器,则正常行为是重定向位置路径变为http://12.12.12.12:8000/demo/items/. 这不是问题,因为默认情况下,反向代理将12.12.12.12:8000/demo/用原始主机替换部分内容,因此客户端会收到正确的 301 重定向到demo.example.com/items/. 这正是我所期望发生的事情。

问题

但是,通过以下配置,客户端收到的重定向位置将变为http://demo.example.com:8000/demo/items/。反向代理似乎只部分重写了重定向 URL。

反向代理的站点配置:

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

  index index.html index.htm;

  server_name demo.example.com;

  location / {
    proxy_pass http://12.12.12.12:8000/demo/;
    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 X-Forwarded-Proto $scheme;
  } …
Run Code Online (Sandbox Code Playgroud)

nginx reverse-proxy redirect proxypass

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