General Proxying Information
If you have only used web servers in the past for simple, single server configurations, you may be wondering why you would need to proxy requests.
One reason to proxy to other servers from Nginx is the ability to scale out your infrastructure. Nginx is built to handle many concurrent connections at the same time. This makes it ideal for being the point-of-contact for clients. The server can pass requests to any number of backend servers to handle the bulk of the work, which spreads the load across your infrastructure. This design also provides you with flexibility in easily adding backend servers or taking them down as needed for maintenance.
Another instance where an http proxy might be useful is when using an application servers that might not be built to handle requests directly from clients in production environments. Many frameworks include web servers, but most of them are not as robust as servers designed for high performance like Nginx. Putting Nginx in front of these servers can lead to a better experience for users and increased security.
Proxying in Nginx is accomplished by manipulating a request aimed at the Nginx server and passing it to other servers for the actual processing. The result of the request is passed back to Nginx, which then relays the information to the client. The other servers in this instance can be remote machines, local servers, or even other virtual servers defined within Nginx. The servers that Nginx proxies requests to are known as upstream servers.
Nginx can proxy requests to servers that communicate using the http(s), FastCGI, SCGI, and uwsgi, or memcached protocols through separate sets of directives for each type of proxy. In this guide, we will be focusing on the http protocol. The Nginx instance is responsible for passing on the request and massaging any message components into a format that the upstream server can understand.
Deconstructing a Basic HTTP Proxy Pass
The most straight-forward type of proxy involves handing off a request to a single server that can communicate using http. This type of proxy is known as a generic "proxy pass" and is handled by the aptly named
proxy_pass
directive.
The
proxy_pass
directive is mainly found in location contexts. It is also valid in if
blocks within a location context and in limit_except
contexts. When a request matches a location with a proxy_pass
directive inside, the request is forwarded to the URL given by the directive.
Let's take a look at an example:
# server context
location /match/here {
proxy_pass http://example.com;
}
. . .
In the above configuration snippet, no URI is given at the end of the server in the
proxy_pass
definition. For definitions that fit this pattern, the URI requested by the client will be passed to the upstream server as-is.
For example, when a request for
/match/here/please
is handled by this block, the request URI will be sent to the example.com
server as http://example.com/match/here/please
.
Let's take a look at the alternative scenario:
# server context
location /match/here {
proxy_pass http://example.com/new/prefix;
}
. . .
In the above example, the proxy server is defined with a URI segment on the end (
/new/prefix
). When a URI is given in the proxy_pass
definition, the portion of the request that matches the location definition is replaced by this URI during the pass.
For example, a request for
/match/here/please
on the Nginx server will be passed to the upstream server as http://example.com/new/prefix/please
. The /match/here
is replaced by /new/prefix
. This is an important point to keep in mind.
Sometimes, this kind of replacement is impossible. In these cases, the URI at the end of the
proxy_pass
definition is ignored and either the original URI from the client or the URI as modified by other directives will be passed to the upstream server.
For instance, when the location is matched using regular expressions, Nginx cannot determine which part of the URI matched the expression, so it sends the original client request URI. Another example is when a rewrite directive is used within the same location, causing the client URI to be rewritten, but still handled in the same block. In this case, the rewritten URI will be passed.
More Details here
No comments:
Post a Comment