Reputation: 13378
Using Rails 4.3. I have the following line in production.rb
:
# Enable serving of images, stylesheets, and JavaScripts from an asset server. config.action_controller.asset_host = "https://assets.example.com"
And the following in example.conf
nginx:
upstream example {
server unix:/home/deployer/example/shared/tmp/sockets/puma.sock fail_timeout=0;
}
server {
listen 80;
server_name example.com;
client_max_body_size 4G;
keepalive_timeout 10;
error_page 500 502 503 504 /500;
root /home/deployer/example/current/public;
try_files $uri/index.html $uri.html $uri @example;
location @example {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://example;
}
location = /50x.html {
root html;
}
location = /404.html {
root html;
}
location @503 {
error_page 405 = /system/maintenance.html;
if (-f $document_root/system/maintenance.html) {
rewrite ^(.*)$ /system/maintenance.html break;
}
rewrite ^(.*)$ /503.html break;
}
if ($request_method !~ ^(GET|HEAD|PUT|PATCH|POST|DELETE|OPTIONS)$ ){
return 405;
}
if (-f $document_root/system/maintenance.html) {
return 503;
}
}
I notice that my subdomain http://assets.example.com is the mirror of my main domain https://example.com, instead of just serving the assets. For example, https://assets.example.com/blog/1 is the same for https://www.example.com/blog/1.
How do I prevent that? I just want https://assets.example.com to serve static assets.
Upvotes: 1
Views: 247
Reputation: 15944
I think that you should split your nginx server
section into two sections, one for the web, the other one for the static assets site.
The server section for the web should remain essentially the same as in your original post, it should perhaps just react on the full hostname:
server_name www.example.com;
The static site server section should be an amended copy of the main site section, with the following principal differences:
server_name
should contain assets.example.com
proxy_pass
directive, static assets are meant to be served statically, i.e. directly by nginx, without having to go through Railsroot
will be the same as in the main siteroot
, relatively, so if there is /assets/
in your URLs (which there probably is), then the assets should be found and served directly from your public/assets
physical directory.Update: sample nginx configuration:
upstream example {
server unix:/home/deployer/example/shared/tmp/sockets/puma.sock fail_timeout=0;
}
# main site config
server {
listen 80;
server_name www.example.com;
client_max_body_size 4G;
keepalive_timeout 10;
error_page 500 502 503 504 /500;
root /home/deployer/example/current/public;
try_files $uri/index.html $uri.html $uri @example;
location @example {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://example;
}
location = /50x.html {
root html;
}
location = /404.html {
root html;
}
location @503 {
error_page 405 = /system/maintenance.html;
if (-f $document_root/system/maintenance.html) {
rewrite ^(.*)$ /system/maintenance.html break;
}
rewrite ^(.*)$ /503.html break;
}
if ($request_method !~ ^(GET|HEAD|PUT|PATCH|POST|DELETE|OPTIONS)$ ){
return 405;
}
if (-f $document_root/system/maintenance.html) {
return 503;
}
}
server {
listen 80;
server_name assets.example.com;
client_max_body_size 4G;
keepalive_timeout 10;
root /home/deployer/example/current/public;
location = /404.html {
root html;
}
if ($request_method !~ ^(GET|HEAD|PUT|PATCH|POST|DELETE|OPTIONS)$ ){
return 405;
}
if (-f $document_root/system/maintenance.html) {
return 503;
}
}
Upvotes: 1