I have a set of applications behind a proxy server which forwards request appropriately and uses the proxy protocol to preserve the request's origin data. The apps also make requests amongst each other so I want them to accept requests with and without the proxy protocol. Is it possible to configure Nginx to do this in some way without using a different server_name or port?


Without using a different server block, the only way to do this is with different listen directives. This means the server running nginx must have different IP addresses for connecting to the server from the external proxy and from the internal server farm.

For example, you might have an internal network for your internal apps, and the server running nginx is on Then you have an external network which your external proxy server uses to reach nginx, and the server has address In this case you can configure nginx as:

server {
    # PROXY protocol connections
    listen ssl http2 proxy_protocol;
    set_real_ip_from;  # The address(es) of the proxies
    real_ip_header proxy_protocol;

    # Direct connections
    listen ssl http2;
    listen [::]:443 ssl http2;

    # everything else for this block

On a related note, you should have already deployed IPv6 within your organization, even without global IPv6 connectivity. You can use that for your internal communications if you haven't got a separate internal IPv4 network.

  • Should set_real_ip_from; have a 3 at the end? "and the [external proxy] server has address"
    – lcnittl
    May 31 at 0:34
  • @lcnittl It is correct as written, at least insofar as an example can be correct. This IP address represents the external proxy that connects to nginx using the PROXY protocol. See the comment and the nginx documentation. May 31 at 13:26
  • Ah okay - seems I misread that the external proxy's IP addr is (which is the server's addr as I now saw in the listen directive). Thanks for your reply!
    – lcnittl
    May 31 at 18:03

The proxy protocol specification at Proxy protocol explicitly calls out the risk, of running a listener which attempts to guess if Proxy protocol is used on the same address and port.

The receiver MUST be configured to only receive the protocol described in this
specification and MUST not try to guess whether the protocol header is present
or not. This means that the protocol explicitly prevents port sharing between
public and private access. Otherwise it would open a major security breach by
allowing untrusted parties to spoof their connection addresses. The receiver
SHOULD ensure proper access filtering so that only trusted proxies are allowed
to use this protocol.

So attempting to accept requests with both with and without Proxy protocol will be a risk.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.