From 78992968ecd0de1f95b99352b53ea2ecd246f954 Mon Sep 17 00:00:00 2001 From: Nate Coraor Date: Thu, 11 Jan 2018 16:40:05 -0500 Subject: [PATCH] Correct documentation line endings --- doc/source/admin/apache.md | 820 ++++++++++++++++---------------- doc/source/admin/nginx.md | 926 ++++++++++++++++++------------------- 2 files changed, 873 insertions(+), 873 deletions(-) diff --git a/doc/source/admin/apache.md b/doc/source/admin/apache.md index 50b7faf3c53..07119971409 100644 --- a/doc/source/admin/apache.md +++ b/doc/source/admin/apache.md @@ -1,410 +1,410 @@ -# Proxying Galaxy with Apache - -For various reasons (performance, authentication, etc.) in a production environment, it's recommended to run Galaxy -behind a web server proxy. Although any proxy could work, Apache is a common choice. Alternatively, we use -[nginx](http://nginx.net/) for our public sites and open source infrastructure, and [details are -available](nginx.html) for it, too. - -Currently, the only recommended way to run Galaxy with Apache is using `mod_rewrite`, `mod_proxy`, and -`mod_proxy_uwsgi`. These modules must be enabled in the Apache config. The main proxy directives, `ProxyRequests` and -`ProxyVia` do **not** need to be enabled. - -## Prerequisites - -Make sure that inbound (and outbound) traffic to the TCP protocol HTTP on port 80 (and HTTPS on port 443 if using SSL) -is permitted by your server's firewall/security. - -These directions are written for Apache 2.4+. Apache 2.4 for Enterprise Linux (EL) 6 can be obtained from the [CentOS -SCLo SIG Repo](https://wiki.centos.org/SpecialInterestGroup/SCLo/CollectionsList). - -Ensure that the `mod_headers`, `mod_rewrite`, `mod_proxy`, and `mod_proxy_uwsgi` modules are loaded. Although not -required, the configuration examples also use `mod_deflate` and `mod_expires` for increased client/server performance, -so these should also be enabled. On Debian-based Linux distributions, you can do this with: - -```shell-session -# apt-get install apache2 libapache2-mod-proxy-uwsgi -# a2enmod headers deflate expires rewrite proxy proxy_uwsgi -Enabling module headers. -Considering dependency filter for deflate: -Module filter already enabled -Module deflate already enabled -Enabling module expires. -Enabling module rewrite. -Enabling module proxy. -Considering dependency proxy for proxy_uwsgi: -Module proxy already enabled -Enabling module proxy_uwsgi. -To activate the new configuration, you need to run: - service apache2 restart -``` - -On EL-based distributions, you will need to enable the [EPEL](https://fedoraproject.org/wiki/EPEL) repository and then: - -```shell-session -# yum install httpd mod_proxy_uwsgi -# echo "LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so" > /etc/httpd/conf.modules.d/10-proxy-uwsgi.conf -``` - -For the purposes of this example, we assume that: - -- the Galaxy server is installed at `/srv/galaxy/server` -- Apache runs as the user `www-data` (this is the default under Debian-based Linux distributions) -- Galaxy runs as the user `galaxy` with primary group `galaxy` -- Galaxy is served from the hostname `galaxy.example.org` - -Throughout the configuration examples in this document, in order to avoid reptition, `#...` is used to denote a location -where existing or previously given configuration statements would appear. - -```eval_rst -.. warning:: Please note that Galaxy should *never* be located on disk inside Apache's `DocumentRoot`. By default, this - would expose all of Galaxy (including datasets) to anyone on the web. -``` - -## Basic configuration - -The use of SSL is **strongly encouraged** to avoid exposure of confidential information such as datasets and user -credentials to eavesdroppers. The instructions in this document are for setting an SSL-enabled Galaxy server. - -When setting up an SSL server, simply enabling SSL with the default options is not enough. In most cases, the -configuration is weak and vulnerable to one or more of the multitude of SSL attacks that have been recently prevalent. -The [Qualys SSL/TLS Deployment Best Practices](https://www.ssllabs.com/projects/best-practices/) is an excellent and -up-to-date guide covering everything necessary for securing an SSL server. In addition, the [Mozilla SSL Configuration -Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/) can provide you with a best practices config -tailored to your desired security level and software versions. - -Finally, Google's [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) tool is helpful for -determining how you can improve responsiveness as related to proxying, such as verifying that caching and compression -are configured properly. - -If you need to run more than one site on your Galaxy server, there are two options: - -- Run them on the same server but serve them on different hostnames -- Serve them from different URL prefixes on a single hostname - -The former option is typically cleaner, but if serving more than one SSL site, you will need an SSL certificate with -[subjectAltName](http://wiki.cacert.org/FAQ/subjectAltName)s for each hostname served by the server. - -### Serving Galaxy at the Web Server Root - -This configuration assumes that Galaxy will be the only site on your server using the given hostname (e.g. -`https://galaxy.example.org`). - -Beginning with Galaxy Release 18.01, the default application server that Galaxy runs under is uWSGI. Because of this, -the native high performance uWSGI protocol should be used for communication between the proxy server and Galaxy, rather -than HTTP. Legacy instructions for proxying via HTTP can be found in the [Galaxy Release 17.09 Apache -documentation](https://docs.galaxyproject.org/en/release_17.09/admin/special_topics/apache.html). - -Since Apache is more efficient than uWSGI at serving static content, it is best to serve it directly, reducing the load -on the Galaxy process and allowing for more effective compression (if enabled), caching, and pipelining. Directives to -do so are included in the example below. - -The following configuration is not exhaustive, only the portions most relevant to serving Galaxy are shown, these should -be incorporated with your existing/default Apache config as is appropriate for your server: - -```apache -SSLProtocol all -SSLv3 -SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256 -SSLHonorCipherOrder on -SSLCompression off -SSLSessionTickets off - -# OCSP stapling -SSLUseStapling on -SSLStaplingResponderTimeout 5 -SSLStaplingReturnResponderErrors off -SSLStaplingCache shmcb:/var/run/ocsp(128000) - - - Redirect permanent / https://galaxy.example.org - - - - SSLEngine on - SSLCertificateFile /etc/apache2/ssl/server.crt - SSLCertificateKeyFile /etc/apache2/ssl/server.key - - # Enable HSTS - Header always set Strict-Transport-Security "max-age=15552000; includeSubdomains" - - # use a variable for convenience - Define galaxy_root /srv/galaxy/server - - # don't decode encoded slashes in path info - AllowEncodedSlashes NoDecode - - # enable compression on all relevant types - AddOutputFilterByType DEFLATE text/html text/plain text/xml - AddOutputFilterByType DEFLATE text/css - AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript - AddOutputFilterByType DEFLATE application/rss+xml - AddOutputFilterByType DEFLATE application/xml - AddOutputFilterByType DEFLATE application/json - - # allow access to static content - - AllowOverride None - Require all granted - - - # Galaxy needs to know that this is https for generating URLs - RequestHeader set X-URL-SCHEME "%{REQUEST_SCHEME}e" - - # allow up to 3 minutes for Galaxy to respond to slow requests before timing out - ProxyTimeout 180 - - # proxy all requests not matching other locations to uWSGI - ProxyPass / unix:///srv/galaxy/var/uwsgi.sock|uwsgi:// - # or uWSGI on a TCP socket - #ProxyPass / uwsgi://127.0.0.1:4001/ - - # serve framework static content - RewriteEngine On - RewriteRule ^/static/style/(.*) ${galaxy_root}/static/style/blue/$1 [L] - RewriteRule ^/static/(.*) ${galaxy_root}/static/$1 [L] - RewriteRule ^/favicon.ico ${galaxy_root}/static/favicon.ico [L] - RewriteRule ^/robots.txt ${galaxy_root}/static/robots.txt [L] - - # enable caching on static content - - ExpiresActive On - ExpiresDefault "access plus 24 hours" - - - # serve visualization and interactive environment plugin static content - - AllowOverride None - Require all granted - - RewriteRule ^/plugins/(.+)/(.+)/static/(.*)$ ${galaxy_root}/config/plugins/$1/$2/static/$3 [L] - -``` - -Be sure to set `galaxy_root` to the path to your copy of Galaxy and modify the value of `ProxyPass /` to match your -uWSGI socket path. With the default configuration, uWSGI will bind to a random TCP socket, so you will need to set it to -a fixed value as described in the [Scaling and Load Balancing](scaling.html) documentation. If using a UNIX domain -socket, be sure to pay particular attention to the discussion of users and permissions. - -### Implementation-specific Notes - -It is possible to perform the entire configuration in the main Apache configuration file, however, Apache packages as -provided by Linux distribution package managers typically provide a slightly more complex layout that is designed to -prevent conflicts in the main Apahce config file when updating the package. - -On Debian-based Linux distributions (Debian, Ubuntu, etc.), the Apache package's default configuration in -`/etc/apache2/apache2.conf` contains two include directives: - -- One which includes any configuration files with the `.conf` extension in the `/etc/apache2/conf-enabled` directory, - which contains symlinks to `/etc/apache2/confs-available`, where you would place global (non-VirtualHost) - configuration directives. -- One which includes all files in the `/etc/apache2/sites-enabled` directory, which contains symlinks to - `/etc/apache2/sites-available`, where you would place the `` configurations for websites hosted by this - Apache server. - -On EL-based Linux distributions (RedHat Enterprise Linux, CentOS, etc.), the Apache package's default configuration in -`/etc/httpd/conf/httpd.conf` contains a directive in that includes any configuration files with the `.conf` extension in -the `/etc/httpd/conf.d` directory. - -Thus, you might create: - -- `/etc/httpd/conf.d/galaxy_options.conf` on Debian-based distributions -- `/etc/apache2/confs-available/galaxy.conf` on Debian-based distributions - -With the global configuration directives: - -```apache -SSLProtocol all -SSLv3 -SSLCipherSuite ... -#... -``` - -Then for the site configurations, you might create: - -- `/etc/httpd/conf.d/galaxy_site.conf` on EL-based distributions -- `/etc/apache2/sites-available/galaxy` on Debian-based distributions - -With the `` blocks: - -```apache - - Redirect permanent / https://galaxy.example.org - - - - SSLEngine on - SSLCertificateFile /etc/apache2/ssl/server.crt - SSLCertificateKeyFile /etc/apache2/ssl/server.key - #... - -``` - -On Debian-based distribution, you'd then need to symlink the configs with (or do it by hand with `ln -s`): - -```shell-session -# a2enconf galaxy -# a2ensite galaxy -``` - -### Additional Notes - -- **Do not** simply copy the SSL configuration directives and expect them to work on your server or to be secure! These - are provided as examples of some of the best practices as of the time of writing, but will not always be up to date. - Use the guides referenced in [basic configuration](#basic-configuration) section to configure SSL properly. -- If your existing Apache configuration contains a line or included config file defining a default server, be sure to - disable it by commenting its `` or preventing its inclusion (under Debian-based operating systems, this - is done by removing its symlink from `/etc/apache2/sites-enabled`. -- `ProxyTimeout` can be adjusted as appropriate for your site. This is the amount of time allowed for communication - between Apache and uWSGI to block while waiting for a response from Galaxy, and is useful for holding client (browser) - connections while uWSGI is restarting Galaxy subprocesses or Galaxy is performing a slow operation. -- If your Apache server is set up to use `mod_security`, you may need to modify the value of the `SecRequestBodyLimit`. - The default value on some systems will limit uploads to only a few kilobytes. -- Some Galaxy URLs contain encoded slashes (%2F) in the path and Apache will not serve these URLs by default, which is - the reason for inclusion of the `AllowEncodedSlashes` directive. Note: The `NoDecode` value was added in Apache2 - 2.2.18, which is newer than EL 6's provided 2.2.15. -- If you must serve Galaxy without SSL, you would simply replace the `443` with `80` in the SSL `VirtualHost` block - and remove the non-SSL block and all SSL directives. -- If the proxy works but you are getting 404 errors for Galaxy's static content, be sure that the user that Apache runs - as has access to Galaxy's `static/` directory (and all its parent directories) on the filesystem. You can test this on - the command line with e.g. `sudo -u www-data ls /srv/galaxy/server/static`. - -### Serving Galaxy at a URL Prefix - -It may be necessary to serve Galaxy from an address other than the web server root (`https://www.example.org/galaxy`), -instead of `https://galaxy.example.org`). To do this, you need to make the following changes to the configuration in the -previous section: - -1. In the Apache config, prefix all of the location directives with your prefix, like so: - - ```apache - #... - - # proxy all requests not matching other locations to uWSGI - ProxyPass /galaxy unix:///srv/galaxy/var/uwsgi.sock|uwsgi:// - # or uWSGI on a TCP socket - #ProxyPass /galaxy uwsgi://127.0.0.1:4001/ - - # serve framework static content - RewriteEngine On - RewriteRule ^/galaxy/$ /galaxy [R,L] - RewriteRule ^/galaxy/static/style/(.*) ${galaxy_root}/static/style/blue/$1 [L] - RewriteRule ^/galaxy/static/(.*) ${galaxy_root}/static/$1 [L] - RewriteRule ^/galaxy/favicon.ico ${galaxy_root}/static/favicon.ico [L] - RewriteRule ^/galaxy/robots.txt ${galaxy_root}/static/robots.txt [L] - ``` - -2. The Galaxy application needs to be aware that it is running with a prefix (for generating URLs in dynamic pages). - This is accomplished by configuring uWSGI and Galaxy (the `uwsgi` and `galaxy` sections in `config/galaxy.yml` - respectively) like so and restarting Galaxy: - - ```yaml - uwsgi: - #... - socket: unix:///srv/galaxy/var/uwsgi.sock - mount: /galaxy=galaxy.webapps.galaxy.buildapp:uwsgi_app() - manage-script-name: true - # `module` MUST NOT be set when `mount` is in use - #module: galaxy.webapps.galaxy.buildapp:uwsgi_app() - - galaxy: - #... - cookie_path: /galaxy - ``` - - `cookie_path` should be set to prevent Galaxy's session cookies from clobbering each other if you are running more - than one instance of Galaxy under different URL prefixes on the same hostname. - - Be sure to consult the [Scaling and Load Balancing](scaling.html) documentation, other options unrelated to proxying - should also be set in the `uwsgi` section of the config. - -## Advanced Configuration Topics - -### Sending Files With Apache - -Galaxy sends files (e.g. dataset downloads) by opening the file and streaming it in chunks through the proxy server. -However, this ties up the Galaxy process, which can impact the performance of other operations (see [Production Server -Configuration](production.html) for a more in-depth explanation). - -Apache can assume this task instead and as an added benefit, speed up downloads. This is accomplished through the use of -`mod_xsendfile`, a 3rd-party Apache module. Dataset security is maintained in this configuration because Apache will -still check with Galaxy to ensure that the requesting user has permission to access the dataset before sending it. - -To enable it, you must first install `mod_xsendfile`. This is usually available via your package manager -(`libapache2-mod-xsendfile` on Debian-based distributions and `mod_xsendfile` from EPEL on EL-based distributions). Once -installed, add the appropriate `LoadModule` directive to your Apache configuration (`LoadModule xsendfile_module -/path/to/mod_xsendfile.so`, but both the Debian and EPEL packages do this for you upon installation). - -The, add `XSendFile` directives to your proxy configuration: - -```apache - - XSendFile on - XSendFilePath / - -``` - -Next, edit `galaxy.yml` and make the following change before restarting Galaxy: - -```yaml -galaxy: - # ... - apache_xsendfile: true -``` - -For this to work, the user under which your Apache server runs will need read access to Galaxy's `files_path` directory -(by default, `database/files/`) and its contents. This is most easily done by adding the Apache user to the Galaxy user's -primary group and setting the `umask(2)` to create files with the group read permission set. If you start Galaxy from -the command line, you can do this like so: - -```shell-session -admin@server$ sudo usermod -a -G galaxy www-data # add `www-data` user to `galaxy` group -admin@server$ sudo -iu galaxy -galaxy@server$ umask 027 -galaxy@server$ sh run.sh -``` - -If you start Galaxy from supervisord, you can set the `umask` option in the [program -section](http://supervisord.org/configuration.html#program-x-section-settings) after adding the Apache user to the Galaxy -group as shown above. - -### External user authentication - -- [Apache for External Authentication](https://galaxyproject.org/admin/config/apache-external-user-auth/) -- [Built-in Galaxy External Authentication](authentication.html) - -#### Display Sites - -Display sites such as UCSC work not by sending data directly from Galaxy to UCSC via the client's browser, but by -sending UCSC a URL to the data in Galaxy that the UCSC server will retrieve data from. Since enabling authentication -will place **all** of Galaxy behind authentication, such display sites will no longer be able to access data via that -URL. If `display_servers` is set to a non-empty value in `$galaxy_root/config/galaxy.yml`, this tells Galaxy it should -allow the named servers access to data in Galaxy. However, you still need to configure Apache to allow access to the -datasets. An example config is provided here that allows the UCSC Main/Test backends: - -```apache - - Satisfy Any - Order deny,allow - Deny from all - Allow from hgw1.cse.ucsc.edu - Allow from hgw2.cse.ucsc.edu - Allow from hgw3.cse.ucsc.edu - Allow from hgw4.cse.ucsc.edu - Allow from hgw5.cse.ucsc.edu - Allow from hgw6.cse.ucsc.edu - Allow from hgw7.cse.ucsc.edu - Allow from hgw8.cse.ucsc.edu - -``` - -**PLEASE NOTE that this introduces a security hole** , the impact of which depends on whether you have restricted access -to the dataset via Galaxy's [internal dataset permissions](https://galaxyproject.org/learn/security-features/). - -- By default, data in Galaxy is public. Normally with a Galaxy server behind authentication in a proxy server this is of - little concern since only clients who've authenticated can access Galaxy. However, if display site exceptions are made - as shown above, anyone could use those public sites to bypass authentication and view any **public** dataset on your - Galaxy server. If you have not changed from the default and most of your datasets are public, you should consider - running your own display sites that are also behind authentication rather than using the public ones. - -- For datasets for which access has been restricted to one or more roles (i.e. it is no longer "public"), access for - reading via external browsers is only allowed for a brief period, when someone with access permission clicks the - "display at..." link. During this period, anyone who has the dataset ID would then be able to use the browser to view - this dataset. Although such a scenario is unlikely, it is technically possible. +# Proxying Galaxy with Apache + +For various reasons (performance, authentication, etc.) in a production environment, it's recommended to run Galaxy +behind a web server proxy. Although any proxy could work, Apache is a common choice. Alternatively, we use +[nginx](http://nginx.net/) for our public sites and open source infrastructure, and [details are +available](nginx.html) for it, too. + +Currently, the only recommended way to run Galaxy with Apache is using `mod_rewrite`, `mod_proxy`, and +`mod_proxy_uwsgi`. These modules must be enabled in the Apache config. The main proxy directives, `ProxyRequests` and +`ProxyVia` do **not** need to be enabled. + +## Prerequisites + +Make sure that inbound (and outbound) traffic to the TCP protocol HTTP on port 80 (and HTTPS on port 443 if using SSL) +is permitted by your server's firewall/security. + +These directions are written for Apache 2.4+. Apache 2.4 for Enterprise Linux (EL) 6 can be obtained from the [CentOS +SCLo SIG Repo](https://wiki.centos.org/SpecialInterestGroup/SCLo/CollectionsList). + +Ensure that the `mod_headers`, `mod_rewrite`, `mod_proxy`, and `mod_proxy_uwsgi` modules are loaded. Although not +required, the configuration examples also use `mod_deflate` and `mod_expires` for increased client/server performance, +so these should also be enabled. On Debian-based Linux distributions, you can do this with: + +```shell-session +# apt-get install apache2 libapache2-mod-proxy-uwsgi +# a2enmod headers deflate expires rewrite proxy proxy_uwsgi +Enabling module headers. +Considering dependency filter for deflate: +Module filter already enabled +Module deflate already enabled +Enabling module expires. +Enabling module rewrite. +Enabling module proxy. +Considering dependency proxy for proxy_uwsgi: +Module proxy already enabled +Enabling module proxy_uwsgi. +To activate the new configuration, you need to run: + service apache2 restart +``` + +On EL-based distributions, you will need to enable the [EPEL](https://fedoraproject.org/wiki/EPEL) repository and then: + +```shell-session +# yum install httpd mod_proxy_uwsgi +# echo "LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so" > /etc/httpd/conf.modules.d/10-proxy-uwsgi.conf +``` + +For the purposes of this example, we assume that: + +- the Galaxy server is installed at `/srv/galaxy/server` +- Apache runs as the user `www-data` (this is the default under Debian-based Linux distributions) +- Galaxy runs as the user `galaxy` with primary group `galaxy` +- Galaxy is served from the hostname `galaxy.example.org` + +Throughout the configuration examples in this document, in order to avoid reptition, `#...` is used to denote a location +where existing or previously given configuration statements would appear. + +```eval_rst +.. warning:: Please note that Galaxy should *never* be located on disk inside Apache's `DocumentRoot`. By default, this + would expose all of Galaxy (including datasets) to anyone on the web. +``` + +## Basic configuration + +The use of SSL is **strongly encouraged** to avoid exposure of confidential information such as datasets and user +credentials to eavesdroppers. The instructions in this document are for setting an SSL-enabled Galaxy server. + +When setting up an SSL server, simply enabling SSL with the default options is not enough. In most cases, the +configuration is weak and vulnerable to one or more of the multitude of SSL attacks that have been recently prevalent. +The [Qualys SSL/TLS Deployment Best Practices](https://www.ssllabs.com/projects/best-practices/) is an excellent and +up-to-date guide covering everything necessary for securing an SSL server. In addition, the [Mozilla SSL Configuration +Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/) can provide you with a best practices config +tailored to your desired security level and software versions. + +Finally, Google's [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) tool is helpful for +determining how you can improve responsiveness as related to proxying, such as verifying that caching and compression +are configured properly. + +If you need to run more than one site on your Galaxy server, there are two options: + +- Run them on the same server but serve them on different hostnames +- Serve them from different URL prefixes on a single hostname + +The former option is typically cleaner, but if serving more than one SSL site, you will need an SSL certificate with +[subjectAltName](http://wiki.cacert.org/FAQ/subjectAltName)s for each hostname served by the server. + +### Serving Galaxy at the Web Server Root + +This configuration assumes that Galaxy will be the only site on your server using the given hostname (e.g. +`https://galaxy.example.org`). + +Beginning with Galaxy Release 18.01, the default application server that Galaxy runs under is uWSGI. Because of this, +the native high performance uWSGI protocol should be used for communication between the proxy server and Galaxy, rather +than HTTP. Legacy instructions for proxying via HTTP can be found in the [Galaxy Release 17.09 Apache +documentation](https://docs.galaxyproject.org/en/release_17.09/admin/special_topics/apache.html). + +Since Apache is more efficient than uWSGI at serving static content, it is best to serve it directly, reducing the load +on the Galaxy process and allowing for more effective compression (if enabled), caching, and pipelining. Directives to +do so are included in the example below. + +The following configuration is not exhaustive, only the portions most relevant to serving Galaxy are shown, these should +be incorporated with your existing/default Apache config as is appropriate for your server: + +```apache +SSLProtocol all -SSLv3 +SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256 +SSLHonorCipherOrder on +SSLCompression off +SSLSessionTickets off + +# OCSP stapling +SSLUseStapling on +SSLStaplingResponderTimeout 5 +SSLStaplingReturnResponderErrors off +SSLStaplingCache shmcb:/var/run/ocsp(128000) + + + Redirect permanent / https://galaxy.example.org + + + + SSLEngine on + SSLCertificateFile /etc/apache2/ssl/server.crt + SSLCertificateKeyFile /etc/apache2/ssl/server.key + + # Enable HSTS + Header always set Strict-Transport-Security "max-age=15552000; includeSubdomains" + + # use a variable for convenience + Define galaxy_root /srv/galaxy/server + + # don't decode encoded slashes in path info + AllowEncodedSlashes NoDecode + + # enable compression on all relevant types + AddOutputFilterByType DEFLATE text/html text/plain text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/json + + # allow access to static content + + AllowOverride None + Require all granted + + + # Galaxy needs to know that this is https for generating URLs + RequestHeader set X-URL-SCHEME "%{REQUEST_SCHEME}e" + + # allow up to 3 minutes for Galaxy to respond to slow requests before timing out + ProxyTimeout 180 + + # proxy all requests not matching other locations to uWSGI + ProxyPass / unix:///srv/galaxy/var/uwsgi.sock|uwsgi:// + # or uWSGI on a TCP socket + #ProxyPass / uwsgi://127.0.0.1:4001/ + + # serve framework static content + RewriteEngine On + RewriteRule ^/static/style/(.*) ${galaxy_root}/static/style/blue/$1 [L] + RewriteRule ^/static/(.*) ${galaxy_root}/static/$1 [L] + RewriteRule ^/favicon.ico ${galaxy_root}/static/favicon.ico [L] + RewriteRule ^/robots.txt ${galaxy_root}/static/robots.txt [L] + + # enable caching on static content + + ExpiresActive On + ExpiresDefault "access plus 24 hours" + + + # serve visualization and interactive environment plugin static content + + AllowOverride None + Require all granted + + RewriteRule ^/plugins/(.+)/(.+)/static/(.*)$ ${galaxy_root}/config/plugins/$1/$2/static/$3 [L] + +``` + +Be sure to set `galaxy_root` to the path to your copy of Galaxy and modify the value of `ProxyPass /` to match your +uWSGI socket path. With the default configuration, uWSGI will bind to a random TCP socket, so you will need to set it to +a fixed value as described in the [Scaling and Load Balancing](scaling.html) documentation. If using a UNIX domain +socket, be sure to pay particular attention to the discussion of users and permissions. + +### Implementation-specific Notes + +It is possible to perform the entire configuration in the main Apache configuration file, however, Apache packages as +provided by Linux distribution package managers typically provide a slightly more complex layout that is designed to +prevent conflicts in the main Apahce config file when updating the package. + +On Debian-based Linux distributions (Debian, Ubuntu, etc.), the Apache package's default configuration in +`/etc/apache2/apache2.conf` contains two include directives: + +- One which includes any configuration files with the `.conf` extension in the `/etc/apache2/conf-enabled` directory, + which contains symlinks to `/etc/apache2/confs-available`, where you would place global (non-VirtualHost) + configuration directives. +- One which includes all files in the `/etc/apache2/sites-enabled` directory, which contains symlinks to + `/etc/apache2/sites-available`, where you would place the `` configurations for websites hosted by this + Apache server. + +On EL-based Linux distributions (RedHat Enterprise Linux, CentOS, etc.), the Apache package's default configuration in +`/etc/httpd/conf/httpd.conf` contains a directive in that includes any configuration files with the `.conf` extension in +the `/etc/httpd/conf.d` directory. + +Thus, you might create: + +- `/etc/httpd/conf.d/galaxy_options.conf` on Debian-based distributions +- `/etc/apache2/confs-available/galaxy.conf` on Debian-based distributions + +With the global configuration directives: + +```apache +SSLProtocol all -SSLv3 +SSLCipherSuite ... +#... +``` + +Then for the site configurations, you might create: + +- `/etc/httpd/conf.d/galaxy_site.conf` on EL-based distributions +- `/etc/apache2/sites-available/galaxy` on Debian-based distributions + +With the `` blocks: + +```apache + + Redirect permanent / https://galaxy.example.org + + + + SSLEngine on + SSLCertificateFile /etc/apache2/ssl/server.crt + SSLCertificateKeyFile /etc/apache2/ssl/server.key + #... + +``` + +On Debian-based distribution, you'd then need to symlink the configs with (or do it by hand with `ln -s`): + +```shell-session +# a2enconf galaxy +# a2ensite galaxy +``` + +### Additional Notes + +- **Do not** simply copy the SSL configuration directives and expect them to work on your server or to be secure! These + are provided as examples of some of the best practices as of the time of writing, but will not always be up to date. + Use the guides referenced in [basic configuration](#basic-configuration) section to configure SSL properly. +- If your existing Apache configuration contains a line or included config file defining a default server, be sure to + disable it by commenting its `` or preventing its inclusion (under Debian-based operating systems, this + is done by removing its symlink from `/etc/apache2/sites-enabled`. +- `ProxyTimeout` can be adjusted as appropriate for your site. This is the amount of time allowed for communication + between Apache and uWSGI to block while waiting for a response from Galaxy, and is useful for holding client (browser) + connections while uWSGI is restarting Galaxy subprocesses or Galaxy is performing a slow operation. +- If your Apache server is set up to use `mod_security`, you may need to modify the value of the `SecRequestBodyLimit`. + The default value on some systems will limit uploads to only a few kilobytes. +- Some Galaxy URLs contain encoded slashes (%2F) in the path and Apache will not serve these URLs by default, which is + the reason for inclusion of the `AllowEncodedSlashes` directive. Note: The `NoDecode` value was added in Apache2 + 2.2.18, which is newer than EL 6's provided 2.2.15. +- If you must serve Galaxy without SSL, you would simply replace the `443` with `80` in the SSL `VirtualHost` block + and remove the non-SSL block and all SSL directives. +- If the proxy works but you are getting 404 errors for Galaxy's static content, be sure that the user that Apache runs + as has access to Galaxy's `static/` directory (and all its parent directories) on the filesystem. You can test this on + the command line with e.g. `sudo -u www-data ls /srv/galaxy/server/static`. + +### Serving Galaxy at a URL Prefix + +It may be necessary to serve Galaxy from an address other than the web server root (`https://www.example.org/galaxy`), +instead of `https://galaxy.example.org`). To do this, you need to make the following changes to the configuration in the +previous section: + +1. In the Apache config, prefix all of the location directives with your prefix, like so: + + ```apache + #... + + # proxy all requests not matching other locations to uWSGI + ProxyPass /galaxy unix:///srv/galaxy/var/uwsgi.sock|uwsgi:// + # or uWSGI on a TCP socket + #ProxyPass /galaxy uwsgi://127.0.0.1:4001/ + + # serve framework static content + RewriteEngine On + RewriteRule ^/galaxy/$ /galaxy [R,L] + RewriteRule ^/galaxy/static/style/(.*) ${galaxy_root}/static/style/blue/$1 [L] + RewriteRule ^/galaxy/static/(.*) ${galaxy_root}/static/$1 [L] + RewriteRule ^/galaxy/favicon.ico ${galaxy_root}/static/favicon.ico [L] + RewriteRule ^/galaxy/robots.txt ${galaxy_root}/static/robots.txt [L] + ``` + +2. The Galaxy application needs to be aware that it is running with a prefix (for generating URLs in dynamic pages). + This is accomplished by configuring uWSGI and Galaxy (the `uwsgi` and `galaxy` sections in `config/galaxy.yml` + respectively) like so and restarting Galaxy: + + ```yaml + uwsgi: + #... + socket: unix:///srv/galaxy/var/uwsgi.sock + mount: /galaxy=galaxy.webapps.galaxy.buildapp:uwsgi_app() + manage-script-name: true + # `module` MUST NOT be set when `mount` is in use + #module: galaxy.webapps.galaxy.buildapp:uwsgi_app() + + galaxy: + #... + cookie_path: /galaxy + ``` + + `cookie_path` should be set to prevent Galaxy's session cookies from clobbering each other if you are running more + than one instance of Galaxy under different URL prefixes on the same hostname. + + Be sure to consult the [Scaling and Load Balancing](scaling.html) documentation, other options unrelated to proxying + should also be set in the `uwsgi` section of the config. + +## Advanced Configuration Topics + +### Sending Files With Apache + +Galaxy sends files (e.g. dataset downloads) by opening the file and streaming it in chunks through the proxy server. +However, this ties up the Galaxy process, which can impact the performance of other operations (see [Production Server +Configuration](production.html) for a more in-depth explanation). + +Apache can assume this task instead and as an added benefit, speed up downloads. This is accomplished through the use of +`mod_xsendfile`, a 3rd-party Apache module. Dataset security is maintained in this configuration because Apache will +still check with Galaxy to ensure that the requesting user has permission to access the dataset before sending it. + +To enable it, you must first install `mod_xsendfile`. This is usually available via your package manager +(`libapache2-mod-xsendfile` on Debian-based distributions and `mod_xsendfile` from EPEL on EL-based distributions). Once +installed, add the appropriate `LoadModule` directive to your Apache configuration (`LoadModule xsendfile_module +/path/to/mod_xsendfile.so`, but both the Debian and EPEL packages do this for you upon installation). + +The, add `XSendFile` directives to your proxy configuration: + +```apache + + XSendFile on + XSendFilePath / + +``` + +Next, edit `galaxy.yml` and make the following change before restarting Galaxy: + +```yaml +galaxy: + # ... + apache_xsendfile: true +``` + +For this to work, the user under which your Apache server runs will need read access to Galaxy's `files_path` directory +(by default, `database/files/`) and its contents. This is most easily done by adding the Apache user to the Galaxy user's +primary group and setting the `umask(2)` to create files with the group read permission set. If you start Galaxy from +the command line, you can do this like so: + +```shell-session +admin@server$ sudo usermod -a -G galaxy www-data # add `www-data` user to `galaxy` group +admin@server$ sudo -iu galaxy +galaxy@server$ umask 027 +galaxy@server$ sh run.sh +``` + +If you start Galaxy from supervisord, you can set the `umask` option in the [program +section](http://supervisord.org/configuration.html#program-x-section-settings) after adding the Apache user to the Galaxy +group as shown above. + +### External user authentication + +- [Apache for External Authentication](https://galaxyproject.org/admin/config/apache-external-user-auth/) +- [Built-in Galaxy External Authentication](authentication.html) + +#### Display Sites + +Display sites such as UCSC work not by sending data directly from Galaxy to UCSC via the client's browser, but by +sending UCSC a URL to the data in Galaxy that the UCSC server will retrieve data from. Since enabling authentication +will place **all** of Galaxy behind authentication, such display sites will no longer be able to access data via that +URL. If `display_servers` is set to a non-empty value in `$galaxy_root/config/galaxy.yml`, this tells Galaxy it should +allow the named servers access to data in Galaxy. However, you still need to configure Apache to allow access to the +datasets. An example config is provided here that allows the UCSC Main/Test backends: + +```apache + + Satisfy Any + Order deny,allow + Deny from all + Allow from hgw1.cse.ucsc.edu + Allow from hgw2.cse.ucsc.edu + Allow from hgw3.cse.ucsc.edu + Allow from hgw4.cse.ucsc.edu + Allow from hgw5.cse.ucsc.edu + Allow from hgw6.cse.ucsc.edu + Allow from hgw7.cse.ucsc.edu + Allow from hgw8.cse.ucsc.edu + +``` + +**PLEASE NOTE that this introduces a security hole** , the impact of which depends on whether you have restricted access +to the dataset via Galaxy's [internal dataset permissions](https://galaxyproject.org/learn/security-features/). + +- By default, data in Galaxy is public. Normally with a Galaxy server behind authentication in a proxy server this is of + little concern since only clients who've authenticated can access Galaxy. However, if display site exceptions are made + as shown above, anyone could use those public sites to bypass authentication and view any **public** dataset on your + Galaxy server. If you have not changed from the default and most of your datasets are public, you should consider + running your own display sites that are also behind authentication rather than using the public ones. + +- For datasets for which access has been restricted to one or more roles (i.e. it is no longer "public"), access for + reading via external browsers is only allowed for a brief period, when someone with access permission clicks the + "display at..." link. During this period, anyone who has the dataset ID would then be able to use the browser to view + this dataset. Although such a scenario is unlikely, it is technically possible. diff --git a/doc/source/admin/nginx.md b/doc/source/admin/nginx.md index d93b7533b58..5d09afe9761 100644 --- a/doc/source/admin/nginx.md +++ b/doc/source/admin/nginx.md @@ -1,463 +1,463 @@ -# Proxying Galaxy with NGINX - -[NGINX](http://nginx.org/en/) is a lightweight http server designed with high performance proxying in mind. The public -Galaxy sites ([Main](https://galaxyproject.org/main/) and [Test](https://galaxyproject.org/test/)) as well as the -[Docker Galaxy project](https://github.com/bgruening/docker-galaxy-stable) use nginx to proxy rather than Apache for its -simple, fast load balancing and other features. - - -## Prerequisites - -Make sure that inbound (and outbound) traffic to the TCP protocol HTTP on port 80 (and HTTPS on port 443 if using SSL) -is permitted by your server's firewall/security. - -For the purposes of this example, we assume that: - -- the Galaxy server is installed at `/srv/galaxy/server` -- nginx runs as the user `www-data` (this is the default under Debian-based Linux distributions) -- Galaxy runs as the user `galaxy` with primary group `galaxy` -- Galaxy is served from the hostname `galaxy.example.org` - -Throughout the configuration examples in this document, in order to avoid reptition, `#...` is used to denote a location -where existing or previously given configuration statements would appear. - -```eval_rst -.. warning:: Please note that Galaxy should *never* be located on disk inside nginx's document root. By default, this - would expose all of Galaxy (including datasets) to anyone on the web. -``` - -## Basic Configuration - -The use of SSL is **strongly encouraged** to avoid exposure of confidential information such as datasets and user -credentials to eavesdroppers. The instructions in this document are for setting an SSL-enabled Galaxy server. - -When setting up an SSL server, simply enabling SSL with the default options is not enough. In most cases, the -configuration is weak and vulnerable to one or more of the multitude of SSL attacks that have been recently prevalent. -The [Qualys SSL/TLS Deployment Best Practices](https://www.ssllabs.com/projects/best-practices/) is an excellent and -up-to-date guide covering everything necessary for securing an SSL server. In addition, the [Mozilla SSL Configuration -Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/) can provide you with a best practices config -tailored to your desired security level and software versions. - -Finally, Google's [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) tool is helpful for -determining how you can improve responsiveness as related to proxying, such as verifying that caching and compression -are configured properly. - -If you need to run more than one site on your Galaxy server, there are two options: - -- Run them on the same server but serve them on different hostnames -- Serve them from different URL prefixes on a single hostname - -The former option is typically cleaner, but if serving more than one SSL site, you will need an SSL certificate with -[subjectAltName](http://wiki.cacert.org/FAQ/subjectAltName)s for each hostname served by the server. - -### Serving Galaxy at the Web Server Root - -This configuration assumes that Galaxy will be the only site on your server using the given hostname (e.g. -`https://galaxy.example.org`). - -Beginning with Galaxy Release 18.01, the default application server that Galaxy runs under is uWSGI. Because of this, -the native high performance uWSGI protocol should be used for communication between the proxy server and Galaxy, rather -than HTTP. Legacy instructions for proxying via HTTP can be found in the [Galaxy Release 17.09 nginx -documentation](https://docs.galaxyproject.org/en/release_17.09/admin/special_topics/nginx.html). - -uWSGI protocol support is built in to nginx, so (unlike Apache) no extra modules or recompiling should be required. - -Since nginx is more efficient than uWSGI at serving static content, it is best to serve it directly, reducing the load -on the Galaxy process and allowing for more effective compression (if enabled), caching, and pipelining. Directives to -do so are included in the example below. - -The following configuration is not exhaustive, only the portions most relevant to serving Galaxy are shown, these should -be incorporated with your existing/default nginx config as is appropriate for your server: - -```nginx -http { - - #... - - # compress responses whenever possible - gzip on; - gzip_http_version 1.1; - gzip_vary on; - gzip_comp_level 4; - gzip_proxied any; - gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; - gzip_comp_level 6; - gzip_buffers 16 8k; - - # allow up to 3 minutes for Galaxy to respond to slow requests before timing out - uwsgi_read_timeout 180; - - # maximum file upload size - client_max_body_size 10g; - - # allowable SSL protocols - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - - # use secure ciphers - ssl_ciphers - ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256; - ssl_dhparam /etc/nginx/ssl/dhparams.pem; - ssl_prefer_server_ciphers on; - - # enable session reuse - ssl_session_cache shared:SSL:8m; - ssl_session_timeout 5m; - - # cert/key - ssl_certificate /etc/nginx/ssl/server.crt; - ssl_certificate_key /etc/nginx/ssl/server.key; - - # OCSP stapling - ssl_stapling on; - ssl_stapling_verify on; - ssl_trusted_certificate /etc/nginx/ssl/ca.crt; - - - server { - listen 80 default_server; - listen [::]:80 default_server; - server_name _; - - return 301 https://$host$request_uri; - } - - server { - listen 443 default_server; - listen [::]:443 default_server; - server_name _; - - # use a variable for convenience - set $galaxy_root /srv/galaxy/server; - - # Enable HSTS - add_header Strict-Transport-Security "max-age=15552000; includeSubdomains"; - - # proxy all requests not matching other locations to uWSGI - location / { - uwsgi_pass unix:///srv/galaxy/var/uwsgi.sock - uwsgi_param UWSGI_SCHEME $scheme; - include uwsgi_params; - } - - # serve framework static content - location /static/style { - alias $galaxy_root/static/style/blue; - expires 24h; - } - location /static { - alias $galaxy_root/static; - expires 24h; - } - location /robots.txt { - alias $galaxy_root/static/robots.txt; - expires 24h; - } - location /favicon.ico { - alias $galaxy_root/static/favicon.ico; - expires 24h; - } - - # serve visualization and interactive environment plugin static content - location ~ ^/plugins/(?.+?)/(?.+?)/static/(?.*?)$ { - alias $galaxy_root/config/plugins/$plug_type/$vis_name/static/$static_file; - expires 24; - } - } -} -``` - -Be sure to set `$galaxy_root` to the path to your copy of Galaxy and modify the value of `uwsgi_pass` to match your -uWSGI socket path. With the default configuration, uWSGI will bind to a random TCP socket, so you will need to set it to -a fixed value as described in the [Scaling and Load Balancing](scaling.html) documentation. If using a UNIX domain -socket, be sure to pay particular attention to the discussion of users and permissions. - -### Implementation-specific Notes - -It is possible to perform the entire configuration in the main nginx configuration file (typically -`/etc/nginx/nginx.conf`), however, nginx packages as provided by Linux distribution package managers typically provide a -slightly more complex layout that is designed to prevent conflicts in `nginx.conf` when updating the package. - -On Debian-based Linux distributions (Debian, Ubuntu, etc.), the nginx package's default configuration contains two -include directives in the `http {}` block: - -- One which includes any configuration files with the `.conf` extension in the `/etc/nginx/conf.d` directory, where you - would place directives that belong in the `http {}` block. -- One which includes all files in the `/etc/nginx/sites-enabled` directory, which contains symlinks to - `/etc/nginx/sites-available`, where you would place the `server {}` configurations for websites hosted by this nginx - server. - -On EL-based Linux distributions (RedHat Enterprise Linux, CentOS, etc.), the EPEL nginx package's default configuration -contains a directive in the `http {}` block that includes any configuration files with the `.conf` extension in the -`/etc/nginx/conf.d` directory. - -Thus, on both Debian- and EL-based distributions, you might put the `http` directives in -`/etc/nginx/conf.d/galaxy_http_options.conf`. Note that these are **not** enclosed in an `http {}` block themselves, as -they are already enclosed by the `http {}` block in `/etc/nginx/nginx.conf`: - -```nginx -uwsgi_read_timeout 180; -client_max_body_size 10g; -ssl_certificate /etc/nginx/ssl/server.crt; -ssl_certificate_key /etc/nginx/ssl/server.key; -#... -``` - -Then for the site configurations, you might create: - -- `/etc/nginx/conf.d/galaxy_site.conf` on EL-based distributions -- `/etc/nginx/sites-available/galaxy` on Debian-based distributions - -With the `server {}` blocks (again, not enclosed in an `http {}`): - -```nginx -server { - listen 80 default_server; - listen [::]:80 default_server; - server_name _; - #... -} - -server { - listen 443 default_server; - listen [::]:443 default_server; - server_name _; - #... -} -``` - -On Debian-based distribution, you'd then need to symlink the config with: - -```shell-session -# ln -s /etc/nginx/sites-available/galaxy /etc/nginx/sites-enabled/galaxy -``` - -### Additional Notes - -- **Do not** simply copy the SSL configuration directives and expect them to work on your server or to be secure! These - are provided as examples of some of the best practices as of the time of writing, but will not always be up to date. - Use the guides referenced in [basic configuration](#basic-configuration) section to configure SSL properly. -- If your existing nginx configuration contains a line or included config file defining a default server, be sure to - disable it by commenting its `server {}` or preventing its inclusion (under Debian-based operating systems, this - is done by removing its symlink from `/etc/nginx/sites-enabled`. -- `uwsgi_read_timeout` can be adjusted as appropriate for your site. This is the amount of time allowed for - communication between nginx and uWSGI to block while waiting for a response from Galaxy, and is useful for holding - client (browser) connections while uWSGI is restarting Galaxy subprocesses or Galaxy is performing a slow operation. -- The parameter `client_max_body_size` specifies the maximum upload size that can be handled by POST requests through - nginx. You should set this to the largest file size that you wish to allow for upload and that could be reasonably - handled by your site. It defaults to 1MB, so it will need to be increased if you are dealing with genome sized - datasets. -- If you must serve Galaxy without SSL, you would simply replace the `listen` directives in the SSL `server {}` block - with the `listen` directives from the non-SSL `server {}` block and remove the non-SSL block and SSL directives from - the `http {}` block. -- If the proxy works but you are getting 404 errors for Galaxy's static content, be sure that the user that nginx runs - as has access to Galaxy's `static/` directory (and all its parent directories) on the filesystem. You can test this on - the command line with e.g. `sudo -u www-data ls /srv/galaxy/server/static`. - -### Serving Galaxy at a URL Prefix - -It may be necessary to serve Galaxy from an address other than the web server root (`https://www.example.org/galaxy`), -instead of `https://galaxy.example.org`). To do this, you need to make the following changes to the configuration in the -previous section: - -1. In the nginx config, prefix all of the location directives with your prefix and redirect requests from `/prefix` to - `/prefix/` like so: - - ```nginx - #... - - # proxy all requests not matching other locations to uWSGI - location /galaxy { - uwsgi_pass unix:///srv/galaxy/var/uwsgi.sock - uwsgi_param UWSGI_SCHEME $scheme; - include uwsgi_params; - } - - # serve framework static content - location /galaxy/static/style { - alias $galaxy_root/static/style/blue; - expires 24h; - } - - # additional static locations... - - # redirect /prefix -> /prefix/ - rewrite ^/galaxy$ /galaxy/ last; - ``` - -2. The Galaxy application needs to be aware that it is running with a prefix (for generating URLs in dynamic pages). - This is accomplished by configuring uWSGI and Galaxy (the `uwsgi` and `galaxy` sections in `config/galaxy.yml` - respectively) like so and restarting Galaxy: - - ```yaml - uwsgi: - #... - socket: unix:///srv/galaxy/var/uwsgi.sock - mount: /galaxy=galaxy.webapps.galaxy.buildapp:uwsgi_app() - manage-script-name: true - # `module` MUST NOT be set when `mount` is in use - #module: galaxy.webapps.galaxy.buildapp:uwsgi_app() - - galaxy: - #... - cookie_path: /galaxy - ``` - - `cookie_path` should be set to prevent Galaxy's session cookies from clobbering each other if you are running more - than one instance of Galaxy under different URL prefixes on the same hostname. - - Be sure to consult the [Scaling and Load Balancing](scaling.html) documentation, other options unrelated to proxying - should also be set in the `uwsgi` section of the config. - -## Advanced Configuration Topics - -### Sending Files With Nginx - -Galaxy sends files (e.g. dataset downloads) by opening the file and streaming it in chunks through the proxy server. -However, this ties up the Galaxy process, which can impact the performance of other operations (see [Production Server -Configuration](production.html) for a more in-depth explanation). - -Nginx can assume this task instead and as an added benefit, speed up downloads. This is accomplished through the use of -the special `X-Accel-Redirect` header. Dataset security is maintained in this configuration because nginx will still -check with Galaxy to ensure that the requesting user has permission to access the dataset before sending it. - -To enable it, add the following to your Galaxy's `server {}` block: - -```nginx - location /_x_accel_redirect/ { - internal; - alias /; - } -``` - -Next, edit `galaxy.yml` and make the following change before restarting Galaxy: - -```yaml -galaxy: - #... - nginx_x_accel_redirect_base: '/_x_accel_redirect' -``` - -For this to work, the user under which your nginx server runs will need read access to Galaxy's `files_path` directory -(by default, `database/files/`) and its contents. This is most easily done by adding the nginx user to the Galaxy user's -primary group and setting the `umask(2)` to create files with the group read permission set. If you start Galaxy from -the command line, you can do this like so: - -```shell-session -admin@server$ sudo usermod -a -G galaxy www-data # add `www-data` user to `galaxy` group -admin@server$ sudo -iu galaxy -galaxy@server$ umask 027 -galaxy@server$ sh run.sh -``` - -If you start Galaxy from supervisord, you can set the `umask` option in the [program -section](http://supervisord.org/configuration.html#program-x-section-settings) after adding the nginx user to the Galaxy -group as shown above. - -### Receiving Files With Nginx - -Galaxy receives files (e.g. dataset uploads) by streaming them in chunks through the proxy server and writing the files -to disk. However, this again ties up the Galaxy process. nginx can assume this task instead and as an added benefit, -speed up uploads. This is accomplished through the use of -[nginx_upload_module](http://www.grid.net.ru/nginx/upload.en.html), a 3rd-party nginx module. - -To enable it, you must first download, compile and install nginx with the upload module, since prior to NGINX 1.11.5, -nginx did not support shared modules, and the upload module is not yet shared-compatible. Because this is a tedious -and complicated process, the Galaxy Committers team maintains (for some platforms) versions of nginx modified from their -upstream package sources (APT, EPEL, etc.) to include the upload module: - -- [Ubuntu (PPA)](https://launchpad.net/~galaxyproject/+archive/ubuntu/nginx) -- [Enterprise Linux](https://depot.galaxyproject.org/yum/) - -To contribute support for additional platforms, please see the [Galaxy -Starforge](https://github.com/galaxyproject/starforge) project, which is used to do the repackaging. - - -Once nginx with the upload module is installed, create a directory in which to store uploads (ideally, for performance -reasons, on the same filesystem as Galaxy's datasets) and add the necessary directives to `nginx.conf`: - -```nginx -user galaxy; - -http { - - #... - - server { - - #... - - # handle file uploads via the upload module - location /_upload { - upload_store /srv/galaxy/upload_store; - upload_store_access user:rw group:rw; - upload_pass_form_field ""; - upload_set_form_field "__${upload_field_name}__is_composite" "true"; - upload_set_form_field "__${upload_field_name}__keys" "name path"; - upload_set_form_field "${upload_field_name}_name" "$upload_file_name"; - upload_set_form_field "${upload_field_name}_path" "$upload_tmp_path"; - upload_pass_args on; - upload_pass /_upload_done; - } - - # once upload is complete, redirect to the proper galaxy path - location /_upload_done { - set $dst /api/tools; - if ($args ~ nginx_redir=([^&]+)) { - set $dst $1; - } - rewrite "" $dst; - } -} -``` - -Note the `user` directive at the top, outside of the `http {}` block. To ensure that Galaxy has write permission on the -uploaded files, nginx's workers will need to run as the same user as Galaxy. - -When serving Galaxy at a URL prefix as described in the [Serving Galaxy at a URL -prefix](#serving-galaxy-at-a-url-prefix) section, you will need to change `set $dst /api/tools;` to `set $dst -/prefix/api/tools;` (e.g. `set $dst /galaxy/api/tools;`). - -Finally, edit `galaxy.yml` and make the following change before restarting Galaxy: - -```yaml -galaxy: - #... - nginx_upload_store: /srv/galaxy/upload_store - nginx_upload_path: '/_upload' -``` - -### Use Galaxy Authentication to Protect Custom Paths - -You may find it useful to require authentication for access to certain paths on your server. For example, Galaxy can -run a separate reports app which gives useful information about your Galaxy instance. See the [Reports Configuration -documentation](reports.html) and [Peter Briggs' blog post on the -subject](http://galacticengineer.blogspot.com/2015/06/exposing-galaxy-reports-via-nginx-in.html) for more. - -After succesfully following the blog post, Galaxy reports should be available at e.g. `https://galaxy.example.org/reports`. -To secure this page to only Galaxy administrators, adjust your nginx config accordingly: - -**TODO:** This is not valid for the uWSGI proxy method and needs to be updated. -nate 2018-01-11 - -```nginx - location /reports { - #... - satisfy any; # only one auth method needs to succeed - deny all; # host-based auth is not allowed - auth_request /_auth; # forward authentication - } - - location /_auth { - #internal; probably? - # The used galaxy api endpoint is only available to galaxy admins and thus limits the access - # to only logged in admins. - proxy_pass http://localhost/api/configuration/dynamic_tool_confs; - proxy_pass_request_body off; - proxy_set_header Content-Length ""; - proxy_set_header X-Original-URI $request_uri; - } -``` - -### External User Authentication - -- [Nginx for External Authentication](https://galaxyproject.org/admin/config/nginx-external-user-auth/) -- [Built-in Galaxy External Authentication](authentication.html) +# Proxying Galaxy with NGINX + +[NGINX](http://nginx.org/en/) is a lightweight http server designed with high performance proxying in mind. The public +Galaxy sites ([Main](https://galaxyproject.org/main/) and [Test](https://galaxyproject.org/test/)) as well as the +[Docker Galaxy project](https://github.com/bgruening/docker-galaxy-stable) use nginx to proxy rather than Apache for its +simple, fast load balancing and other features. + + +## Prerequisites + +Make sure that inbound (and outbound) traffic to the TCP protocol HTTP on port 80 (and HTTPS on port 443 if using SSL) +is permitted by your server's firewall/security. + +For the purposes of this example, we assume that: + +- the Galaxy server is installed at `/srv/galaxy/server` +- nginx runs as the user `www-data` (this is the default under Debian-based Linux distributions) +- Galaxy runs as the user `galaxy` with primary group `galaxy` +- Galaxy is served from the hostname `galaxy.example.org` + +Throughout the configuration examples in this document, in order to avoid reptition, `#...` is used to denote a location +where existing or previously given configuration statements would appear. + +```eval_rst +.. warning:: Please note that Galaxy should *never* be located on disk inside nginx's document root. By default, this + would expose all of Galaxy (including datasets) to anyone on the web. +``` + +## Basic Configuration + +The use of SSL is **strongly encouraged** to avoid exposure of confidential information such as datasets and user +credentials to eavesdroppers. The instructions in this document are for setting an SSL-enabled Galaxy server. + +When setting up an SSL server, simply enabling SSL with the default options is not enough. In most cases, the +configuration is weak and vulnerable to one or more of the multitude of SSL attacks that have been recently prevalent. +The [Qualys SSL/TLS Deployment Best Practices](https://www.ssllabs.com/projects/best-practices/) is an excellent and +up-to-date guide covering everything necessary for securing an SSL server. In addition, the [Mozilla SSL Configuration +Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/) can provide you with a best practices config +tailored to your desired security level and software versions. + +Finally, Google's [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) tool is helpful for +determining how you can improve responsiveness as related to proxying, such as verifying that caching and compression +are configured properly. + +If you need to run more than one site on your Galaxy server, there are two options: + +- Run them on the same server but serve them on different hostnames +- Serve them from different URL prefixes on a single hostname + +The former option is typically cleaner, but if serving more than one SSL site, you will need an SSL certificate with +[subjectAltName](http://wiki.cacert.org/FAQ/subjectAltName)s for each hostname served by the server. + +### Serving Galaxy at the Web Server Root + +This configuration assumes that Galaxy will be the only site on your server using the given hostname (e.g. +`https://galaxy.example.org`). + +Beginning with Galaxy Release 18.01, the default application server that Galaxy runs under is uWSGI. Because of this, +the native high performance uWSGI protocol should be used for communication between the proxy server and Galaxy, rather +than HTTP. Legacy instructions for proxying via HTTP can be found in the [Galaxy Release 17.09 nginx +documentation](https://docs.galaxyproject.org/en/release_17.09/admin/special_topics/nginx.html). + +uWSGI protocol support is built in to nginx, so (unlike Apache) no extra modules or recompiling should be required. + +Since nginx is more efficient than uWSGI at serving static content, it is best to serve it directly, reducing the load +on the Galaxy process and allowing for more effective compression (if enabled), caching, and pipelining. Directives to +do so are included in the example below. + +The following configuration is not exhaustive, only the portions most relevant to serving Galaxy are shown, these should +be incorporated with your existing/default nginx config as is appropriate for your server: + +```nginx +http { + + #... + + # compress responses whenever possible + gzip on; + gzip_http_version 1.1; + gzip_vary on; + gzip_comp_level 4; + gzip_proxied any; + gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; + gzip_comp_level 6; + gzip_buffers 16 8k; + + # allow up to 3 minutes for Galaxy to respond to slow requests before timing out + uwsgi_read_timeout 180; + + # maximum file upload size + client_max_body_size 10g; + + # allowable SSL protocols + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + + # use secure ciphers + ssl_ciphers + ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256; + ssl_dhparam /etc/nginx/ssl/dhparams.pem; + ssl_prefer_server_ciphers on; + + # enable session reuse + ssl_session_cache shared:SSL:8m; + ssl_session_timeout 5m; + + # cert/key + ssl_certificate /etc/nginx/ssl/server.crt; + ssl_certificate_key /etc/nginx/ssl/server.key; + + # OCSP stapling + ssl_stapling on; + ssl_stapling_verify on; + ssl_trusted_certificate /etc/nginx/ssl/ca.crt; + + + server { + listen 80 default_server; + listen [::]:80 default_server; + server_name _; + + return 301 https://$host$request_uri; + } + + server { + listen 443 default_server; + listen [::]:443 default_server; + server_name _; + + # use a variable for convenience + set $galaxy_root /srv/galaxy/server; + + # Enable HSTS + add_header Strict-Transport-Security "max-age=15552000; includeSubdomains"; + + # proxy all requests not matching other locations to uWSGI + location / { + uwsgi_pass unix:///srv/galaxy/var/uwsgi.sock + uwsgi_param UWSGI_SCHEME $scheme; + include uwsgi_params; + } + + # serve framework static content + location /static/style { + alias $galaxy_root/static/style/blue; + expires 24h; + } + location /static { + alias $galaxy_root/static; + expires 24h; + } + location /robots.txt { + alias $galaxy_root/static/robots.txt; + expires 24h; + } + location /favicon.ico { + alias $galaxy_root/static/favicon.ico; + expires 24h; + } + + # serve visualization and interactive environment plugin static content + location ~ ^/plugins/(?.+?)/(?.+?)/static/(?.*?)$ { + alias $galaxy_root/config/plugins/$plug_type/$vis_name/static/$static_file; + expires 24; + } + } +} +``` + +Be sure to set `$galaxy_root` to the path to your copy of Galaxy and modify the value of `uwsgi_pass` to match your +uWSGI socket path. With the default configuration, uWSGI will bind to a random TCP socket, so you will need to set it to +a fixed value as described in the [Scaling and Load Balancing](scaling.html) documentation. If using a UNIX domain +socket, be sure to pay particular attention to the discussion of users and permissions. + +### Implementation-specific Notes + +It is possible to perform the entire configuration in the main nginx configuration file (typically +`/etc/nginx/nginx.conf`), however, nginx packages as provided by Linux distribution package managers typically provide a +slightly more complex layout that is designed to prevent conflicts in `nginx.conf` when updating the package. + +On Debian-based Linux distributions (Debian, Ubuntu, etc.), the nginx package's default configuration contains two +include directives in the `http {}` block: + +- One which includes any configuration files with the `.conf` extension in the `/etc/nginx/conf.d` directory, where you + would place directives that belong in the `http {}` block. +- One which includes all files in the `/etc/nginx/sites-enabled` directory, which contains symlinks to + `/etc/nginx/sites-available`, where you would place the `server {}` configurations for websites hosted by this nginx + server. + +On EL-based Linux distributions (RedHat Enterprise Linux, CentOS, etc.), the EPEL nginx package's default configuration +contains a directive in the `http {}` block that includes any configuration files with the `.conf` extension in the +`/etc/nginx/conf.d` directory. + +Thus, on both Debian- and EL-based distributions, you might put the `http` directives in +`/etc/nginx/conf.d/galaxy_http_options.conf`. Note that these are **not** enclosed in an `http {}` block themselves, as +they are already enclosed by the `http {}` block in `/etc/nginx/nginx.conf`: + +```nginx +uwsgi_read_timeout 180; +client_max_body_size 10g; +ssl_certificate /etc/nginx/ssl/server.crt; +ssl_certificate_key /etc/nginx/ssl/server.key; +#... +``` + +Then for the site configurations, you might create: + +- `/etc/nginx/conf.d/galaxy_site.conf` on EL-based distributions +- `/etc/nginx/sites-available/galaxy` on Debian-based distributions + +With the `server {}` blocks (again, not enclosed in an `http {}`): + +```nginx +server { + listen 80 default_server; + listen [::]:80 default_server; + server_name _; + #... +} + +server { + listen 443 default_server; + listen [::]:443 default_server; + server_name _; + #... +} +``` + +On Debian-based distribution, you'd then need to symlink the config with: + +```shell-session +# ln -s /etc/nginx/sites-available/galaxy /etc/nginx/sites-enabled/galaxy +``` + +### Additional Notes + +- **Do not** simply copy the SSL configuration directives and expect them to work on your server or to be secure! These + are provided as examples of some of the best practices as of the time of writing, but will not always be up to date. + Use the guides referenced in [basic configuration](#basic-configuration) section to configure SSL properly. +- If your existing nginx configuration contains a line or included config file defining a default server, be sure to + disable it by commenting its `server {}` or preventing its inclusion (under Debian-based operating systems, this + is done by removing its symlink from `/etc/nginx/sites-enabled`. +- `uwsgi_read_timeout` can be adjusted as appropriate for your site. This is the amount of time allowed for + communication between nginx and uWSGI to block while waiting for a response from Galaxy, and is useful for holding + client (browser) connections while uWSGI is restarting Galaxy subprocesses or Galaxy is performing a slow operation. +- The parameter `client_max_body_size` specifies the maximum upload size that can be handled by POST requests through + nginx. You should set this to the largest file size that you wish to allow for upload and that could be reasonably + handled by your site. It defaults to 1MB, so it will need to be increased if you are dealing with genome sized + datasets. +- If you must serve Galaxy without SSL, you would simply replace the `listen` directives in the SSL `server {}` block + with the `listen` directives from the non-SSL `server {}` block and remove the non-SSL block and SSL directives from + the `http {}` block. +- If the proxy works but you are getting 404 errors for Galaxy's static content, be sure that the user that nginx runs + as has access to Galaxy's `static/` directory (and all its parent directories) on the filesystem. You can test this on + the command line with e.g. `sudo -u www-data ls /srv/galaxy/server/static`. + +### Serving Galaxy at a URL Prefix + +It may be necessary to serve Galaxy from an address other than the web server root (`https://www.example.org/galaxy`), +instead of `https://galaxy.example.org`). To do this, you need to make the following changes to the configuration in the +previous section: + +1. In the nginx config, prefix all of the location directives with your prefix and redirect requests from `/prefix` to + `/prefix/` like so: + + ```nginx + #... + + # proxy all requests not matching other locations to uWSGI + location /galaxy { + uwsgi_pass unix:///srv/galaxy/var/uwsgi.sock + uwsgi_param UWSGI_SCHEME $scheme; + include uwsgi_params; + } + + # serve framework static content + location /galaxy/static/style { + alias $galaxy_root/static/style/blue; + expires 24h; + } + + # additional static locations... + + # redirect /prefix -> /prefix/ + rewrite ^/galaxy$ /galaxy/ last; + ``` + +2. The Galaxy application needs to be aware that it is running with a prefix (for generating URLs in dynamic pages). + This is accomplished by configuring uWSGI and Galaxy (the `uwsgi` and `galaxy` sections in `config/galaxy.yml` + respectively) like so and restarting Galaxy: + + ```yaml + uwsgi: + #... + socket: unix:///srv/galaxy/var/uwsgi.sock + mount: /galaxy=galaxy.webapps.galaxy.buildapp:uwsgi_app() + manage-script-name: true + # `module` MUST NOT be set when `mount` is in use + #module: galaxy.webapps.galaxy.buildapp:uwsgi_app() + + galaxy: + #... + cookie_path: /galaxy + ``` + + `cookie_path` should be set to prevent Galaxy's session cookies from clobbering each other if you are running more + than one instance of Galaxy under different URL prefixes on the same hostname. + + Be sure to consult the [Scaling and Load Balancing](scaling.html) documentation, other options unrelated to proxying + should also be set in the `uwsgi` section of the config. + +## Advanced Configuration Topics + +### Sending Files With Nginx + +Galaxy sends files (e.g. dataset downloads) by opening the file and streaming it in chunks through the proxy server. +However, this ties up the Galaxy process, which can impact the performance of other operations (see [Production Server +Configuration](production.html) for a more in-depth explanation). + +Nginx can assume this task instead and as an added benefit, speed up downloads. This is accomplished through the use of +the special `X-Accel-Redirect` header. Dataset security is maintained in this configuration because nginx will still +check with Galaxy to ensure that the requesting user has permission to access the dataset before sending it. + +To enable it, add the following to your Galaxy's `server {}` block: + +```nginx + location /_x_accel_redirect/ { + internal; + alias /; + } +``` + +Next, edit `galaxy.yml` and make the following change before restarting Galaxy: + +```yaml +galaxy: + #... + nginx_x_accel_redirect_base: '/_x_accel_redirect' +``` + +For this to work, the user under which your nginx server runs will need read access to Galaxy's `files_path` directory +(by default, `database/files/`) and its contents. This is most easily done by adding the nginx user to the Galaxy user's +primary group and setting the `umask(2)` to create files with the group read permission set. If you start Galaxy from +the command line, you can do this like so: + +```shell-session +admin@server$ sudo usermod -a -G galaxy www-data # add `www-data` user to `galaxy` group +admin@server$ sudo -iu galaxy +galaxy@server$ umask 027 +galaxy@server$ sh run.sh +``` + +If you start Galaxy from supervisord, you can set the `umask` option in the [program +section](http://supervisord.org/configuration.html#program-x-section-settings) after adding the nginx user to the Galaxy +group as shown above. + +### Receiving Files With Nginx + +Galaxy receives files (e.g. dataset uploads) by streaming them in chunks through the proxy server and writing the files +to disk. However, this again ties up the Galaxy process. nginx can assume this task instead and as an added benefit, +speed up uploads. This is accomplished through the use of +[nginx_upload_module](http://www.grid.net.ru/nginx/upload.en.html), a 3rd-party nginx module. + +To enable it, you must first download, compile and install nginx with the upload module, since prior to NGINX 1.11.5, +nginx did not support shared modules, and the upload module is not yet shared-compatible. Because this is a tedious +and complicated process, the Galaxy Committers team maintains (for some platforms) versions of nginx modified from their +upstream package sources (APT, EPEL, etc.) to include the upload module: + +- [Ubuntu (PPA)](https://launchpad.net/~galaxyproject/+archive/ubuntu/nginx) +- [Enterprise Linux](https://depot.galaxyproject.org/yum/) + +To contribute support for additional platforms, please see the [Galaxy +Starforge](https://github.com/galaxyproject/starforge) project, which is used to do the repackaging. + + +Once nginx with the upload module is installed, create a directory in which to store uploads (ideally, for performance +reasons, on the same filesystem as Galaxy's datasets) and add the necessary directives to `nginx.conf`: + +```nginx +user galaxy; + +http { + + #... + + server { + + #... + + # handle file uploads via the upload module + location /_upload { + upload_store /srv/galaxy/upload_store; + upload_store_access user:rw group:rw; + upload_pass_form_field ""; + upload_set_form_field "__${upload_field_name}__is_composite" "true"; + upload_set_form_field "__${upload_field_name}__keys" "name path"; + upload_set_form_field "${upload_field_name}_name" "$upload_file_name"; + upload_set_form_field "${upload_field_name}_path" "$upload_tmp_path"; + upload_pass_args on; + upload_pass /_upload_done; + } + + # once upload is complete, redirect to the proper galaxy path + location /_upload_done { + set $dst /api/tools; + if ($args ~ nginx_redir=([^&]+)) { + set $dst $1; + } + rewrite "" $dst; + } +} +``` + +Note the `user` directive at the top, outside of the `http {}` block. To ensure that Galaxy has write permission on the +uploaded files, nginx's workers will need to run as the same user as Galaxy. + +When serving Galaxy at a URL prefix as described in the [Serving Galaxy at a URL +prefix](#serving-galaxy-at-a-url-prefix) section, you will need to change `set $dst /api/tools;` to `set $dst +/prefix/api/tools;` (e.g. `set $dst /galaxy/api/tools;`). + +Finally, edit `galaxy.yml` and make the following change before restarting Galaxy: + +```yaml +galaxy: + #... + nginx_upload_store: /srv/galaxy/upload_store + nginx_upload_path: '/_upload' +``` + +### Use Galaxy Authentication to Protect Custom Paths + +You may find it useful to require authentication for access to certain paths on your server. For example, Galaxy can +run a separate reports app which gives useful information about your Galaxy instance. See the [Reports Configuration +documentation](reports.html) and [Peter Briggs' blog post on the +subject](http://galacticengineer.blogspot.com/2015/06/exposing-galaxy-reports-via-nginx-in.html) for more. + +After succesfully following the blog post, Galaxy reports should be available at e.g. `https://galaxy.example.org/reports`. +To secure this page to only Galaxy administrators, adjust your nginx config accordingly: + +**TODO:** This is not valid for the uWSGI proxy method and needs to be updated. -nate 2018-01-11 + +```nginx + location /reports { + #... + satisfy any; # only one auth method needs to succeed + deny all; # host-based auth is not allowed + auth_request /_auth; # forward authentication + } + + location /_auth { + #internal; probably? + # The used galaxy api endpoint is only available to galaxy admins and thus limits the access + # to only logged in admins. + proxy_pass http://localhost/api/configuration/dynamic_tool_confs; + proxy_pass_request_body off; + proxy_set_header Content-Length ""; + proxy_set_header X-Original-URI $request_uri; + } +``` + +### External User Authentication + +- [Nginx for External Authentication](https://galaxyproject.org/admin/config/nginx-external-user-auth/) +- [Built-in Galaxy External Authentication](authentication.html)