Rails 4 automatically adds the sass-rails, coffee-rails and uglifier
gems to your Gemfile
reduce the number of requests that a browser makes to render a web page
Starting with version 3.1, Rails defaults to concatenating all JavaScript files into one master .js file and all CSS files into one master .css file
In production, Rails inserts an MD5 fingerprint into each filename so that the file is cached by the web browser
The technique sprockets uses for fingerprinting is to insert a hash of the
content into the name, usually at the end.
asset minification or compression
The sass-rails gem is automatically used for CSS compression if included
in Gemfile and no config.assets.css_compressor option is set.
Supported languages include Sass for CSS, CoffeeScript for JavaScript, and ERB for both by default.
When a filename is unique and based on its content, HTTP headers can be set to encourage caches everywhere (whether at CDNs, at ISPs, in networking equipment, or in web browsers) to keep their own copy of the content
asset pipeline is technically no longer a core feature of Rails 4
Rails uses for fingerprinting is to insert a hash of the content into the name, usually at the end
With the asset pipeline, the preferred location for these assets is now the app/assets directory.
Fingerprinting is enabled by default for production and disabled for all other
environments
The files in app/assets are never served directly in production.
Paths are traversed in the order that they occur in the search path
You should use app/assets for
files that must undergo some pre-processing before they are served.
By default .coffee and .scss files will not be precompiled on their own
app/assets is for assets that are owned by the application, such as custom images, JavaScript files or stylesheets.
lib/assets is for your own libraries' code that doesn't really fit into the scope of the application or those libraries which are shared across applications.
vendor/assets is for assets that are owned by outside entities, such as code for JavaScript plugins and CSS frameworks.
Any path under assets/* will be searched
By default these files will be ready to use by your application immediately using the require_tree directive.
By default, this means the files in app/assets take precedence, and will mask corresponding paths in lib and vendor
Sprockets uses files named index (with the relevant extensions) for a special purpose
Rails.application.config.assets.paths
causes turbolinks to check if
an asset has been updated and if so loads it into the page
if you add an erb extension to a CSS asset (for example, application.css.erb), then helpers like asset_path are available in your CSS rules
If you add an erb extension to a JavaScript asset, making it something such as application.js.erb, then you can use the asset_path helper in your JavaScript code
The asset pipeline automatically evaluates ERB
data URI — a method of embedding the image data directly into the CSS file — you can use the asset_data_uri helper.
Sprockets will also look through the paths specified in config.assets.paths,
which includes the standard application paths and any paths added by Rails
engines.
image_tag
the closing tag cannot be of the style -%>
asset_data_uri
app/assets/javascripts/application.js
sass-rails provides -url and -path helpers (hyphenated in Sass,
underscored in Ruby) for the following asset classes: image, font, video, audio,
JavaScript and stylesheet.
Rails.application.config.assets.compress
In JavaScript files, the directives begin with //=
The require_tree directive tells Sprockets to recursively include all JavaScript files in the specified directory into the output.
manifest files contain directives — instructions that tell Sprockets which files to require in order to build a single CSS or JavaScript file.
You should not rely on any particular order among those
Sprockets uses manifest files to determine which assets to include and serve.
the family of require directives prevents files from being included twice in the output
which files to require in order to build a single CSS or JavaScript file
Directives are processed top to bottom, but the order in which files are included by require_tree is unspecified.
In JavaScript files, Sprockets directives begin with //=
If require_self is called more than once, only the last call is respected.
require
directive is used to tell Sprockets the files you wish to require.
You need not supply the extensions explicitly.
Sprockets assumes you are requiring a .js file when done from within a .js
file
paths must be
specified relative to the manifest file
require_directory
Rails 4 creates both app/assets/javascripts/application.js and
app/assets/stylesheets/application.css regardless of whether the
--skip-sprockets option is used when creating a new rails application.
The file extensions used on an asset determine what preprocessing is applied.
app/assets/stylesheets/application.css
Additional layers of preprocessing can be requested by adding other extensions, where each extension is processed in a right-to-left manner
require_self
use the Sass @import rule
instead of these Sprockets directives.
Keep in mind that the order of these preprocessors is important
In development mode, assets are served as separate files in the order they are specified in the manifest file.
when these files are
requested they are processed by the processors provided by the coffee-script
and sass gems and then sent back to the browser as JavaScript and CSS
respectively.
css.scss.erb
js.coffee.erb
Keep in mind the order of these preprocessors is important.
By default Rails assumes that assets have been precompiled and will be served as static assets by your web server
with the Asset Pipeline the :cache and :concat options aren't used anymore
Assets are compiled and cached on the first request after the server is started
Application templates are simple Ruby files containing DSL for adding gems/initializers etc. to your freshly created Rails project or an existing Rails project.
copy_file will accept
relative paths to your template's location
improve the performance and reliability of a server environment by distributing the workload across multiple servers (e.g. web, application, database).
ACLs are used to test some condition and perform an action (e.g. select a server, or block a request) based on the test result.
ACLs allows flexible network traffic forwarding based on a variety of factors like pattern-matching and the number of connections to a backend
A backend is a set of servers that receives forwarded requests
adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers
mode http specifies that layer 7 proxying will be used
specifies the load balancing algorithm
health checks
A frontend defines how requests should be forwarded to backends
use_backend rules, which define which backends to use depending on which ACL conditions are matched, and/or a default_backend rule that handles every other case
A frontend can be configured to various types of network traffic
Load balancing this way will forward user traffic based on IP range and port
Generally, all of the servers in the web-backend should be serving identical content--otherwise the user might receive inconsistent content.
Using layer 7 allows the load balancer to forward requests to different backend servers based on the content of the user's request.
allows you to run multiple web application servers under the same domain and port
acl url_blog path_beg /blog matches a request if the path of the user's request begins with /blog.
Round Robin selects servers in turns
Selects the server with the least number of connections--it is recommended for longer sessions
This selects which server to use based on a hash of the source IP
ensure that a user will connect to the same server
require that a user continues to connect to the same backend server. This persistence is achieved through sticky sessions, using the appsession parameter in the backend that requires it.
HAProxy uses health checks to determine if a backend server is available to process requests.
The default health check is to try to establish a TCP connection to the server
If a server fails a health check, and therefore is unable to serve requests, it is automatically disabled in the backend
For certain types of backends, like database servers in certain situations, the default health check is insufficient to determine whether a server is still healthy.
However, your load balancer is a single point of failure in these setups; if it goes down or gets overwhelmed with requests, it can cause high latency or downtime for your service.
A high availability (HA) setup is an infrastructure without a single point of failure
a static IP address that can be remapped from one server to another.
If that load balancer fails, your failover mechanism will detect it and automatically reassign the IP address to one of the passive servers.
discussing the basic structure of an Nginx configuration file along with some guidelines on how to design your files
/etc/nginx/nginx.conf
In Nginx parlance, the areas that these brackets define are called "contexts" because they contain configuration details that are separated according to their area of concern
if a directive is valid in multiple nested scopes, a declaration in a broader context will be passed on to any child contexts as default values.
The children contexts can override these values at will
Nginx will error out on reading a configuration file with directives that are declared in the wrong context.
The most general context is the "main" or "global" context
Any directive that exist entirely outside of these blocks is said to inhabit the "main" context
The main context represents the broadest environment for Nginx configuration.
The "events" context is contained within the "main" context. It is used to set global options that affect how Nginx handles connections at a general level.
Nginx uses an event-based connection processing model, so the directives defined within this context determine how worker processes should handle connections.
the connection processing method is automatically selected based on the most efficient choice that the platform has available
a worker will only take a single connection at a time
When configuring Nginx as a web server or reverse proxy, the "http" context will hold the majority of the configuration.
The http context is a sibling of the events context, so they should be listed side-by-side, rather than nested
fine-tune the TCP keep alive settings (keepalive_disable, keepalive_requests, and keepalive_timeout)
The "server" context is declared within the "http" context.
multiple declarations
each instance defines a specific virtual server to handle client requests
Each client request will be handled according to the configuration defined in a single server context, so Nginx must decide which server context is most appropriate based on details of the request.
listen: The ip address / port combination that this server block is designed to respond to.
server_name: This directive is the other component used to select a server block for processing.
"Host" header
configure files to try to respond to requests (try_files)
issue redirects and rewrites (return and rewrite)
set arbitrary variables (set)
Location contexts share many relational qualities with server contexts
multiple location contexts can be defined, each location is used to handle a certain type of client request, and each location is selected by virtue of matching the location definition against the client request through a selection algorithm
Location blocks live within server contexts and, unlike server blocks, can be nested inside one another.
While server contexts are selected based on the requested IP address/port combination and the host name in the "Host" header, location blocks further divide up the request handling within a server block by looking at the request URI
The request URI is the portion of the request that comes after the domain name or IP address/port combination.
New directives at this level allow you to reach locations outside of the document root (alias), mark the location as only internally accessible (internal), and proxy to other servers or locations (using http, fastcgi, scgi, and uwsgi proxying).
These can then be used to do A/B testing by providing different content to different hosts.
configures Perl handlers for the location they appear in
set the value of a variable depending on the value of another variable
used to map MIME types to the file extensions that should be associated with them.
this context defines a named pool of servers that Nginx can then proxy requests to
The upstream context should be placed within the http context, outside of any specific server contexts.
The upstream context can then be referenced by name within server or location blocks to pass requests of a certain type to the pool of servers that have been defined.
function as a high performance mail proxy server
The mail context is defined within the "main" or "global" context (outside of the http context).
Nginx has the ability to redirect authentication requests to an external authentication server
the if directive in Nginx will execute the instructions contained if a given test returns "true".
Since Nginx will test conditions of a request with many other purpose-made directives, if should not be used for most forms of conditional execution.
The limit_except context is used to restrict the use of certain HTTP methods within a location context.
The result of the above example is that any client can use the GET and HEAD verbs, but only clients coming from the 192.168.1.1/24 subnet are allowed to use other methods.
Many directives are valid in more than one context
it is usually best to declare directives in the highest context to which they are applicable, and overriding them in lower contexts as necessary.
Declaring at higher levels provides you with a sane default
Nginx already engages in a well-documented selection algorithm for things like selecting server blocks and location blocks.
instead of relying on rewrites to get a user supplied request into the format that you would like to work with, you should try to set up two blocks for the request, one of which represents the desired method, and the other that catches messy requests and redirects (and possibly rewrites) them to your correct block.
incorrect requests can get by with a redirect rather than a rewrite, which should execute with lower overhead.