标签: reverse-proxy

设置反向代理来缓存图像

我编写了一个快速的 Python 服务器来提供重新采样的图像。例如,一个 URL 可能看起来像http://images.domain.com/resample/100x100/9f362e1994264321.jpg. 由于重采样图像很昂贵,因此需要一个缓存层。似乎 nginx 反向代理将是一个不错的选择,这里这里似乎是开始的好地方。

然而,有一个问题。有数百万个图像,因此通过将其存储http://images.domain.com/resample/100x100/9f362e1994264321.jpg在文件系统中/home/nginx/cache/resample/100x100/9f362e1994264321.jpg(或类似的东西),最终cache/resample/100x100/会在其中包含数百万个文件,这将使文件查找效率非常低。

我在存储原始图像的同时通过将它们分布在许多子目录中来处理这个问题,例如9f/36/9f362e1994264321.jpg. 但是,我不确定如何使用 nginx 做同样的事情。我可以更改 URL 来做同样的事情,如果这是唯一的解决方案,我会这样做,但我宁愿保持 URL 尽可能漂亮。

我可以用 nginx 做到这一点吗?如果没有 nginx,我可以做其他事情吗,比如清漆?

nginx cache reverse-proxy

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

nginx 配置因 SSL 密钥/pem 失败(特殊情况)

我正在尝试使用经过认证的 ssl 密钥在我的 nginx 反向代理上安装 SSL,但是当我尝试重新启动服务器时收到此消息:

Restarting nginx: [emerg]: SSL_CTX_use_PrivateKey_file("/etc/nginx/conf.d/cert.key") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)
configuration file /etc/nginx/nginx.conf test failed
Run Code Online (Sandbox Code Playgroud)

每个文件都是 root:root 有 600 个权限我已经测试了证书并且它们通过这个网站进行了验证:http ://ssltools.com/cert_key_match

我的键中没有尾随奇怪的字符,每行有 64 个字符

这是我的配置文件

server {
    listen   443;
    server_name     my.domain.com;
    ssl on;
    ssl_certificate      conf.d/cert.pem;
    ssl_certificate_key  conf.d/cert.key;

    location / {
         proxy_pass         http://upstream1;
         proxy_redirect     off;
         proxy_buffering    off;
         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)

}

有任何想法吗?谢谢

ssl configuration nginx web-server reverse-proxy

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

Nginx 反向代理到另一个提供静态文件的 nginx 服务器

我有一个 Nginx 服务器托管一个 Web 应用程序,它在直接访问时工作正常。它的配置如下

server {
    listen 8000 default_server;

    listen [::]:8000 default_server ipv6only=on;

    root /data/www/ ;
    server_name server1.com;

    location / {
            try_files $uri $uri/ =404;
        }

    location /app/ {

    }    
}
Run Code Online (Sandbox Code Playgroud)

现在我必须从另一个 Nginx 服务器为这个应用程序提供服务 所以我设置了如下所示的反向代理

