Created
May 23, 2013 16:57
-
-
Save diyan/5637600 to your computer and use it in GitHub Desktop.
Helper script for host circus-web app behind Nginx reverse proxy with prefixed path.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ReverseProxied(object): | |
'''Wrap the application in this middleware and configure the | |
front-end server to add these headers, to let you quietly bind | |
this to a URL other than / and to an HTTP scheme that is | |
different than what is used locally. | |
In nginx: | |
location /myprefix { | |
proxy_pass http://192.168.0.1:5001; | |
proxy_set_header Host $host; | |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |
proxy_set_header X-Scheme $scheme; | |
proxy_set_header X-Script-Name /myprefix; | |
} | |
:param app: the WSGI application | |
''' | |
def __init__(self, app): | |
self.app = app | |
def __call__(self, environ, start_response): | |
script_name = environ.get('HTTP_X_SCRIPT_NAME', '') | |
if script_name: | |
environ['SCRIPT_NAME'] = script_name | |
path_info = environ['PATH_INFO'] | |
if path_info.startswith(script_name): | |
environ['PATH_INFO'] = path_info[len(script_name):] | |
scheme = environ.get('HTTP_X_SCHEME', '') | |
if scheme: | |
environ['wsgi.url_scheme'] = scheme | |
return self.app(environ, start_response) | |
from circusweb import circushttpd | |
circus_beaker_app = circushttpd.app | |
circushttpd.app = ReverseProxied(circus_beaker_app) | |
if __name__ == '__main__': | |
try: | |
circushttpd.main() | |
except KeyboardInterrupt: | |
pass |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment