Skip to content

Instantly share code, notes, and snippets.

@gonzaloplaza
Last active October 14, 2022 05:35
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save gonzaloplaza/411aa7f96c3192b3823ccb833a6b85d8 to your computer and use it in GitHub Desktop.
Save gonzaloplaza/411aa7f96c3192b3823ccb833a6b85d8 to your computer and use it in GitHub Desktop.
Jenkins Installation under NGINX - Ubuntu 16.04 on AWS EC2 t2.micro (custom subdomain)

Jenkins Installation through NGINX proxy - Ubuntu 16.04 on AWS EC2 (custom tld subdomain)

The following guide includes all steps needed to install a Jenkins Server on AWS EC2 (Ubuntu 16.04 LTS), using NGINX as proxy with custom tld

  1. Set up EC2 instance
  • Selected type: t2.micro (1GB) (for this example, you can choose any type)
  • AMI: Ubuntu 16.04 LTD 64bits (AWS AMI repository)
  • 20GB SSD storage
  • Security Group: Opened (inbound) for web ports: 80, 443 and 22
  • Set up userdata script (below): This will update system and install: JRE8, Docker, Jenkins and NGINX
#!/bin/bash
sudo apt-get -y update && sudo apt-get -y upgrade
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get -y update
curl -fsSL get.docker.com -o get-docker.sh && sudo sh get-docker.sh
sudo apt-get -y install default-jre
sudo apt-get -y install jenkins nginx
  1. Run EC2 instance

Connect it via ssh to check all scripts/packages were successfully installed. You can enter your public ip address or public dns name for instance to see nginx default page on port 80. If userdata script didn't work for any reason, you can execute these commands manually via SSH on your EC2 instance (Order is important)

  1. Assign your tls domain or subdomain to instance ipv4 address.

And access it via http://subdomain.yourtld.com

  1. Configure nginx proxy for Jenkins

Via ssh remove default virtual host /etc/nginx/sites-available/default and create new one

sudo rm /etc/nginx/sites-available/default
sudo nano /etc/nginx/sites-available/default

Include the following configuration replacing your subdomain

upstream jenkins {
  keepalive 32; # keepalive connections
  server 127.0.0.1:8080; # jenkins ip and port
}
 
server {
  listen          80;       # Listen on port 80 for IPv4 requests

  server_name     subdomain.yourtld.com;

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

  access_log      /var/log/nginx/jenkins/access.log;
  error_log       /var/log/nginx/jenkins/error.log;
  ignore_invalid_headers off; #pass through headers from Jenkins which are considered invalid by Nginx server.

  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;
	  break;
    }
	sendfile on;
  }

  location @jenkins {
      sendfile off;
      proxy_pass         http://jenkins;
      proxy_redirect     default;
      proxy_http_version 1.1;

      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_set_header   X-Forwarded-Proto $scheme;
      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_buffering            off;
      proxy_request_buffering    off; # Required for HTTP CLI commands in Jenkins > 2.54
      proxy_set_header Connection ""; # Clear for keepalive
  }

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

    try_files $uri @jenkins;
  }
}

Note: : Due to nginx error with logs, we create manually these files and assign them jenkins user:

sudo touch /var/log/nginx/jenkins/access.log
sudo touch /var/log/nginx/jenkins/error.log
sudo chown -hR /var/log/nginx/jenkins

And then we check nignx configuration BEFORE reload server:

sudo nginx -t

If everything is fine, we must reload/restart our nginx server:

sudo service nginx restart
  1. Access Jenkins via subdomain

Via browser: http://subdomain.yourtld.com

If you see Jenkins first installation screen, looks like everything is working fine!

  1. Enter default Jenkins password and create admin user

Default password for Jenkins is located (plain text) on our server. Access via SSH and copy it:

sudo nano /var/lib/jenkins/secrets/initialAdminPassword

Enter it inside your Jenkins installation wizard and continue creating your user.

And that's all!

Documentation Reference

@lord-zeus
Copy link

good day please
on the server_name can I use my amazon public ip ?

@gonzaloplaza
Copy link
Author

gonzaloplaza commented Sep 4, 2019

good day please
on the server_name can I use my amazon public ip ?

Sure , you can remove or comment "server_name" directive. This is optional. Then, access directly using your public ip

# server_name subdomain.yourtld.com;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment