Thengx_http_proxy_module
module allows passingrequests to another server.
location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;}
Syntax: | proxy_bind |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 0.8.22.
Makes outgoing connections to a proxied server originatefrom the specified local IP address with an optional port (1.11.2).Parameter value can contain variables (1.3.12).The special valueoff
(1.3.12) cancels the effectof theproxy_bind
directiveinherited from the previous configuration level, which allows thesystem to auto-assign the local IP address and port.
Thetransparent
parameter (1.11.0) allowsoutgoing connections to a proxied server originatefrom a non-local IP address,for example, from a real IP address of a client:
proxy_bind $remote_addr transparent;
In order for this parameter to work,it is usually necessary to run nginx worker processes with thesuperuser privileges.On Linux it is not required (1.13.8) as ifthetransparent
parameter is specified, worker processesinherit theCAP_NET_RAW
capability from the master process.It is also necessary to configure kernel routing tableto intercept network traffic from the proxied server.
Syntax: | proxy_buffer_size |
---|---|
Default: | proxy_buffer_size 4k|8k; |
Context: | http ,server ,location |
Sets thesize
of the buffer used for reading the first partof the response received from the proxied server.This part usually contains a small response header.By default, the buffer size is equal to one memory page.This is either 4K or 8K, depending on a platform.It can be made smaller, however.
Syntax: | proxy_buffering |
---|---|
Default: | proxy_buffering on; |
Context: | http ,server ,location |
Enables or disables buffering of responses from the proxied server.
When buffering is enabled, nginx receives a response from the proxied serveras soon as possible, saving it into the buffers set by theproxy_buffer_size andproxy_buffers directives.If the whole response does not fit into memory, a part of it can be savedto atemporary file on the disk.Writing to temporary files is controlled by theproxy_max_temp_file_size andproxy_temp_file_write_size directives.
When buffering is disabled, the response is passed to a client synchronously,immediately as it is received.nginx will not try to read the whole response from the proxied server.The maximum size of the data that nginx can receive from the serverat a time is set by theproxy_buffer_size directive.
Buffering can also be enabled or disabled by passing“yes
” or “no
” in the“X-Accel-Buffering” response header field.This capability can be disabled using theproxy_ignore_headers directive.
Syntax: | proxy_buffers |
---|---|
Default: | proxy_buffers 8 4k|8k; |
Context: | http ,server ,location |
Sets thenumber
andsize
of thebuffers used for reading a response from the proxied server,for a single connection.By default, the buffer size is equal to one memory page.This is either 4K or 8K, depending on a platform.
Syntax: | proxy_busy_buffers_size |
---|---|
Default: | proxy_busy_buffers_size 8k|16k; |
Context: | http ,server ,location |
Whenbuffering of responses from the proxiedserver is enabled, limits the totalsize
of buffers thatcan be busy sending a response to the client while the response is notyet fully read.In the meantime, the rest of the buffers can be used for reading the responseand, if needed, buffering part of the response to a temporary file.By default,size
is limited by the size of two buffers set by theproxy_buffer_size andproxy_buffers directives.
Syntax: | proxy_cache |
---|---|
Default: | proxy_cache off; |
Context: | http ,server ,location |
Defines a shared memory zone used for caching.The same zone can be used in several places.Parameter value can contain variables (1.7.9).Theoff
parameter disables caching inheritedfrom the previous configuration level.
Syntax: | proxy_cache_background_update |
---|---|
Default: | proxy_cache_background_update off; |
Context: | http ,server ,location |
This directive appeared in version 1.11.10.
Allows starting a background subrequestto update an expired cache item,while a stale cached response is returned to the client.Note that it is necessary toallowthe usage of a stale cached response when it is being updated.
Syntax: | proxy_cache_bypass |
---|---|
Default: | — |
Context: | http ,server ,location |
Defines conditions under which the response will not be taken from a cache.If at least one value of the string parameters is not empty and is notequal to “0” then the response will not be taken from the cache:
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;proxy_cache_bypass $http_pragma $http_authorization;
Can be used along with theproxy_no_cache directive.
Syntax: | proxy_cache_convert_head |
---|---|
Default: | proxy_cache_convert_head on; |
Context: | http ,server ,location |
This directive appeared in version 1.9.7.
Enables or disables the conversion of the “HEAD
” methodto “GET
” for caching.When the conversion is disabled, thecache key should be configuredto include the$request_method
.
Syntax: | proxy_cache_key |
---|---|
Default: | proxy_cache_key $scheme$proxy_host$request_uri; |
Context: | http ,server ,location |
Defines a key for caching, for example
proxy_cache_key "$host$request_uri $cookie_user";
By default, the directive’s value is close to the string
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
Syntax: | proxy_cache_lock |
---|---|
Default: | proxy_cache_lock off; |
Context: | http ,server ,location |
This directive appeared in version 1.1.12.
When enabled, only one request at a time will be allowed to populatea new cache element identified according to theproxy_cache_keydirective by passing a request to a proxied server.Other requests of the same cache element will either waitfor a response to appear in the cache or the cache lock forthis element to be released, up to the time set by theproxy_cache_lock_timeout directive.
Syntax: | proxy_cache_lock_age |
---|---|
Default: | proxy_cache_lock_age 5s; |
Context: | http ,server ,location |
This directive appeared in version 1.7.8.
If the last request passed to the proxied serverfor populating a new cache elementhas not completed for the specifiedtime
,one more request may be passed to the proxied server.
Syntax: | proxy_cache_lock_timeout |
---|---|
Default: | proxy_cache_lock_timeout 5s; |
Context: | http ,server ,location |
This directive appeared in version 1.1.12.
Sets a timeout forproxy_cache_lock.When thetime
expires,the request will be passed to the proxied server,however, the response will not be cached.
Before 1.7.8, the response could be cached.
Syntax: | proxy_cache_max_range_offset |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 1.11.6.
Sets an offset in bytes for byte-range requests.If the range is beyond the offset,the range request will be passed to the proxied serverand the response will not be cached.
Syntax: | proxy_cache_methods |
---|---|
Default: | proxy_cache_methods GET HEAD; |
Context: | http ,server ,location |
This directive appeared in version 0.7.59.
If the client request method is listed in this directive thenthe response will be cached.“GET
” and “HEAD
” methods are alwaysadded to the list, though it is recommended to specify them explicitly.See also theproxy_no_cache directive.
Syntax: | proxy_cache_min_uses |
---|---|
Default: | proxy_cache_min_uses 1; |
Context: | http ,server ,location |
Sets thenumber
of requests after which the responsewill be cached.
Syntax: | proxy_cache_path |
---|---|
Default: | — |
Context: | http |
Sets the path and other parameters of a cache.Cache data are stored in files.The file name in a cache is a result ofapplying the MD5 function to thecache key.Thelevels
parameter defines hierarchy levels of a cache:from 1 to 3, each level accepts values 1 or 2.For example, in the following configuration
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
file names in a cache will look like this:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
A cached response is first written to a temporary file,and then the file is renamed.Starting from version 0.8.9, temporary files and the cache can be put ondifferent file systems.However, be aware that in this case a file is copiedacross two file systems instead of the cheap renaming operation.It is thus recommended that for any given location both cache and a directoryholding temporary filesare put on the same file system.The directory for temporary files is set based ontheuse_temp_path
parameter (1.7.10).If this parameter is omitted or set to the valueon
,the directory set by theproxy_temp_path directivefor the given location will be used.If the value is set tooff
,temporary files will be put directly in the cache directory.
In addition, all active keys and information about data are storedin a shared memory zone, whosename
andsize
are configured by thekeys_zone
parameter.One megabyte zone can store about 8 thousand keys.
As part ofcommercial subscription,the shared memory zone also stores extendedcacheinformation,thus, it is required to specify a larger zone size for the same number of keys.For example,one megabyte zone can store about 4 thousand keys.
Cached data that are not accessed during the time specified by theinactive
parameter get removed from the cacheregardless of their freshness.By default,inactive
is set to 10 minutes.
The special “cache manager” process monitors the maximum cache size setby themax_size
parameter,and the minimum amount of free space setby themin_free
(1.19.1) parameteron the file system with cache.When the size is exceeded or there is not enough free space,it removes the least recently used data.The data is removed in iterations configured bymanager_files
,manager_threshold
, andmanager_sleep
parameters (1.11.5).During one iteration no more thanmanager_files
itemsare deleted (by default, 100).The duration of one iteration is limited by themanager_threshold
parameter (by default, 200 milliseconds).Between iterations, a pause configured by themanager_sleep
parameter (by default, 50 milliseconds) is made.
A minute after the start the special “cache loader” process is activated.It loads information about previously cached data stored on file systeminto a cache zone.The loading is also done in iterations.During one iteration no more thanloader_files
itemsare loaded (by default, 100).Besides, the duration of one iteration is limited by theloader_threshold
parameter (by default, 200 milliseconds).Between iterations, a pause configured by theloader_sleep
parameter (by default, 50 milliseconds) is made.
Additionally,the following parameters are available as part of ourcommercial subscription:
purger
=on
|off
on
(default isoff
)will activate the “cache purger” process thatpermanently iterates through all cache entriesand deletes the entries that match the wildcard key.purger_files
=number
purger_files
is set to 10.purger_threshold
=number
purger_threshold
is set to 50 milliseconds.purger_sleep
=number
purger_sleep
is set to 50 milliseconds.In versions 1.7.3, 1.7.7, and 1.11.10 cache header format has been changed.Previously cached responses will be considered invalidafter upgrading to a newer nginx version.
Syntax: | proxy_cache_purge string ...; |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 1.5.7.
Defines conditions under which the request will be considered a cachepurge request.If at least one value of the string parameters is not empty and is not equalto “0” then the cache entry with a correspondingcache key is removed.The result of successful operation is indicated by returningthe 204 (No Content) response.
If thecache key of a purge request endswith an asterisk (“*
”), all cache entries matching thewildcard key will be removed from the cache.However, these entries will remain on the disk until they are deletedfor eitherinactivity,or processed by thecache purger (1.7.12),or a client attempts to access them.
Example configuration:
proxy_cache_path /data/nginx/cache keys_zone=cache_zone:10m;map $request_method $purge_method { PURGE 1; default 0;}server { ... location / { proxy_pass http://backend; proxy_cache cache_zone; proxy_cache_key $uri; proxy_cache_purge $purge_method; }}
This functionality is available as part of ourcommercial subscription.
Syntax: | proxy_cache_revalidate |
---|---|
Default: | proxy_cache_revalidate off; |
Context: | http ,server ,location |
This directive appeared in version 1.5.7.
Enables revalidation of expired cache items using conditional requests withthe “If-Modified-Since” and “If-None-Match”header fields.
Syntax: | proxy_cache_use_stale |
---|---|
Default: | proxy_cache_use_stale off; |
Context: | http ,server ,location |
Determines in which cases a stale cached response can be usedduring communication with the proxied server.The directive’s parameters match the parameters of theproxy_next_upstream directive.
Theerror
parameter also permitsusing a stale cached response if a proxied server to process a requestcannot be selected.
Additionally, theupdating
parameter permitsusing a stale cached response if it is currently being updated.This allows minimizing the number of accesses to proxied serverswhen updating cached data.
Using a stale cached responsecan also be enabled directly in the response headerfor a specified number of seconds after the response became stale (1.11.10).This has lower priority than using the directive parameters.
To minimize the number of accesses to proxied servers whenpopulating a new cache element, theproxy_cache_lockdirective can be used.
Syntax: | proxy_cache_valid [ |
---|---|
Default: | — |
Context: | http ,server ,location |
Sets caching time for different response codes.For example, the following directives
proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;
set 10 minutes of caching for responses with codes 200 and 302and 1 minute for responses with code 404.
If only cachingtime
is specified
proxy_cache_valid 5m;
then only 200, 301, and 302 responses are cached.
In addition, theany
parameter can be specifiedto cache any responses:
proxy_cache_valid 200 302 10m;proxy_cache_valid 301 1h;proxy_cache_valid any 1m;
Parameters of caching can also be set directlyin the response header.This has higher priority than setting of caching time using the directive.
@
prefix, it sets an absolutetime in seconds since Epoch, up to which the response may be cached.*
”, such aresponse will not be cached (1.7.7).If the header includes the “Vary” fieldwith another value, such a response will be cachedtaking into account the corresponding request header fields (1.7.7).Processing of one or more of these response header fields can be disabledusing theproxy_ignore_headers directive.
Syntax: | proxy_connect_timeout |
---|---|
Default: | proxy_connect_timeout 60s; |
Context: | http ,server ,location |
Defines a timeout for establishing a connection with a proxied server.It should be noted that this timeout cannot usually exceed 75 seconds.
Syntax: | proxy_cookie_domain proxy_cookie_domain |
---|---|
Default: | proxy_cookie_domain off; |
Context: | http ,server ,location |
This directive appeared in version 1.1.15.
Sets a text that should be changed in thedomain
attribute of the “Set-Cookie” header fields of aproxied server response.Suppose a proxied server returned the “Set-Cookie”header field with the attribute“domain=localhost
”.The directive
proxy_cookie_domain localhost example.org;
will rewrite this attribute to“domain=example.org
”.
A dot at the beginning of thedomain
andreplacement
strings and thedomain
attribute is ignored.Matching is case-insensitive.
Thedomain
andreplacement
stringscan contain variables:
proxy_cookie_domain www.$host $host;
The directive can also be specified using regular expressions.In this case,domain
should start fromthe “~
” symbol.A regular expression can contain named and positional captures,andreplacement
can reference them:
proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;
Severalproxy_cookie_domain
directivescan be specified on the same level:
proxy_cookie_domain localhost example.org;proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;
If several directives can be applied to the cookie,the first matching directive will be chosen.
Theoff
parameter cancels the effectof theproxy_cookie_domain
directivesinherited from the previous configuration level.
Syntax: | proxy_cookie_flags |
---|---|
Default: | proxy_cookie_flags off; |
Context: | http ,server ,location |
This directive appeared in version 1.19.3.
Sets one or more flags for the cookie.Thecookie
can contain text, variables, and their combinations.Theflag
can contain text, variables, and their combinations (1.19.8).Thesecure
,httponly
,samesite=strict
,samesite=lax
,samesite=none
parameters add the corresponding flags.Thenosecure
,nohttponly
,nosamesite
parameters remove the corresponding flags.
The cookie can also be specified using regular expressions.In this case,cookie
should start fromthe “~
” symbol.
Severalproxy_cookie_flags
directivescan be specified on the same configuration level:
proxy_cookie_flags one httponly;proxy_cookie_flags ~ nosecure samesite=strict;
If several directives can be applied to the cookie,the first matching directive will be chosen.In the example, thehttponly
flagis added to the cookieone
,for all other cookiesthesamesite=strict
flag is added andthesecure
flag is deleted.
Theoff
parameter cancels the effectof theproxy_cookie_flags
directivesinherited from the previous configuration level.
Syntax: | proxy_cookie_path proxy_cookie_path |
---|---|
Default: | proxy_cookie_path off; |
Context: | http ,server ,location |
This directive appeared in version 1.1.15.
Sets a text that should be changed in thepath
attribute of the “Set-Cookie” header fields of aproxied server response.Suppose a proxied server returned the “Set-Cookie”header field with the attribute“path=/two/some/uri/
”.The directive
proxy_cookie_path /two/ /;
will rewrite this attribute to“path=/some/uri/
”.
Thepath
andreplacement
stringscan contain variables:
proxy_cookie_path $uri /some$uri;
The directive can also be specified using regular expressions.In this case,path
should either start fromthe “~
” symbol for a case-sensitive matching,or from the “~*
” symbols for case-insensitivematching.The regular expression can contain named and positional captures,andreplacement
can reference them:
proxy_cookie_path ~*^/user/([^/]+) /u/$1;
Severalproxy_cookie_path
directivescan be specified on the same level:
proxy_cookie_path /one/ /;proxy_cookie_path / /two/;
If several directives can be applied to the cookie,the first matching directive will be chosen.
Theoff
parameter cancels the effectof theproxy_cookie_path
directivesinherited from the previous configuration level.
Syntax: | proxy_force_ranges |
---|---|
Default: | proxy_force_ranges off; |
Context: | http ,server ,location |
This directive appeared in version 1.7.7.
Enables byte-range supportfor both cached and uncached responses from the proxied serverregardless of the “Accept-Ranges” field in these responses.
Syntax: | proxy_headers_hash_bucket_size |
---|---|
Default: | proxy_headers_hash_bucket_size 64; |
Context: | http ,server ,location |
Sets the bucketsize
for hash tablesused by theproxy_hide_header andproxy_set_headerdirectives.The details of setting up hash tables are provided in a separatedocument.
Syntax: | proxy_headers_hash_max_size |
---|---|
Default: | proxy_headers_hash_max_size 512; |
Context: | http ,server ,location |
Sets the maximumsize
of hash tablesused by theproxy_hide_header andproxy_set_headerdirectives.The details of setting up hash tables are provided in a separatedocument.
Syntax: | proxy_hide_header |
---|---|
Default: | — |
Context: | http ,server ,location |
By default,nginx does not pass the header fields “Date”,“Server”, “X-Pad”, and“X-Accel-...” from the response of a proxiedserver to a client.Theproxy_hide_header
directive sets additional fieldsthat will not be passed.If, on the contrary, the passing of fields needs to be permitted,theproxy_pass_header directive can be used.
Syntax: | proxy_http_version |
---|---|
Default: | proxy_http_version 1.0; |
Context: | http ,server ,location |
This directive appeared in version 1.1.4.
Sets the HTTP protocol version for proxying.By default, version 1.0 is used.Version 1.1 is recommended for use withkeepaliveconnections andNTLM authentication.
Syntax: | proxy_ignore_client_abort |
---|---|
Default: | proxy_ignore_client_abort off; |
Context: | http ,server ,location |
Determines whether the connection with a proxied server should beclosed when a client closes the connection without waitingfor a response.
Syntax: | proxy_ignore_headers |
---|---|
Default: | — |
Context: | http ,server ,location |
Disables processing of certain response header fields from the proxied server.The following fields can be ignored: “X-Accel-Redirect”,“X-Accel-Expires”, “X-Accel-Limit-Rate” (1.1.6),“X-Accel-Buffering” (1.1.6),“X-Accel-Charset” (1.1.6), “Expires”,“Cache-Control”, “Set-Cookie” (0.8.44),and “Vary” (1.7.7).
If not disabled, processing of these header fields has the followingeffect:
Syntax: | proxy_intercept_errors |
---|---|
Default: | proxy_intercept_errors off; |
Context: | http ,server ,location |
Determines whether proxied responses with codes greater than or equalto 300 should be passed to a clientor be intercepted and redirected to nginx for processingwith theerror_page directive.
Syntax: | proxy_limit_rate |
---|---|
Default: | proxy_limit_rate 0; |
Context: | http ,server ,location |
This directive appeared in version 1.7.7.
Limits the speed of reading the response from the proxied server.Therate
is specified in bytes per second.The zero value disables rate limiting.The limit is set per a request, and so if nginx simultaneously openstwo connections to the proxied server,the overall rate will be twice as much as the specified limit.The limitation works only ifbuffering of responses from the proxiedserver is enabled.Parameter value can contain variables (1.27.0).
Syntax: | proxy_max_temp_file_size |
---|---|
Default: | proxy_max_temp_file_size 1024m; |
Context: | http ,server ,location |
Whenbuffering of responses from the proxiedserver is enabled, and the whole response does not fit into the buffersset by theproxy_buffer_size andproxy_buffersdirectives, a part of the response can be saved to a temporary file.This directive sets the maximumsize
of the temporary file.The size of data written to the temporary file at a time is setby theproxy_temp_file_write_size directive.
The zero value disables buffering of responses to temporary files.
This restriction does not apply to responsesthat will becachedorstored on disk.
Syntax: | proxy_method |
---|---|
Default: | — |
Context: | http ,server ,location |
Specifies the HTTPmethod
to use in requests forwardedto the proxied server instead of the method from the client request.Parameter value can contain variables (1.11.6).
Syntax: | proxy_next_upstream |
---|---|
Default: | proxy_next_upstream error timeout; |
Context: | http ,server ,location |
Specifies in which cases a request should be passed to the next server:
error
timeout
invalid_header
http_500
http_502
http_503
http_504
http_403
http_404
http_429
non_idempotent
POST
,LOCK
,PATCH
)are not passed to the next serverif a request has been sent to an upstream server (1.9.13);enabling this option explicitly allows retrying such requests;off
One should bear in mind that passing a request to the next server isonly possible if nothing has been sent to a client yet.That is, if an error or timeout occurs in the middle of thetransferring of a response, fixing this is impossible.
The directive also defines what is considered anunsuccessfulattempt of communication with a server.The cases oferror
,timeout
andinvalid_header
are always considered unsuccessful attempts,even if they are not specified in the directive.The cases ofhttp_500
,http_502
,http_503
,http_504
,andhttp_429
areconsidered unsuccessful attempts only if they are specified in the directive.The cases ofhttp_403
andhttp_404
are never considered unsuccessful attempts.
Passing a request to the next server can be limited bythe number of triesand bytime.
Syntax: | proxy_next_upstream_timeout |
---|---|
Default: | proxy_next_upstream_timeout 0; |
Context: | http ,server ,location |
This directive appeared in version 1.7.5.
Limits the time during which a request can be passed to thenext server.The0
value turns off this limitation.
Syntax: | proxy_next_upstream_tries |
---|---|
Default: | proxy_next_upstream_tries 0; |
Context: | http ,server ,location |
This directive appeared in version 1.7.5.
Limits the number of possible tries for passing a request to thenext server.The0
value turns off this limitation.
Syntax: | proxy_no_cache |
---|---|
Default: | — |
Context: | http ,server ,location |
Defines conditions under which the response will not be saved to a cache.If at least one value of the string parameters is not empty and is notequal to “0” then the response will not be saved:
proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;proxy_no_cache $http_pragma $http_authorization;
Can be used along with theproxy_cache_bypass directive.
Syntax: | proxy_pass |
---|---|
Default: | — |
Context: | location ,if in location ,limit_except |
Sets the protocol and address of a proxied server and an optional URIto which a location should be mapped.As a protocol, “http
” or “https
”can be specified.The address can be specified as a domain name or IP address,and an optional port:
proxy_pass http://localhost:8000/uri/;
or as a UNIX-domain socket path specified after the word“unix
” and enclosed in colons:
proxy_pass http://unix:/tmp/backend.socket:/uri/;
If a domain name resolves to several addresses, all of them will beused in a round-robin fashion.In addition, an address can be specified as aserver group.
Parameter value can contain variables.In this case, if an address is specified as a domain name,the name is searched among the described server groups,and, if not found, is determined using aresolver.
A request URI is passed to the server as follows:
proxy_pass
directive is specified with a URI,then when a request is passed to the server, the part of anormalizedrequest URI matching the location is replaced by a URIspecified in the directive:location /name/ { proxy_pass http://127.0.0.1/remote/;}
proxy_pass
is specified without a URI,the request URI is passed to the server in the same formas sent by a client when the original request is processed,or the full normalized request URI is passedwhen processing the changed URI:location /some/path/ { proxy_pass http://127.0.0.1;}
Before version 1.1.12,ifproxy_pass
is specified without a URI,the original request URI might be passedinstead of the changed URI in some cases.
In some cases, the part of a request URI to be replaced cannot be determined:
In these cases,proxy_pass
should be specified without a URI.
break
):location /name/ { rewrite /name/([^/]+) /users?name=$1 break; proxy_pass http://127.0.0.1;}
In this case, the URI specified in the directive is ignored andthe full changed request URI is passed to the server.
proxy_pass
:In this case, if URI is specified in the directive,it is passed to the server as is,replacing the original request URI.location /name/ { proxy_pass http://127.0.0.1$request_uri;}
WebSocket proxying requires specialconfiguration and is supported since version 1.3.13.
Syntax: | proxy_pass_header |
---|---|
Default: | — |
Context: | http ,server ,location |
Permits passingotherwise disabled headerfields from a proxied server to a client.
Syntax: | proxy_pass_request_body |
---|---|
Default: | proxy_pass_request_body on; |
Context: | http ,server ,location |
Indicates whether the original request body is passedto the proxied server.
location /x-accel-redirect-here/ { proxy_method GET; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_pass ...}
See also theproxy_set_header andproxy_pass_request_headers directives.
Syntax: | proxy_pass_request_headers |
---|---|
Default: | proxy_pass_request_headers on; |
Context: | http ,server ,location |
Indicates whether the header fields of the original request are passedto the proxied server.
location /x-accel-redirect-here/ { proxy_method GET; proxy_pass_request_headers off; proxy_pass_request_body off; proxy_pass ...}
See also theproxy_set_header andproxy_pass_request_body directives.
Syntax: | proxy_pass_trailers |
---|---|
Default: | proxy_pass_trailers off; |
Context: | http ,server ,location |
This directive appeared in version 1.27.2.
Permits passing trailer fields from a proxied server to a client.
A trailer section in HTTP/1.1 isexplicitlyenabled.
location / { proxy_http_version 1.1; proxy_set_header Connection "te"; proxy_set_header TE "trailers"; proxy_pass_trailers on; proxy_pass ...}
Syntax: | proxy_read_timeout |
---|---|
Default: | proxy_read_timeout 60s; |
Context: | http ,server ,location |
Defines a timeout for reading a response from the proxied server.The timeout is set only between two successive read operations,not for the transmission of the whole response.If the proxied server does not transmit anything within this time,the connection is closed.
Syntax: | proxy_redirect proxy_redirect proxy_redirect |
---|---|
Default: | proxy_redirect default; |
Context: | http ,server ,location |
Sets the text that should be changed in the “Location”and “Refresh” header fields of a proxied server response.Suppose a proxied server returned the header field“Location: http://localhost:8000/two/some/uri/
”.The directive
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
will rewrite this string to“Location: http://frontend/one/some/uri/
”.
A server name may be omitted in thereplacement
string:
proxy_redirect http://localhost:8000/two/ /;
then the primary server’s name and port, if different from 80,will be inserted.
The default replacement specified by thedefault
parameteruses the parameters of thelocation andproxy_pass directives.Hence, the two configurations below are equivalent:
location /one/ { proxy_pass http://upstream:port/two/; proxy_redirect default;
location /one/ { proxy_pass http://upstream:port/two/; proxy_redirect http://upstream:port/two/ /one/;
Thedefault
parameter is not permitted ifproxy_pass is specified using variables.
Areplacement
string can contain variables:
proxy_redirect http://localhost:8000/ http://$host:$server_port/;
Aredirect
can also contain (1.1.11) variables:
proxy_redirect http://$proxy_host:8000/ /;
The directive can be specified (1.1.11) using regular expressions.In this case,redirect
should either start withthe “~
” symbol for a case-sensitive matching,or with the “~*
” symbols for case-insensitivematching.The regular expression can contain named and positional captures,andreplacement
can reference them:
proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;proxy_redirect ~*/user/([^/]+)/(.+)$ http://$1.example.com/$2;
Severalproxy_redirect
directivescan be specified on the same level:
proxy_redirect default;proxy_redirect http://localhost:8000/ /;proxy_redirect http://www.example.com/ /;
If several directives can be applied tothe header fields of a proxied server response,the first matching directive will be chosen.
Theoff
parameter cancels the effectof theproxy_redirect
directivesinherited from the previous configuration level.
Using this directive, it is also possible to add host names to relativeredirects issued by a proxied server:
proxy_redirect / /;
Syntax: | proxy_request_buffering |
---|---|
Default: | proxy_request_buffering on; |
Context: | http ,server ,location |
This directive appeared in version 1.7.11.
Enables or disables buffering of a client request body.
When buffering is enabled, the entire request body isreadfrom the client before sending the request to a proxied server.
When buffering is disabled, the request body is sent to the proxied serverimmediately as it is received.In this case, the request cannot be passed to thenext serverif nginx already started sending the request body.
When HTTP/1.1 chunked transfer encoding is usedto send the original request body,the request body will be buffered regardless of the directive value unlessHTTP/1.1 isenabled for proxying.
Syntax: | proxy_send_lowat |
---|---|
Default: | proxy_send_lowat 0; |
Context: | http ,server ,location |
If the directive is set to a non-zero value, nginx will try tominimize the numberof send operations on outgoing connections to a proxied server by using eitherNOTE_LOWAT
flag of thekqueue method,or theSO_SNDLOWAT
socket option,with the specifiedsize
.
This directive is ignored on Linux, Solaris, and Windows.
Syntax: | proxy_send_timeout |
---|---|
Default: | proxy_send_timeout 60s; |
Context: | http ,server ,location |
Sets a timeout for transmitting a request to the proxied server.The timeout is set only between two successive write operations,not for the transmission of the whole request.If the proxied server does not receive anything within this time,the connection is closed.
Syntax: | proxy_set_body |
---|---|
Default: | — |
Context: | http ,server ,location |
Allows redefining the request body passed to the proxied server.Thevalue
can contain text, variables, and their combination.
Syntax: | proxy_set_header |
---|---|
Default: | proxy_set_header Host $proxy_host; proxy_set_header Connection close; |
Context: | http ,server ,location |
Allows redefining or appending fields to the request headerpassed to the proxied server.Thevalue
can contain text, variables, and their combinations.These directives are inherited from the previous configuration levelif and only if there are noproxy_set_header
directivesdefined on the current level.By default, only two fields are redefined:
proxy_set_header Host $proxy_host;proxy_set_header Connection close;
If caching is enabled, the header fields“If-Modified-Since”,“If-Unmodified-Since”,“If-None-Match”,“If-Match”,“Range”,and“If-Range”from the original request are not passed to the proxied server.
An unchanged “Host” request header field can be passed like this:
proxy_set_header Host $http_host;
However, if this field is not present in a client request header thennothing will be passed.In such a case it is better to use the$host
variable - itsvalue equals the server name in the “Host” request headerfield or the primary server name if this field is not present:
proxy_set_header Host $host;
In addition, the server name can be passed together with the port of theproxied server:
proxy_set_header Host $host:$proxy_port;
If the value of a header field is an empty string then thisfield will not be passed to a proxied server:
proxy_set_header Accept-Encoding "";
Syntax: | proxy_socket_keepalive |
---|---|
Default: | proxy_socket_keepalive off; |
Context: | http ,server ,location |
This directive appeared in version 1.15.6.
Configures the “TCP keepalive” behaviorfor outgoing connections to a proxied server.By default, the operating system’s settings are in effect for the socket.If the directive is set to the value “on
”, theSO_KEEPALIVE
socket option is turned on for the socket.
Syntax: | proxy_ssl_certificate |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 1.7.8.
Specifies afile
with the certificate in the PEM formatused for authentication to a proxied HTTPS server.
Since version 1.21.0, variables can be used in thefile
name.
Syntax: | proxy_ssl_certificate_cache proxy_ssl_certificate_cache |
---|---|
Default: | proxy_ssl_certificate_cache off; |
Context: | http ,server ,location |
This directive appeared in version 1.27.4.
Defines a cache that storesSSL certificates andsecret keysspecified withvariables.
The directive has the following parameters:
max
inactive
valid
off
Example:
proxy_ssl_certificate $proxy_ssl_server_name.crt;proxy_ssl_certificate_key $proxy_ssl_server_name.key;proxy_ssl_certificate_cache max=1000 inactive=20s valid=1m;
Syntax: | proxy_ssl_certificate_key |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 1.7.8.
Specifies afile
with the secret key in the PEM formatused for authentication to a proxied HTTPS server.
The valueengine
:name
:id
can be specified instead of thefile
(1.7.9),which loads a secret key with a specifiedid
from the OpenSSL enginename
.
The valuestore
:scheme
:id
can be specified instead of thefile
(1.29.0),which is used to load a secret key with a specifiedid
and OpenSSL provider registered URIscheme
, such aspkcs11
.
Since version 1.21.0, variables can be used in thefile
name.
Syntax: | proxy_ssl_ciphers |
---|---|
Default: | proxy_ssl_ciphers DEFAULT; |
Context: | http ,server ,location |
This directive appeared in version 1.5.6.
Specifies the enabled ciphers for requests to a proxied HTTPS server.The ciphers are specified in the format understood by the OpenSSL library.
The full list can be viewed using the“openssl ciphers
” command.
Syntax: | proxy_ssl_conf_command |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 1.19.4.
Sets arbitrary OpenSSL configurationcommandswhen establishing a connection with the proxied HTTPS server.
The directive is supported when using OpenSSL 1.0.2 or higher.
Severalproxy_ssl_conf_command
directivescan be specified on the same level.These directives are inherited from the previous configuration levelif and only if there arenoproxy_ssl_conf_command
directivesdefined on the current level.
Note that configuring OpenSSL directlymight result in unexpected behavior.
Syntax: | proxy_ssl_crl |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 1.7.0.
Specifies afile
with revoked certificates (CRL)in the PEM format used toverifythe certificate of the proxied HTTPS server.
Syntax: | proxy_ssl_key_log path; |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 1.27.2.
Enables logging of proxied HTTPS server connection SSL keysand specifies the path to the key log file.Keys are logged in theSSLKEYLOGFILEformat compatible with Wireshark.
This directive is available as part of ourcommercial subscription.
Syntax: | proxy_ssl_name |
---|---|
Default: | proxy_ssl_name $proxy_host; |
Context: | http ,server ,location |
This directive appeared in version 1.7.0.
Allows overriding the server name used toverifythe certificate of the proxied HTTPS server and to bepassed through SNIwhen establishing a connection with the proxied HTTPS server.
By default, the host part of theproxy_pass URL is used.
Syntax: | proxy_ssl_password_file |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 1.7.8.
Specifies afile
with passphrases forsecret keyswhere each passphrase is specified on a separate line.Passphrases are tried in turn when loading the key.
Syntax: | proxy_ssl_protocols [ |
---|---|
Default: | proxy_ssl_protocols TLSv1.2 TLSv1.3; |
Context: | http ,server ,location |
This directive appeared in version 1.5.6.
Enables the specified protocols for requests to a proxied HTTPS server.
TheTLSv1.3
parameter is used by defaultsince 1.23.4.
Syntax: | proxy_ssl_server_name |
---|---|
Default: | proxy_ssl_server_name off; |
Context: | http ,server ,location |
This directive appeared in version 1.7.0.
Enables or disables passing of the server name throughTLSServer Name Indication extension (SNI, RFC 6066)when establishing a connection with the proxied HTTPS server.
Syntax: | proxy_ssl_session_reuse |
---|---|
Default: | proxy_ssl_session_reuse on; |
Context: | http ,server ,location |
Determines whether SSL sessions can be reused when working withthe proxied server.If the errors“digest check failed
”appear in the logs, try disabling session reuse.
Syntax: | proxy_ssl_trusted_certificate |
---|---|
Default: | — |
Context: | http ,server ,location |
This directive appeared in version 1.7.0.
Specifies afile
with trusted CA certificates in the PEM formatused toverifythe certificate of the proxied HTTPS server.
Syntax: | proxy_ssl_verify |
---|---|
Default: | proxy_ssl_verify off; |
Context: | http ,server ,location |
This directive appeared in version 1.7.0.
Enables or disables verification of the proxied HTTPS server certificate.
Syntax: | proxy_ssl_verify_depth |
---|---|
Default: | proxy_ssl_verify_depth 1; |
Context: | http ,server ,location |
This directive appeared in version 1.7.0.
Sets the verification depth in the proxied HTTPS server certificates chain.
Syntax: | proxy_store |
---|---|
Default: | proxy_store off; |
Context: | http ,server ,location |
Enables saving of files to a disk.Theon
parameter saves files with pathscorresponding to the directivesalias orroot.Theoff
parameter disables saving of files.In addition, the file name can be set explicitly using thestring
with variables:
proxy_store /data/www$original_uri;
The modification time of files is set according to the received“Last-Modified” response header field.The response is first written to a temporary file,and then the file is renamed.Starting from version 0.8.9, temporary files and the persistent storecan be put on different file systems.However, be aware that in this case a file is copiedacross two file systems instead of the cheap renaming operation.It is thus recommended that for any given location both saved files and adirectory holding temporary files, set by theproxy_temp_pathdirective, are put on the same file system.
This directive can be used to create local copies of static unchangeablefiles, e.g.:
location /images/ { root /data/www; error_page 404 = /fetch$uri;}location /fetch/ { internal; proxy_pass http://backend/; proxy_store on; proxy_store_access user:rw group:rw all:r; proxy_temp_path /data/temp; alias /data/www/;}
or like this:
location /images/ { root /data/www; error_page 404 = @fetch;}location @fetch { internal; proxy_pass http://backend; proxy_store on; proxy_store_access user:rw group:rw all:r; proxy_temp_path /data/temp; root /data/www;}
Syntax: | proxy_store_access |
---|---|
Default: | proxy_store_access user:rw; |
Context: | http ,server ,location |
Sets access permissions for newly created files and directories, e.g.:
proxy_store_access user:rw group:rw all:r;
If anygroup
orall
access permissionsare specified thenuser
permissions may be omitted:
proxy_store_access group:rw all:r;
Syntax: | proxy_temp_file_write_size |
---|---|
Default: | proxy_temp_file_write_size 8k|16k; |
Context: | http ,server ,location |
Limits thesize
of data written to a temporary fileat a time, when buffering of responses from the proxied serverto temporary files is enabled.By default,size
is limited by two buffers set by theproxy_buffer_size andproxy_buffers directives.The maximum size of a temporary file is set by theproxy_max_temp_file_size directive.
Syntax: | proxy_temp_path |
---|---|
Default: | proxy_temp_path proxy_temp; |
Context: | http ,server ,location |
Defines a directory for storing temporary fileswith data received from proxied servers.Up to three-level subdirectory hierarchy can be used underneath the specifieddirectory.For example, in the following configuration
proxy_temp_path /spool/nginx/proxy_temp 1 2;
a temporary file might look like this:
/spool/nginx/proxy_temp/7/45/00000123457
See also theuse_temp_path
parameter of theproxy_cache_path directive.
Thengx_http_proxy_module
module supports embedded variablesthat can be used to compose headers using theproxy_set_header directive:
$proxy_host
$proxy_port
$proxy_add_x_forwarded_for
$remote_addr
variable appended to it, separated by a comma.If the “X-Forwarded-For” field is not present in the clientrequest header, the$proxy_add_x_forwarded_for
variable is equalto the$remote_addr
variable.