OMERO.web is the web application component of the OMERO platform which allows for the management, visualization (in a fully multi-dimensional image viewer) and annotation of images from a web browser. It also includes the ability to manage users and groups.
This guide uses the example of deploying OMERO.web separately from OMERO.server with Nginx and gunicorn.
If you wish to install the dependencies in a virtual environment, you will first have to create one and activate it. The following step is optional:
$ virtualenv omeroweb
$ source omeroweb/bin/activate
Install the OMERO.web dependencies using the package management tools:
$ pip install omego
$ omego download --ice "3.6" py
$ zip=$(ls OMERO.py*.zip)
$ zipname=${zip%.zip}
$ rm -f $zip
$ mv $(find . -name 'OMERO.py*' -type d) `pwd`/OMERO.py
$ pip install -r OMERO.py/share/web/requirements-py27-all.txt
Note
For more details refer to how to install Django 1.8 or upgrade Django to 1.8.
Additional settings can be configured by changing the following properties:
omero.web.wsgi_workers to (2 x NUM_CORES) + 1
Note
Do not scale the number of workers to the number of clients you expect to have. OMERO.web should only need 4-12 worker processes to handle many requests per second.
omero.web.wsgi_args Additional arguments. For more details check Gunicorn Documentation.
OMERO can automatically generate a configuration file for your web server. The location of the file will depend on your system, please refer to your web server’s manual. See Customizing your OMERO.web installation for additional customization options.
Set the following:
$ bin/omero config set omero.web.application_server "wsgi-tcp"
To create a site configuration file for inclusion in a system-wide nginx configuration redirect the output of the following command into a file:
$ OMERO.py/bin/omero web config nginx
upstream omeroweb {
server 127.0.0.1:4080 fail_timeout=0;
}
server {
listen 80;
server_name $hostname;
sendfile on;
client_max_body_size 0;
# maintenance page serve from here
location @maintenance {
root /home/omero/OMERO.server/etc/templates/error;
try_files $uri /maintainance.html =502;
}
# weblitz django apps serve media from here
location /static {
alias /home/omero/OMERO.server/lib/python/omeroweb/static;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://omeroweb;
}
location / {
error_page 502 @maintenance;
# checks for static file, if not found proxy to app
try_files $uri @proxy_to_app;
}
}
OMERO.web requires body_in_file_only adjusted in your default nginx config because nginx must buffer incoming data. Make sure you have that set to the following config:
http {
...
sendfile on;
send_timeout 60s;
client_max_body_size 0;
...
}
To configure an HTTPS server follow the Nginx documentation.
Note
If you need help configuring your firewall rules, see the Server security and firewalls page.
Start the Gunicorn worker processes listening by default on 127.0.0.1:4080:
$ OMERO.py/bin/omero web start
... static files copied to '/home/omero/OMERO.server/lib/python/omeroweb/static'.
Starting OMERO.web... [OK]
The Gunicorn workers are managed separately from other OMERO.server processes. You can check their status or stop them using the following commands:
$ OMERO.py/bin/omero web status
OMERO.web status... [RUNNING] (PID 59217)
$ OMERO.py/bin/omero web stop
Stopping OMERO.web... [OK]
Django WSGI workers (PID 59217) killed.
In order to offer users the ability to download data from OMERO.web you have to deploy using EXPERIMENTAL: Async workers. OMERO.web is able to handle multiple clients on a single worker thread switching context as necessary while streaming binary data from OMERO.server. Depending on the traffic and scale of the repository you should configure connections and speed limits on your server to avoid blocking resources. We recommend you run benchmark and performance tests. It is also possible to apply Download restrictions and offer alternative access to binary data.
Note
Handling streaming request/responses requires proxy buffering to be turned off. For more details refer to Gunicorn deployment and Nginx configuration.
Note
omero.web.application_server.max_requests should be set to 0
We run example benchmarks on rendering thumbnails and 512x512 pixels planes for 100 concurrent users making 5000 requests in total:
$ ab -n 5000 -c 100 https://server.openmicroscopy.org/omero/webclient/render_thumbnail/1234/
This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking server.openmicroscopy.org (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Finished 500 requests
Server Software: nginx/1.11.10
Server Hostname: server.openmicroscopy.org
Server Port: 80
Document Path: /omero/webclient/render_thumbnail/1234/
Document Length: 4405 bytes
Concurrency Level: 20
Time taken for tests: 17.904 seconds
Complete requests: 500
Failed requests: 0
Total transferred: 2271500 bytes
HTML transferred: 2202500 bytes
Requests per second: 27.93 [#/sec] (mean)
Time per request: 716.144 [ms] (mean)
Time per request: 35.807 [ms] (mean, across all concurrent requests)
Transfer rate: 123.90 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 45 49 4.3 48 83
Processing: 245 650 113.4 620 1167
Waiting: 244 649 113.4 620 1167
Total: 294 699 113.0 670 1214
Percentage of the requests served within a certain time (ms)
50% 670
66% 698
75% 737
80% 754
90% 814
95% 951
98% 1070
99% 1080
100% 1214 (longest request)
In order to identify why OMERO.web is not available run:
$ OMERO.py/bin/omero web status
Then consult nginx error.log and OMERO.server/var/log/OMEROweb.log
Check OMERO.web issues for more details.
To run the WSGI server in debug mode, enable Gunicorn logging using omero.web.wsgi_args:
$ OMERO.py/bin/omero config set omero.web.wsgi_args -- "--log-level=DEBUG --error-logfile=/home/omero/OMERO.server/var/log/error.log".
Note
The following configuration options marked as EXPERIMENTAL have yet to be extensively tested in a production environment, use at your own risk.
OMERO.web deployment can be configured with sync and async workers. Sync workers are faster and recommended for a data repository with Download restrictions. If you wish to offer users the ability to download data then you have to use async workers; read more about Download limitations above.
See Gunicorn design for more details.
Install futures
$ pip install futures
Additional settings can be configured by changing the following properties:
The number of worker threads for handling requests, see Gunicorn threads
$ OMERO.py/bin/omero config set omero.web.wsgi_worker_class
$ OMERO.py/bin/omero config set omero.web.wsgi_threads $(2-4 x NUM_CORES)
Install Gevent >= 0.13
$ pip install "gevent>=0.13"
Additional settings can be configured by changing the following properties:
The maximum number of simultaneous clients, see Gunicorn worker-connections
$ OMERO.py/bin/omero config set omero.web.wsgi_worker_class gevent
$ OMERO.py/bin/omero config set omero.web.wsgi_worker_connections 1000
$ OMERO.py/bin/omero config set omero.web.application_server.max_requests 0