Ruby 在 Rails 上:邮件程序:Sidekiq - 电子邮件中的资产路径无效:Engineyard:Nginx:乘客
Ruby On Rails : Mailer : Sidekiq - asset path not valid in email : Engineyard : Nginx : Passenger
我已经使用 Sidekiq
异步处理电子邮件。它在开发环境中运行良好,但它不会在已发布的电子邮件中呈现有效资产 URL。
预期资产URL:
http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png
得到:
http://myapp.com/images/logo.png
我正在使用 Engineyard
作为 VPC。在 production/staging 服务器中,我有一个名为 redis
的专用实用程序实例,它包含 redis server
和 sidekiq
个实例 运行。他们正在正确处理电子邮件,所以我猜他们状况良好。
/data/nginx/servers/my_app.conf
中的nginx配置
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
等资产助手无法从清单文件中获取已消化的文件名。
Note: As a temp fix / Best solution still seeking
因为 sidekiq
一直面临服务存储为 assets/images/logo.png
的静态资产的问题。
预期资产URL:
http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png
得到:
http://myapp.com/images/logo.png
所以我实际上将电子邮件中可能需要的静态资产文件移动到 public/images
目录。现在 Rails
应用程序,而不是 Nginx
提供资产。
现在可以使用了
My latest finding (doubt) : I doubt that my Chef cookbooks are unable to start the sidekiq
and corresponding Rails
instance for sidekiq in production
/ staging
environment.
我是 Engine Yard 的团队负责人。如果您可以开票,我们可以代表您进行更多调查。
谢谢,
拉尔夫
我遇到了同样的问题。问题是我没有在 sidekiq 服务器上编译资产,所以那里没有清单。
Capistrano 的变化来自:
task :compile_assets, roles: :app, primary: true do
致:
task :compile_assets, roles: [:app, :processor], primary: true do
在我的个人案例中修复了它。
如果有人正在使用 capistrano 3,那么他需要包含 sidekiq 角色(或部署你的 sidekiq 的服务器的角色)....否则 capistrano 仅为 web 角色编译资产
server 'testanywebsite.com', user: 'deploy-user', roles: %w(sidekiq)
set :assets_roles, [:web, :sidekiq]
我已经使用 Sidekiq
异步处理电子邮件。它在开发环境中运行良好,但它不会在已发布的电子邮件中呈现有效资产 URL。
预期资产URL:
http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png
得到:
http://myapp.com/images/logo.png
我正在使用 Engineyard
作为 VPC。在 production/staging 服务器中,我有一个名为 redis
的专用实用程序实例,它包含 redis server
和 sidekiq
个实例 运行。他们正在正确处理电子邮件,所以我猜他们状况良好。
/data/nginx/servers/my_app.conf
中的nginx配置
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
等资产助手无法从清单文件中获取已消化的文件名。
Note: As a temp fix / Best solution still seeking
因为 sidekiq
一直面临服务存储为 assets/images/logo.png
的静态资产的问题。
预期资产URL:
http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png
得到:
http://myapp.com/images/logo.png
所以我实际上将电子邮件中可能需要的静态资产文件移动到 public/images
目录。现在 Rails
应用程序,而不是 Nginx
提供资产。
现在可以使用了
My latest finding (doubt) : I doubt that my Chef cookbooks are unable to start the
sidekiq
and correspondingRails
instance for sidekiq inproduction
/staging
environment.
我是 Engine Yard 的团队负责人。如果您可以开票,我们可以代表您进行更多调查。
谢谢,
拉尔夫
我遇到了同样的问题。问题是我没有在 sidekiq 服务器上编译资产,所以那里没有清单。
Capistrano 的变化来自:
task :compile_assets, roles: :app, primary: true do
致:
task :compile_assets, roles: [:app, :processor], primary: true do
在我的个人案例中修复了它。
如果有人正在使用 capistrano 3,那么他需要包含 sidekiq 角色(或部署你的 sidekiq 的服务器的角色)....否则 capistrano 仅为 web 角色编译资产
server 'testanywebsite.com', user: 'deploy-user', roles: %w(sidekiq)
set :assets_roles, [:web, :sidekiq]