"use strict";(self.webpackChunkdocs_v_2=self.webpackChunkdocs_v_2||[]).push([[491],{15680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var i=t(96540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,i)}return t}function a(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?o(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,i,r=function(e,n){if(null==e)return{};var t,i,r={},o=Object.keys(e);for(i=0;i<o.length;i++)t=o[i],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i<o.length;i++)t=o[i],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=i.createContext({}),d=function(e){var n=i.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=d(e.components);return i.createElement(s.Provider,{value:n},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return i.createElement(i.Fragment,{},n)}},g=i.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=d(t),g=r,m=u["".concat(s,".").concat(g)]||u[g]||c[g]||o;return t?i.createElement(m,a(a({ref:n},p),{},{components:t})):i.createElement(m,a({ref:n},p))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,a=new Array(o);a[0]=g;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[u]="string"==typeof e?e:r,a[1]=l;for(var d=2;d<o;d++)a[d]=t[d];return i.createElement.apply(null,a)}return i.createElement.apply(null,t)}g.displayName="MDXCreateElement"},54553:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var i=t(58168),r=(t(96540),t(15680));const o={title:"Additional Networking Settings",hide_title:!0,sidebar_position:5,version:1},a=void 0,l={unversionedId:"installation/networking-settings",id:"installation/networking-settings",title:"Additional Networking Settings",description:"Additional Networking Settings",source:"@site/docs/installation/networking-settings.mdx",sourceDirName:"installation",slug:"/installation/networking-settings",permalink:"/docs/installation/networking-settings",draft:!1,editUrl:"https://github.com/apache/superset/edit/master/docs/docs/installation/networking-settings.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"Additional Networking Settings",hide_title:!0,sidebar_position:5,version:1},sidebar:"tutorialSidebar",previous:{title:"Configuring Superset",permalink:"/docs/installation/configuring-superset"},next:{title:"Caching",permalink:"/docs/installation/cache"}},s={},d=[{value:"Additional Networking Settings",id:"additional-networking-settings",level:2},{value:"CORS",id:"cors",level:3},{value:"Domain Sharding",id:"domain-sharding",level:3},{value:"Middleware",id:"middleware",level:3}],p={toc:d},u="wrapper";function c(e){let{components:n,...t}=e;return(0,r.yg)(u,(0,i.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"additional-networking-settings"},"Additional Networking Settings"),(0,r.yg)("h3",{id:"cors"},"CORS"),(0,r.yg)("p",null,"To configure CORS, or cross-origin resource sharing, the following dependency must be installed:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-python"},"pip install apache-superset[cors]\n")),(0,r.yg)("p",null,"The following keys in ",(0,r.yg)("inlineCode",{parentName:"p"},"superset_config.py")," can be specified to configure CORS:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"ENABLE_CORS"),": Must be set to ",(0,r.yg)("inlineCode",{parentName:"li"},"True")," in order to enable CORS"),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"CORS_OPTIONS"),": options passed to Flask-CORS\n(",(0,r.yg)("a",{parentName:"li",href:"https://flask-cors.corydolphin.com/en/latest/api.html#extension"},"documentation"),")")),(0,r.yg)("h3",{id:"domain-sharding"},"Domain Sharding"),(0,r.yg)("p",null,"Chrome allows up to 6 open connections per domain at a time. When there are more than 6 slices in\ndashboard, a lot of time fetch requests are queued up and wait for next available socket.\n",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/superset/pull/5039"},"PR 5039")," adds domain sharding to Superset,\nand this feature will be enabled by configuration only (by default Superset doesn\u2019t allow\ncross-domain request)."),(0,r.yg)("p",null,"Add the following setting in your ",(0,r.yg)("inlineCode",{parentName:"p"},"superset_config.py")," file:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"SUPERSET_WEBSERVER_DOMAINS"),": list of allowed hostnames for domain sharding feature.")),(0,r.yg)("p",null,"Please create your domain shards as subdomains of your main domain for authorization to\nwork properly on new domains. For Example:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"SUPERSET_WEBSERVER_DOMAINS=['superset-1.mydomain.com','superset-2.mydomain.com','superset-3.mydomain.com','superset-4.mydomain.com']"))),(0,r.yg)("p",null,"or add the following setting in your ",(0,r.yg)("inlineCode",{parentName:"p"},"superset_config.py")," file if domain shards are not subdomains of main domain."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"SESSION_COOKIE_DOMAIN = '.mydomain.com'"))),(0,r.yg)("h3",{id:"middleware"},"Middleware"),(0,r.yg)("p",null,"Superset allows you to add your own middleware. To add your own middleware, update the\n",(0,r.yg)("inlineCode",{parentName:"p"},"ADDITIONAL_MIDDLEWARE")," key in your ",(0,r.yg)("inlineCode",{parentName:"p"},"superset_config.py"),". ",(0,r.yg)("inlineCode",{parentName:"p"},"ADDITIONAL_MIDDLEWARE")," should be a list\nof your additional middleware classes."),(0,r.yg)("p",null,"For example, to use ",(0,r.yg)("inlineCode",{parentName:"p"},"AUTH_REMOTE_USER")," from behind a proxy server like nginx, you have to add a\nsimple middleware class to add the value of ",(0,r.yg)("inlineCode",{parentName:"p"},"HTTP_X_PROXY_REMOTE_USER")," (or any other custom header\nfrom the proxy) to Gunicorn\u2019s ",(0,r.yg)("inlineCode",{parentName:"p"},"REMOTE_USER")," environment variable:"))}c.isMDXComponent=!0}}]);