Running Hudson behind Nginx

Skip to end of metadata
Go to start of metadata

In situations where you have existing web sites on your server, you may find it useful to run Hudson (or the servlet container that Hudson runs in) behind Nginx, so that you can bind Hudson to the part of a bigger website that you may have. This document discusses some of the approaches for doing this.

When a request arrives for certain URLs, Nginx becomes a proxy and further forward that request to Hudson, then it forwards the response back to the client. A typical set up for mod_proxy would look like this:

server {
  listen          80;       # Listen on port 80 for IPv4 requests


  #this is the jenkins web root directory (mentioned in the /etc/default/jenkins file)
  root            /var/run/jenkins/war/;

  access_log      /var/log/nginx/hudson_access.log;
  error_log       /var/log/nginx/hudson_error.log;

  location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {

    #rewrite all static files into requests to the root
    #E.g /static/12345678/css/something.css will become /css/something.css
    rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;

  location /userContent {
        #have nginx handle all the static requests to the userContent folder files
        #note : This is the $JENKINS_HOME dir
	root /var/lib/jenkins/;
        if (!-f $request_filename){
           #this file does not exist, might be a directory or a /**view** url
           rewrite (.*) /$1 last;
	sendfile on;

  location @jenkins {
      sendfile off;
      proxy_redirect     default;

      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_max_temp_file_size 0;

      #this is the maximum upload size
      client_max_body_size       10m;
      client_body_buffer_size    128k;

      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;

  location / {

     # Optional configuration to detect and redirect iPhones
      if ($http_user_agent ~* '(iPhone|iPod)') {
          rewrite ^/$ /view/iphone/ redirect;

      try_files $uri @jenkins;

This assumes that you run Hudson on port 8080.

For this set up to work, the context path of Hudson must be the same between your Nginx and Hudson (that is, you can't run Hudson on http://localhost:8081/ci and have it exposed at http://localhost:80/hudson).

Set the context path by modifying the hudson.xml configuration file and adding --prefix=/hudson (or similar) to the <arguments> entry.

Also note that the Nginx proxy module doesn't support keep-alive connexions, which means the above configuration will break interactive things like the console output. See for more information.


nginx nginx Delete
proxy proxy Delete
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

Add Comment