另一个nginx反向代理问题

时间:2015-06-05 05:01:29

标签: ssl nginx reverse-proxy

我正在整理一个nginx反向代理。这是一个有效的nginx conf文件片段:

upstream my_upstream_server {
  server 10.20.30.40:12345;
}

server {
  server_name ssl-enabled.example.com;

  listen 443 ssl;
  ssl_certificate     /etc/ssl/server.crt;
  ssl_certificate_key /etc/ssl/server.key;
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;


  location / {
      proxy_pass         http://my_upstream_server/;
      proxy_redirect     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;
      proxy_set_header   X-Forwarded-Host $server_name;
  }

这使我们可以在不更改任何配置文件的情况下处理来自my_upstream_server的请求,并且在讨价还价中通过ssl提供服务。到目前为止一切都很好。

我真正想要做的是配置这个,以便我们可以将用户定向到https://ssl-enabled.example.com/,而不是转到https://ssl-enabled.example.com/upstream/。 (我想这样做,这样我们就可以运行多个虚拟主机,每个虚拟主机代理一个我们想要ssl启用的不同服务。)我尝试将位置线从location /更改为{{1} };当我这样做时,应用程序的索引页面(https://ssl-enabled.example.com/upstream/)呈现正常,但它下面的页面会生成404错误。这是一个例子:

location /upstream/

Nginx尝试提供/some/link.html而不是/upstream/some/link.html,这不起作用。

我尝试创建一个将请求发送到/ upstream $ 1的重写,但对于主页面(nginx现在认为是https://.../upstream/),它进入无限循环,尝试服务/上游/上游/ upstream / ...,当然也失败了。

我怀疑我错过了既重要又简单的东西,但到目前为止,我还没弄清楚它可能是什么。文档可能提供线索,但如果确实如此,我没有看到它。任何来自nginx专家的帮助都会非常感激。感谢。

2 个答案:

答案 0 :(得分:1)

下面的配置应该像您提到的那样进行类似的重定向而不进入循环:

upstream my_upstream_server {
    server 10.20.30.40:12345;
}

server {
    server_name ssl-enabled.example.com;

    listen 443 ssl;
    ssl_certificate      /etc/ssl/server.crt;
    ssl_certificate_key /etc/ssl/server.key;
    ssl_protocols            TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers              HIGH:!aNULL:!MD5;

    location /upstream {
        proxy_pass          http://my_upstream_server/;
        proxy_redirect      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;
        proxy_set_header    X-Forwarded-Host $server_name;
    }

    location / {
        return 301 https://ssl-enabled.example.com/upstream$request_uri;
    }
} 

基本上是两个位置块。

一个用于以"上游"开头的请求,一个是服务的,另一个是没有被重定向的请求。

答案 1 :(得分:0)

Alexey对于/更容易使用是正确的,并且在他发表评论的时候,我开始认识到,因为我可以为example.com创建DNS条目,而不是试图将人们引导到{{3}为https://server.example.com/upstream/

创建DNS条目会容易得多

这就是我所做的,看起来代码完全正是我想要的。感谢Alexey和Dayo的回复。