4

我曾用于Sidekiq异步处理电子邮件。它在开发环境中运行良好,但它不会在发布的电子邮件中呈现有效的资产 URL。

预期资产网址:
http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png

得到:
http://myapp.com/images/logo.png

我正在Engineyard用作 VPC。在生产/登台服务器中,我有一个名为的专用实用程序实例redis,其中包含redis serversidekiq正在运行的实例。他们正在正确处理电子邮件,所以我猜他们状况良好。

nginx配置在/data/nginx/servers/my_app.conf
cat /data/nginx/servers/my_app.conf

server {

  listen 81;

  server_name _;


  client_max_body_size 100M;

  root /data/my_app/current/public;

  access_log /var/log/engineyard/nginx/my_app.access.log main;
  error_log /var/log/engineyard/nginx/my_app.error.log notice;

  location ~ ^/(images|assets|javascripts|stylesheets)/ {
    expires 10y;
    try_files  $uri $uri/index.html /last_assets/$uri /last_assets/$uri.html @app_my_app;
  }

  error_page 404 /404.html;
  error_page 500 502 504 /500.html;
  error_page 503 @503;
  recursive_error_pages on;
  location @503 {

    error_page 405 = /system/maintenance.html;

    if (-f $request_filename) {
      break;
    }

    rewrite ^(.*)$ /system/maintenance.html break;
  }

  location @app_my_app {

    passenger_enabled on;

    passenger_set_cgi_param HTTP_X_FORWARDED_FOR   $proxy_add_x_forwarded_for;
    passenger_set_cgi_param HTTP_X_REAL_IP         $remote_addr;
    passenger_set_cgi_param HTTP_HOST              $http_host;
    passenger_set_cgi_param HTTP_X_FORWARDED_PROTO $scheme;
    passenger_set_cgi_param HTTP_X_REQUEST_START   't=$start_time';
    passenger_set_cgi_param HTTP_X_QUEUE_START     't=$start_time';

    passenger_set_cgi_param SERVER_PORT            80;

    rack_env staging;

    passenger_min_instances 2;
  }

  location / {
  if (-f $document_root/system/maintenance.html) { return 503; }
    try_files  $uri $uri/index.html $uri.html @app_my_app;
  }
include /etc/nginx/servers/my_app/custom.conf;
}

我使用了辅助方法来获取组织的徽标 url

  # Gets the logo URL of the Organization set by Controller/Mailer
  #   in instance variable @organization
  # @param [Organization] organization default value is nil
  # @return [String] URL for logo image
  def get_logo_url(organization = nil)
    if organization && organization.logo.present?
      # This case works as AWS S3 is used
      organization.logo_url(:logo)
    else
      # This case not working
      asset_url('logo.png')
    end
  end

最新发现
我尝试在不使用的情况下从主应用程序发送电子邮件sidekiq,它在这种情况下有效。asset_url像, asset_path,之类的资产助手image_path无法从清单文件中获取摘要文件名。

4

4 回答 4

1

我面临着同样的问题。问题是我没有在 sidekiq 服务器上编译资产,所以那里没有清单。

Capistrano 的变化来自: task :compile_assets, roles: :app, primary: true do

至: task :compile_assets, roles: [:app, :processor], primary: true do

在我个人的情况下修复了它。

于 2015-10-26T11:46:49.210 回答
0

注意:作为临时修复/仍在寻求最佳解决方案

由于sidekiq一直面临着为存储为assets/images/logo.png.

预期资产网址:

http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png

得到:
http://myapp.com/images/logo.png

所以我实际上将电子邮件中可能需要的静态资产文件移动到了public/images目录。现在代替Rails应用程序,Nginx为资产提供服务。现在它的工作

我的最新发现(怀疑):我怀疑我的 Chef 食谱无法在/环境中启动sidekiq 的sidekiq相应实例。Railsproductionstaging

于 2015-08-27T17:22:06.680 回答
0

我是Engine Yard 的团队负责人。如果您可以开票,我们可以代表您进行更多调查。

谢谢,

拉尔夫

于 2015-08-27T18:05:21.670 回答
0

如果有人使用 capistrano 3,那么他需要包含 sidekiq 角色(或部署 sidekiq 的服务器角色)....否则 capistrano 仅为 web 角色编译资产

server 'testanywebsite.com', user: 'deploy-user', roles: %w(sidekiq)
set :assets_roles, [:web, :sidekiq]
于 2020-01-30T14:41:41.910 回答