Background
I have been doing a fair bit of scale testing for York University Digital Library over the last couple weeks. Most of it has been focused on horizontal scaling of the traditional Islandora stack (Drupal, Fedora Commons, FedoraGSearch, Solr, and aDORe-Djtatoka). The stack is traditionally run with Apache2 in front of it, and it reverse proxies parts of the stack that are Tomcat webapps. I was curious if the stack would work with nginx, and if I would get any noticeable improvements by just switching from Apache2 to nginx. The preliminary good news is that the stack works with nginx (I’ll outline the config below). The not surprising news, according to this, is I’m not seeing any noticeable improvements. If time permits, I’ll do some real benchmarking.
Islandora nginx configurations
Having no experience with nginx, I started searching around, and found a config by David StClair that worked. With a few slight modifications, I was able to get the stack up any running with no major issues. The only major item that I needed to figure out how to do was reverse proxying aDORe-djatoka so that it would place nice with the default settings for Islandora OpenSeadragon. All this turned out to be was figuring out what the ProxyPass
and ProxyPassReverse
directive equivalents were for nginx. Turns out that it is very straightforward. With Apache2, we needed:
#Fedora Commons/Islandora proxying ProxyRequests Off ProxyPreserveHost On Order deny,allow Allow from all ProxyPass /adore-djatoka http://digital.library.yorku.ca:8080/adore-djatoka ProxyPassReverse /adore-djatoka http://digital.library.yorku.ca:8080/adore-djatoka
This gives us a nice dog in a hat with Apache2.
With nginx we use the proxy_redirect
directive.
server { location /adore-djatoka { proxy_pass http://localhost:8080/adore-djatoka; proxy_redirect http://localhost:8080/adore-djatoka /adore-djatoka; } }
This gives us a nice dog in a hat with nginx.
That’s really only the major modification that I had to make to get the stack running with nginx. Here is my config adapted from David StClair’s example.
server { server_name kappa.library.yorku.ca; root /path/to/drupal/install; ## <-- Your only path reference. # Enable compression, this will help if you have for instance advagg module # by serving Gzip versions of the files. gzip_static on; location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } # Very rarely should these ever be accessed outside of your lan location ~* \.(txt|log)$ { allow 127.0.0.1; deny all; } location ~ \..*/.*\.php$ { return 403; } # No no for private location ~ ^/sites/.*/private/ { return 403; } # Block access to "hidden" files and directories whose names begin with a # period. This includes directories used by version control systems such # as Subversion or Git to store control files. location ~ (^|/)\. { return 403; } location / { # This is cool because no php is touched for static content try_files $uri @rewrite; proxy_read_timeout 300; } location /adore-djatoka { proxy_pass http://localhost:8080/adore-djatoka; proxy_redirect http://localhost:8080/adore-djatoka /adore-djatoka; } location @rewrite { # You have 2 options here # For D7 and above: # Clean URLs are handled in drupal_environment_initialize(). rewrite ^ /index.php; # For Drupal 6 and bwlow: # Some modules enforce no slash (/) at the end of the URL # Else this rewrite block wouldn't be needed (GlobalRedirect) #rewrite ^/(.*)$ /index.php?q=$1; } # For Munin location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini include fastcgi_params; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; } # Fighting with Styles? This little gem is amazing. # This is for D7 and D8 location ~ ^/sites/.*/files/styles/ { try_files $uri @rewrite; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } }