【问题标题】:Passenger 5 Nginx X-Accel-Redirect乘客 5 Nginx X-Accel-Redirect
【发布时间】:2015-06-10 00:57:40
【问题描述】:

要对乘客使用 Nginx 的 X-Accel-Redirect 功能,显然您使用 passenger_set_header,如果映射到另一个位置,则使用 passenger_set_cgi_param。例如,这里是configuration which apparently used to work for someone else

passenger_set_cgi_param HTTP_X_ACCEL_MAPPING "/home/user/rails_app/shared/files/=/documents/";
passenger_pass_header X-Accel-Redirect;

location ~ ^/documents/(\d\d\d)/(\d\d\d)/(\d\d\d)/(.*)$ {
  alias /home/user/rails_app/shared/files/$1/$2/$3/$4;
  internal;
}

但他们在release notes 中说乘客 5:

[Nginx] passenger_set_cgi_param 选项已被删除并且 替换为passenger_set_headerpassenger_env_var

关于如何将两者一起用于 X-Accel-Redirect 的信息不多。似乎也没有最新的教程或博客显示如何做到这一点。这是怎么做到的?我可以让以下 nginx.conf 为 rails 开发服务器(非乘客)工作,但它不适用于乘客。

upstream api_server {
   server localhost:5000;
   # (starting passenger with ``` RAILS_ENV=development passenger start -a 127.0.0.1 -p 5000 -d ```) not using unix:socket for a good reason
}

server {
    listen              9000;
    server_name         $host;
    return 301          https://$host:9443$request_uri;
    #error_page 497 https://$host:9443$request_uri;
}

server {
    charset UTF-8;

    server_name  localhost 0.0.0.0;

    root /var/www/html/app;

    listen 9443 ssl;
    ssl on;
    ssl_certificate /opt/nginx/conf/ssl/app.chain.pem;
    ssl_certificate_key /opt/nginx/conf/ssl/app.key.pem;

    error_page 497 https://$host:9443$request_uri;

    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Expose-Headers' 'Content-Length, Content-Type, Keep-Alive, Date, Server, Transfer-Encoding, Cache-Control';
    add_header 'Access-Control-Allow-Headers' 'Content-Length, Content-Type, Keep-Alive, Date, Server, Transfer-Encoding, Cache-Control';


    passenger_env_var X-Sendfile-Type "X-Accel-Redirect";
    passenger_env_var X-Accel-Mapping  "/special/place/on/filesystem/=/protected_files/";
    passenger_pass_header X-Accel-Redirect;
    passenger_pass_header X-Sendfile-Type;


    # --------- Serve static applications --------

    location / {
        try_files $uri $uri/ /index.html;
    }


    # --------- API --------

    location /protected_files/{
        # Used for X-Accel-Redirect
        internal;
        add_header Pragma "no-cache";
        alias /special/place/on/filesystem/;
    }

    location ~ /(api|auth|raw)/ {

        # Host + forwarding headers
            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;

                        passenger_pass_header Host;
                        passenger_pass_header X-Real-IP;
                        passenger_pass_header X-Forwarded-For;


        # Configuration for X-Sendfile style fast & authenticated static serving
              proxy_set_header  X-Sendfile-Type   X-Accel-Redirect;
                          # proxy_set_header  X-Accel-Mapping   /mounts/test_data_filesystem/=/protected_files/;
              proxy_set_header  X-Accel-Mapping   /special/place/on/filesystem/=/protected_files/;

              passenger_env_var X-Sendfile-Type "X-Accel-Redirect";
              passenger_env_var X-Accel-Mapping  "/special/place/on/filesystem/=/protected_files/";
              passenger_pass_header X-Accel-Redirect;
              passenger_pass_header X-Sendfile-Type;


        proxy_pass http://api_server;
    }

【问题讨论】:

  • 如果您正在阅读本文,我想仍然没有答案。由于这个问题,我最终使用了 uwsgi 而不是乘客。效果很好!

标签: ruby-on-rails ruby-on-rails-4 nginx passenger


【解决方案1】:

看起来您找到了替代解决方案,但发布此解决方案以防其他人遇到同样的问题并希望从乘客 4 语法升级到乘客 5 以及 X-Accel-Redirect。

以下是对我有用的更改:

乘客 4 版:

passenger_set_cgi_param HTTP_X_ACCEL_MAPPING /path/to/railsapp/public/=/storage/;
passenger_pass_header X-Accel-Redirect;

location /storage {
  root /var/www/shared;
  internal;
}

乘客 5 版:

passenger_set_header X-Sendfile-Type "X-Accel-Redirect";
passenger_env_var HTTP_X_ACCEL_MAPPING /path/to/railsapp/public/=/storage/;
passenger_pass_header X-Accel-Redirect;

location /storage {
  root /var/www/shared;
  internal;
}

此外,/var/www/sharedln -s /path/to/railsapp/public /var/www/shared/storage 中还有一个指向 rails 应用程序的符号链接,但是这可能会根据您的 nginx 配置而有所不同。

希望这会有所帮助!

【讨论】:

  • 非常希望它对某人有所帮助!
  • 这个解决方案的唯一问题(我正在使用 Rails 5)是现在我不能再利用 ETag 标头了。显然,Rails 在将 etag 标头发送回 Nginx 之前正在转发接力棒。有什么想法吗?
  • 我检查过,它似乎仍在为我生成 ETag。您使用的是 nginx >= 1.7.3 吗? Nginx stripped ETags 在此版本之前与 gzip 结合使用时。
猜你喜欢
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2021-12-24
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多