Hosting Plone and Zope 3 applications using nginx
I'm doing a setup on a new server, I've decided to replace the default Apache 2.2 with an nginx http server. The setup which is needed for Zope 3 and Plone applications is the following:
[buildout] parts = nginx nginxctl [nginx] recipe = gocept.cmmi url = http://sysoev.ru/nginx/nginx-0.7.6.tar.gz md5sum = ae7ce6f66a2cf5a5970d9a9a0da0cf7d [nginxctl] recipe = gocept.nginx hostname = localhost port = 80 configuration = worker_processes 1; events { worker_connections 1024; } http { upstream z3 { server 127.0.0.1:8080; } upstream plone { server 127.0.0.1:9080; } server { listen ${nginxctl:port}; server_name z3.example.org; root html; include /etc/nginx/proxy.conf location / { proxy_pass http://z3/++lang++ro/++skin++myskin/mysite/++vh++http:z3.example.org:80/++/; } } server { server_name plone.example.org; include /etc/nginx/proxy.conf location / { proxy_pass http://plone/VirtualHostBase/http/plone.example.org:80/t1/VirtualHostRoot/; } } server { server_name plone.example.org; rewrite ^/(.*) /VirtualHostBase/http/plone.example.org:80/t1/VirtualHostRoot/$1 last; location / { proxy_pass http://plone; } } }
Note: this is a buildout.cfg. Using it together with zc.buildout makes the nginx instalation a very simple process: install zc.buildout (easy_install zc.buildout), and then run buildout in the folder that contains the .cfg file.
The settings in proxy.conf are important. Without a valid proxy_temp_path, for some reason delivery of all content that came from a Plone 2.5 site that used CacheFu setup with no proxy cache was freezing at 16014 bytes. The paths in /var/nginx need to be created and set to be writable by the nginx process (user nobody in my case).
client_max_body_size 0; client_body_buffer_size 128k; client_body_temp_path /var/nginx/client_body_temp; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_temp_path /var/nginx/proxy_temp; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Resources
A more complete nginx sample configuration file (but that only covers how to configure Plone)
Grok guide on hosting Zope 3 with nginx (note, at this moment the document is wrong, the setup line is missing a slash at the end).