【问题标题】:nginx - can't figure out location rewritesnginx - 无法确定位置重写
【发布时间】:2012-10-13 05:55:23
【问题描述】:

我正在尝试将不同的 URI 请求重定向到不同的 EC2 容器,多年来我一直使用 nginx 作为 apache 的包罗万象的反向代理,但现在我想在 nginx 级别进行一些重写。

这是我想要完成的:

server {
    listen       80;
    server_name  _;

    gzip              on;
    gzip_static       on;
    gzip_buffers      16 8k;
    gzip_comp_level   9;
    gzip_http_version 1.0;
    gzip_min_length   0;
    gzip_types        text/plain text/css application/x-javascript;
    gzip_vary         on;

    location / { 
        # catch the following URI's including homepage: /contact.html, /terms.html, /
        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_read_timeout 240;
        proxy_connect_timeout 240;
        proxy_send_timeout 240;

        send_timeout 240;
        proxy_pass http://servers_static;
    }

    location / { 
        # catch everything not matched above
        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_read_timeout 240;
        proxy_connect_timeout 240;
        proxy_send_timeout 240;

        send_timeout 240;
        proxy_pass http://servers_dynamic;
    }
}

我确定这只是一个简单的正则表达式问题,但我从来没有理解过那些东西。有人可以帮帮我吗?

【问题讨论】:

    标签: regex nginx


    【解决方案1】:

    使用通用代理设置创建文件 /etc/nginx/EC2:

    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_read_timeout 240;
    proxy_connect_timeout 240;
    proxy_send_timeout 240;
    send_timeout 240;
    

    然后你的主要配置变成:

    server {
      listen       80;
      server_name  _;
    
      #gzip settings cut for brevity, add them back in     
    
      # static content
      location = / {include /etc/nginx/EC2; proxy_pass http://servers_static;}
      location = /contact.html {include /etc/nginx/EC2; proxy_pass http://servers_static;}
      location = /terms.html {include /etc/nginx/EC2; proxy_pass http://servers_static;}
    
      # dynamic content
      location / { include /etc/nginx/EC2; proxy_pass http://servers_dynamic; }
    }
    

    您也可以像这样组合 .html 静态内容页面的位置:

      location ~ (contact|terms).html {
        include /etc/nginx/EC2; proxy_pass http://servers_static;}
    

    拥有精确匹配的位置可能会稍微高效一些,只要您不需要很多重复的结果,就不应该使配置变得笨拙

    【讨论】:

    • 我在下面发布的答案实际上产生了一些其他问题,另一方面,您的解决方案彻底解决了我的问题!谢谢
    【解决方案2】:

    看看try_files。它会依次尝试你给它的路径。在此示例中,将返回 /var/www/sites/foo/current/public/$uri 的任何静态文件,如果不存在静态文件,则仅将请求路由到应用程序。

    upstream app {
      server unix:/tmp/.sock_my_app;
    }
    
    server {
      # path for static files
      root /var/www/sites/foo/current/public;
    
      # Prefer to serve static files directly from nginx to avoid unnecessary
      # requests to the application server.
      try_files $uri/index.html $uri.html $uri @app;
    
      location @app {
        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;
    
        # timeouts
    
        # reverse proxy to an upstream
        proxy_pass http://app;
      }
    }
    

    【讨论】:

    • 这是个好主意,但不幸的是,nginx 服务器在它的 ec2 实例上,静态/动态内容在不同的实例上,因此它无法查询本地文件系统。
    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 2014-12-06
    • 2018-12-02
    • 2016-02-14
    • 2012-04-16
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多