# Proxying based on protocol (e.g. "ws"/"wss")?

**URL:** <https://www.ruby-forum.com/t/proxying-based-on-protocol-e-g-ws-wss/228805>\
**Category:** NGINX\
**Created:** [May 8, 2013, 3:33pm UTC](https://www.ruby-forum.com/t/proxying-based-on-protocol-e-g-ws-wss/228805 "2013-05-08T15:33:32Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Daniel\_Griscom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/858c86/32.png) [@Daniel\_Griscom](https://www.ruby-forum.com/u/Daniel_Griscom)\
**Post date:** [May 8, 2013, 3:33pm UTC](https://www.ruby-forum.com/t/proxying-based-on-protocol-e-g-ws-wss/228805/1 "2013-05-08T15:33:32Z")

</div>

I’m an nginx newbie, and need use use it as a front end for a website  
that also handles websocket connections. I have the configuration set  
up so that requests to a specific URI match a location section, which  
then proxies the request to the websocket back end server, and it all  
works. (Very cool.)

However, I was wondering if, rather than detecting requests to a  
specific location, I could proxy all “ws://” or "wss:// requests,  
independent of the URI being requested.

Is there a way to proxy all requests with a given protocol?

Thanks,  
Dan

–  
Daniel T. Griscom removed\_email\_address@domain.invalid  
Suitable Systems [http://www.suitable.com/](http://www.suitable.com/)  
1 Centre Street, Suite 204 (781) 665-0053  
Wakefield, MA 01880-2400

---

<div class="post-metadata">

**Author:** ![Daniel\_Griscom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/858c86/32.png) [@Daniel\_Griscom](https://www.ruby-forum.com/u/Daniel_Griscom)\
**Post date:** [May 9, 2013, 8:46pm UTC](https://www.ruby-forum.com/t/proxying-based-on-protocol-e-g-ws-wss/228805/2 "2013-05-09T20:46:34Z")

</div>

… bump?

(thanks,  
Dan)

At 9:32 AM -0400 5/8/13, Daniel Griscom wrote:

> Is there a way to proxy all requests with a given protocol?
> 
> * * *
> 
> nginx mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [mailman.nginx.org archive](http://mailman.nginx.org/mailman/listinfo/nginx)

–  
Daniel T. Griscom [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Suitable Systems [http://www.suitable.com/](http://www.suitable.com/)  
1 Centre Street, Suite 204 (781) 665-0053  
Wakefield, MA 01880-2400

---

<div class="post-metadata">

**Author:** ![Daniel\_Griscom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/858c86/32.png) [@Daniel\_Griscom](https://www.ruby-forum.com/u/Daniel_Griscom)\
**Post date:** [May 9, 2013, 11:14pm UTC](https://www.ruby-forum.com/t/proxying-based-on-protocol-e-g-ws-wss/228805/3 "2013-05-09T23:14:57Z")

</div>

The scheme is available as… $scheme

On Thu, 2013-05-09 at 14:45 -0400, Daniel Griscom wrote:

> > location section, which then proxies the request to the websocket  
> > Dan  
> > [mailman.nginx.org archive](http://mailman.nginx.org/mailman/listinfo/nginx)

–  
Steve H. BSc(Hons) MNZCS [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> **[Linux & Admin Support Services | "Services provided by people who are proud...](https://www.greengecko.co.nz)**
>
> Offers linux support services, systems and database administration, consultancy and the full development lifecycle for open source - based solutions

MSN: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Skype: sholdowa

---

<div class="post-metadata">

**Author:** ![Daniel\_Griscom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/858c86/32.png) [@Daniel\_Griscom](https://www.ruby-forum.com/u/Daniel_Griscom)\
**Post date:** [May 10, 2013, 11:27am UTC](https://www.ruby-forum.com/t/proxying-based-on-protocol-e-g-ws-wss/228805/4 "2013-05-10T11:27:08Z")

</div>

Hello!

On Fri, May 10, 2013 at 09:14:04AM +1200, Steve H. wrote:

> The scheme is available as… $scheme

Yes, but WebSocket protocol uses http for handshake. So the  
scheme will be either “http” or “https”. WebSocket requests can  
be identified based on Upgrade header, i.e. $http\_upgrade  
variable.

> > > website that also handles websocket connections. I have the
> > > 
> > > nginx mailing list
> 
> * * *
> 
> nginx mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [mailman.nginx.org archive](http://mailman.nginx.org/mailman/listinfo/nginx)

–  
Maxim D.

> **[nginx: donation](http://nginx.org/en/donation.html)**

---

<div class="post-metadata">

**Author:** ![Daniel\_Griscom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/858c86/32.png) [@Daniel\_Griscom](https://www.ruby-forum.com/u/Daniel_Griscom)\
**Post date:** [May 11, 2013, 5:01pm UTC](https://www.ruby-forum.com/t/proxying-based-on-protocol-e-g-ws-wss/228805/5 "2013-05-11T17:01:26Z")

</div>

Hello!

On Fri, May 10, 2013 at 02:35:35PM -0400, Daniel Griscom wrote:

> … any other choices? Thoughts?

I would recommend using URI-based distinction instead (and  
location{} blocks as a result). This would be most natural  
solution from nginx point of view.

> > > > > –
> > > 
> > > [mailman.nginx.org archive](http://mailman.nginx.org/mailman/listinfo/nginx)
> 
> –  
> Daniel T. Griscom [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> Suitable Systems [http://www.suitable.com/](http://www.suitable.com/)  
> 1 Centre Street, Suite 204 (781) 665-0053  
> Wakefield, MA 01880-2400
> 
> * * *
> 
> nginx mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [mailman.nginx.org archive](http://mailman.nginx.org/mailman/listinfo/nginx)

–  
Maxim D.

> **[nginx: donation](http://nginx.org/en/donation.html)**

---

<div class="post-metadata">

**Author:** ![Daniel\_Griscom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/858c86/32.png) [@Daniel\_Griscom](https://www.ruby-forum.com/u/Daniel_Griscom)\
**Post date:** [May 10, 2013, 8:36pm UTC](https://www.ruby-forum.com/t/proxying-based-on-protocol-e-g-ws-wss/228805/6 "2013-05-10T20:36:16Z")

</div>

That’s great information, but now I need to figure out how to  
selectively proxy to my websocket backend when $http\_upgrade is  
“websocket”. I see the following choices:

1. Have nginx listen at port 80, and proxy all traffic to port XXXX  
if $http\_upgrade is “websocket”, or port YYYY if not. Then set up  
nginx to handle http traffic at port YYYY, and have my websocket  
backend handle websocket traffic at port XXXX.

2. Investigate the much-maligned “if” statement.

… any other choices? Thoughts?

Thanks,  
Dan

At 1:26 PM +0400 5/10/13, Maxim D. wrote:

> > > > website that also handles websocket connections. I have the
> > > > 
> > > > nginx mailing list
> 
> nginx mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [mailman.nginx.org archive](http://mailman.nginx.org/mailman/listinfo/nginx)

–  
Daniel T. Griscom [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Suitable Systems [http://www.suitable.com/](http://www.suitable.com/)  
1 Centre Street, Suite 204 (781) 665-0053  
Wakefield, MA 01880-2400

---

<div class="post-metadata">

**Author:** ![Daniel\_Griscom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/858c86/32.png) [@Daniel\_Griscom](https://www.ruby-forum.com/u/Daniel_Griscom)\
**Post date:** [May 11, 2013, 5:06pm UTC](https://www.ruby-forum.com/t/proxying-based-on-protocol-e-g-ws-wss/228805/7 "2013-05-11T17:06:06Z")

</div>

Thanks. I’ve been coming to that conclusion myself.

Take care,  
Dan

At 7:00 PM +0400 5/11/13, Maxim D. wrote:

> > nginx to handle http traffic at port YYYY, and have my websocket
> 
> > > > > > –
> > > > 
> > > > [mailman.nginx.org archive](http://mailman.nginx.org/mailman/listinfo/nginx)
> 
> –  
> Maxim D.  
> [nginx: donation](http://nginx.org/en/donation.html)
> 
> * * *
> 
> nginx mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [mailman.nginx.org archive](http://mailman.nginx.org/mailman/listinfo/nginx)

–  
Daniel T. Griscom [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Suitable Systems [http://www.suitable.com/](http://www.suitable.com/)  
1 Centre Street, Suite 204 (781) 665-0053  
Wakefield, MA 01880-2400