server {
        listen 80 default_server;

        listen [::]:80 default_server ipv6only=on;

        root /data/www/ ;
        server_name server2.com;

        location / {
                try_files $uri $uri/ =404;
            }

        location /app/ {
                proxy_pass http://server1.com:8000/app/;
        }    
Run Code Online (Sandbox Code Playgroud)

当我从 server2 访问应用程序时,我收到如下错误,例如当我访问http://server2.com/app/css/app.css 时 (抱歉没有代表发布链接)

[错误] 6601#0: *1 open() "/data/www/app/css/app.css" failed (2: No such file …

nginx reverse-proxy

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

使用 nginx 重写规则出现“重定向过多”错误

我正在尝试重写针对我的站点的域 url,以便将所有域名重写为 www.example.com 并具有以下配置:

我的网站块

  server {      
        listen       80 default_server;
        listen   [::]:80 default_server ipv6only=on;

            server_name _;
            rewrite ^ $scheme://www.example.com$request_uri permanent;

    location / {

            # Allow for large file uploads
              client_max_body_size 0;

                proxy_http_version 1.1;
                proxy_pass http://mysite;
                proxy_buffering    off;

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

tomcat 服务器块

server {
        listen        80;

        root /opt/site2/www;
        index index.html index.htm;

        # Redirecto root requests to Share
        rewrite ^/$ /share;

        location / {
            # First attempt to serve request …
Run Code Online (Sandbox Code Playgroud)

rewrite nginx reverse-proxy redirect 301-redirect

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

根据客户端证书设置标头

我有 Apache 作为内部服务器的反向代理运行。访问代理的用户需要使用客户端证书。在内部服务器上,有一个 Web 应用程序可以使用 HTTP 标头对用户进行身份验证。我想让代理根据客户端证书提供该标头。

标头值是用户的 id。理想情况下,我会有一个将用户 ID 映射到证书的文本文件。据我所知,我只需要RewriteMap标题。

# Somehow lookup USERID given SSL_CLIENT_S_DN
RequestHeader set X-User-ID %{USERID}
Run Code Online (Sandbox Code Playgroud)

我想避免一大堆SetEnvIf需要重新启动服务器才能更改的s,例如:

SetEnvIf SSL_CLIENT_S_DN [User 1's SSL_CLIENT_S_DN] USERID=12
SetEnvIf SSL_CLIENT_S_DN [User 2's SSL_CLIENT_S_DN] USERID=34
SetEnvIf SSL_CLIENT_S_DN [User 3's SSL_CLIENT_S_DN] USERID=56
...
Run Code Online (Sandbox Code Playgroud)

有什么好方法可以避免用户基本上需要进行两次身份验证?

authentication reverse-proxy apache-2.2

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

Nginx proxy_pass 和绝对路径

我正在尝试使用 Nginx 在服务器(Ubuntu 14.04)上运行一些 nodejs 应用程序,我快完成了。这是我的服务器配置 ( /etc/nginx/sites-available/default):

server {
    listen 80;
    server_name my_domain.com;

    location /test1 {
        proxy_pass http://127.0.0.1:5000/;
        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;
    }

    location /test2 {
        proxy_pass http://127.0.0.1:5001/;
        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)

我有几个应用程序运行,它们都工作得很好,我可以与他们存取权限http://my_domain.com/test1http://my_domain.com/test2等等......

问题是,在其中一个应用程序中,我有几个绝对路径:
例如<a href="/">Home</a>
或(在快递内)
res.redirect('/');

此重定向不会转到,http://my_domain.com/test1但会转到http://my_domain.com/
有没有办法通过 nginx 配置告诉应用程序根位置实际上是http://my_domain.com/test1

我对 nginx 和一般的虚拟主机真的很陌生,我正在努力学习......任何帮助将不胜感激。
编辑:
结果curl …

nginx reverse-proxy paths node.js

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

反向代理 SNI 不匹配的 Apache 远程代理

我们设置的 Apache-2.2 和通过另一台设备代理的反向代理存在问题。

流程是:Apache A -> proxy.abc.net -> Apache B

我们在 Apache B 上得到的错误是

通过 SNI 提供的主机名 proxy.abc.net 和通过 HTTP 提供的主机名 backend.abc.net 不同

当前配置

    <VirtualHost frontend.abc.com:80>

    ServerName frontend.abc.com

    SSLEngine on
    SSLOptions +StrictRequire
    SSLProtocol -all +TLSv1
    SSLHonorCipherOrder On
    SSLCipherSuite RC4-SHA:HIGH:!ADH:!MD5
    SSLCertificateFile conf/certs/cert.cer
    SSLProxyCACertificateFile certs/proxy.cer
    SSLCertificateKeyFile conf/certs/cert.pem
    SSLCertificateChainFile conf/certs/chain.cer


    DocumentRoot /foo/bar

    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost off
    ProxyErrorOverride On
    SetEnv proxy-sendchunked 1

    ProxyRemote "*"  https://proxy.abc.net:8080
    ProxyPass  /foo  https://backend.abc.net:8888/foo  disablereuse=on

</Virtual Host>
Run Code Online (Sandbox Code Playgroud)

添加

SSLProxyProtocol SSLv3
Run Code Online (Sandbox Code Playgroud)

有效,因为它不进行 SNI 检查,但 SSLv3 不是我们必须使用 TLSv1 或更高版本的选项。

reverse-proxy mod-proxy proxypass sni apache-2.2

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

代理背后的 Restful API 的 Nginx 配置

我正在尝试将我的节点代理从端口移动808080墙壁并撞墙。我希望我的 RESTful API 位于监听端口 80 的 nginx 反向代理之后/api/path

8080某些企业用户在过度热情的防火墙后面无法访问端口。)

我曾经将请求指向https://domain.tld:8080/http://localhost:1337。没有问题通过:

server {
    listen      8080;
    server_name  domain.tld;

    ssl on; #some other SSL config removed for clarity

    location / {
        proxy_redirect          off;
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass              http://127.0.0.1:1337;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我试图通过以下方式将它移动到位置api/path/并远离端口8080

server {
    listen       443 ssl http2; …
Run Code Online (Sandbox Code Playgroud)

nginx reverse-proxy

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

使用重写设置 nginx 反向代理以应用于站点中的所有链接

我有以下 Nginx 配置:

server {
    listen 80;

    location /test {
        rewrite /test(.*) /$1 break;
        proxy_pass "http://www.example.com/";
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于主页,当输入“ http://localhost/test ”时,我得到了http://www.example.com/的内容,而 URL 仍然是“ http://localhost/test ”。

很酷,但是当我点击网站中的链接时,说/more_examples我希望将链接重写为: http://localhost/test/more_examples。在实践中,我得到以下信息:http://localhost/more_examples,这显然不起作用。这甚至可能吗?

任何帮助将不胜感激。

rewrite nginx reverse-proxy

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

单台服务器,nginx作为反向代理,多个域/网站

我在 https 上为我的网站提供了这个 nginx 配置,其中 nginx 用作反向代理服务器:

  server {
      listen 80 default_server;
      listen [::]:80 default_server;
      server_name my_domain123.com www.my_domain123.com;
      return 301 https://$server_name$request_uri;
  }

  server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name localhost www.my_domain123.com;
    return 301 https://my_domain123.com$request_uri;
  }

  server {
      listen 443 ssl default_server;
      listen [::]:443 ssl default_server;
      server_name my_domain123.com;

    location / {
      proxy_redirect      http://localhost:4000 https://my_domain123.com;
      # ...........................

    }
Run Code Online (Sandbox Code Playgroud)

我应该如何调整它以便我可以在同一台服务器上托管具有不同域名的多个网站?我应该在配置中的哪个位置插入新网站的新配置?

或者我也应该为它再创建一个可用/启用的站点?然而,问题仍然存在:我将如何正确组合 2 个或更多配置——同一服务器、多个域——?

nginx domain proxy reverse-proxy

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