在OpsWorks原生支持Asset Pipeline之前,您可以执行以下操作。
在您的Rails应用程序中创建一个文件deploy/before_symlink.rb
,内容如下:
run "cd #{release_path} && RAILS_ENV=production bundle exec rake assets:precompile"
如果您将Rails应用程序部署到不同的环境中,请更改RAILS_ENV。
如果您使用NGINX / Unicorn堆栈,则必须修改/assets资源。
只需将以下内容复制到名为unicorn/templates/default/nginx_unicorn_web_app.erb的文件中即可在您的cookbooks中使用。
upstream unicorn_<%= @application[:domains].first %> {
server unix:<%= @application[:deploy_to]%>/shared/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name <%= @application[:domains].join(" ") %> <%= node[:hostname] %>;
access_log <%= node[:nginx][:log_dir] %>/<%= @application[:domains].first %>.access.log;
keepalive_timeout 5;
root <%= @application[:absolute_document_root] %>;
<% if @application[:nginx] && @application[:nginx][:client_max_body_size] %>
client_max_body_size <%= @application[:nginx][:client_max_body_size] %>;
<% end %>
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
# If you don't find the filename in the static files
# Then request it from the unicorn server
if (!-f $request_filename) {
proxy_pass http://unicorn_<%= @application[:domains].first %>;
break;
}
}
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root <%= @application[:absolute_document_root] %>;
}
}
<% if @application[:ssl_support] %>
server {
listen 443;
server_name <%= @application[:domains].join(" ") %> <%= node[:hostname] %>;
access_log <%= node[:nginx][:log_dir] %>/<%= @application[:domains].first %>-ssl.access.log;
ssl on;
ssl_certificate /etc/nginx/ssl/<%= @application[:domains].first %>.crt;
ssl_certificate_key /etc/nginx/ssl/<%= @application[:domains].first %>.key;
<% if @application[:ssl_certificate_ca] -%>
ssl_client_certificate /etc/nginx/ssl/<%= @application[:domains].first %>.ca;
<% end -%>
keepalive_timeout 5;
root <%= @application[:absolute_document_root] %>;
<% if @application[:nginx] && @application[:nginx][:client_max_body_size] %>
client_max_body_size <%= @application[:nginx][:client_max_body_size] %>;
<% end %>
location / {
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
# If you don't find the filename in the static files
# Then request it from the unicorn server
if (!-f $request_filename) {
proxy_pass http:
break;
}
}
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root <%= @application[:absolute_document_root] %>;
}
}
<% end %>
如果您使用的是Apache2/Passenger堆栈,则必须修改/assets资源。只需将以下内容复制到名为passenger_apache2/templates/default/web_app.conf.erb的文件中即可。
<VirtualHost *:80>
ServerName <%= @params[:server_name] %>
<% if @params[:server_aliases] && !@params[:server_aliases].empty? -%>
ServerAlias <% @params[:server_aliases].each do |a| %><%= "#{a}" %> <% end %>
<% end -%>
<% if @params[:mounted_at] -%>
DocumentRoot /var/www
<%= @params[:deploy][:passenger_handler] -%>BaseURI <%= @params[:mounted_at] %>
<% else -%>
DocumentRoot <%= @params[:docroot] %>
<%= @params[:deploy][:passenger_handler] -%>BaseURI /
<% end -%>
<%= @params[:deploy][:passenger_handler] -%>Env <%= @params[:rails_env] %>
<Directory <%= @params[:docroot] %>>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory ~ "\.svn">
Order allow,deny
Deny from all
</Directory>
<Directory ~ "\.git">
Order allow,deny
Deny from all
</Directory>
<LocationMatch "^/assets/.*$">
Header unset ETag
FileETag None
# RFC says only cache for 1 year
ExpiresActive On
ExpiresDefault "access plus 1 year"
</LocationMatch>
LogLevel info
ErrorLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-error.log
CustomLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-access.log combined
CustomLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-ganglia.log ganglia
FileETag none
RewriteEngine On
Include <%= @params[:rewrite_config] %>*
RewriteLog <%= node[:apache][:log_dir] %>/<%= @application_name %>-rewrite.log
RewriteLogLevel 0
# Canonical host
#RewriteCond %{HTTP_HOST} !^<%= @params[:server_name] %> [NC]
#RewriteCond %{HTTP_HOST} !^$
#RewriteRule ^/(.*)$ http://<%= @params[:server_name] %>/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !\.(css|gif|jpg|jpeg|png)$
RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ /system/maintenance.html [L]
Include <%= @params[:local_config] %>*
</VirtualHost>
<% if node[:deploy][@application_name][:ssl_support] -%>
<VirtualHost *:443>
ServerName <%= @params[:server_name] %>
<% if @params[:server_aliases] && !@params[:server_aliases].empty? -%>
ServerAlias <% @params[:server_aliases].each do |a| %><%= "#{a}" %> <% end %>
<% end -%>
SSLEngine on
SSLProxyEngine on
SSLCertificateFile <%= node[:apache][:dir] %>/ssl/<%= @params[:server_name] %>.crt
SSLCertificateKeyFile <%= node[:apache][:dir] %>/ssl/<%= @params[:server_name] %>.key
<% if @params[:ssl_certificate_ca] -%>
SSLCACertificateFile <%= node[:apache][:dir] %>/ssl/<%= @params[:server_name] %>.ca
<% end -%>
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
<% if @params[:mounted_at] -%>
DocumentRoot /var/www
<%= @params[:deploy][:passenger_handler] -%>BaseURI <%= @params[:mounted_at] %>
<% else -%>
DocumentRoot <%= @params[:docroot] %>
<%= @params[:deploy][:passenger_handler] -%>BaseURI /
<% end -%>
<%= @params[:deploy][:passenger_handler] -%>Env <%= @params[:rails_env] %>
<Directory <%= @params[:docroot] %>>
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
<Directory ~ "\.svn">
Order allow,deny
Deny from all
</Directory>
<Directory ~ "\.git">
Order allow,deny
Deny from all
</Directory>
<LocationMatch "^/assets/.*$">
Header unset ETag
FileETag None
# RFC says only cache for 1 year
ExpiresActive On
ExpiresDefault "access plus 1 year"
</LocationMatch>
LogLevel info
ErrorLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-ssl-error.log
CustomLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-ssl-access.log combined
CustomLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-ssl-ganglia.log ganglia
FileETag none
RewriteEngine On
Include <%= @params[:rewrite_config] %>-ssl*
RewriteLog <%= node[:apache][:log_dir] %>/<%= @application_name %>-ssl-rewrite.log
RewriteLogLevel 0
# Canonical host
#RewriteCond %{HTTP_HOST} !^<%= @params[:server_name] %> [NC]
#RewriteCond %{HTTP_HOST} !^$
#RewriteRule ^/(.*)$ http://<%= @params[:server_name] %>/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !\.(css|gif|jpg|jpeg|png)$
RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ /system/maintenance.html [L]
Include <%= @params[:local_config] %>-ssl*
</VirtualHost>
<% end -%>
如果您有问题,请随时提问。
最好的祝福,
丹尼尔
编辑:
或者您可以快速复制这些菜谱 https://github.com/neonlex/massive-octo-computing-machine ,我开发了它们。
但是OpsWorks将来应该会默认支持此功能。