Ubuntu 16 server note


This article is mainly to help experienced user install and setup Ubuntu 16 LTS Server. If you are looking for the information for Ubuntu 14, please go to the page Ubuntu 14 server setup


  • You are familiar with Ubuntu, at least you have some experience working on Linux system.
  • You are familiar with basic bash/shell command

Wireless Setup

If you install ubuntu server on a laptop, you might end up to setup the wifi first. Usually you won’t bring the cable with your laptop wherever you go, also you might just have no cable or run out all cables. Now let’s dive into how to setup the wifi on sever.

  • Find out network control installed on your laptop. The column link lists the name of interfaces. The interface name on your laptop will be possible slightly a bit different. It depends on laptop maker. Basically the interface with the type wlan is your wifi interface.

    • You will see network interfaces on your laptop. enp1s0 is the ethernet interface., and wlp3s0 is your wifi interface

      IDX LINK           TYPE         OPERATIONAL              SETUP
      1   lo         loopback     n/a                      unmanaged
      2   enp1s0     ether        n/a                      unmanaged
      3   wlp3s0     wlan         n/a                      unmanaged
  • Disable IP V6 if you don’t use it. (Highly recommanded for personal laptop user)

    • Add following setting to file /etc/sysctl.conf

      net.ipv6.conf.all.disable_ipv6 = 1
      net.ipv6.conf.default.disable_ipv6 = 1
      net.ipv6.conf.lo.disable_ipv6 = 1
    • Reconfigure by running the following command

      sudo sysctl -p
      ## Check the ipv6 status. If you see 1 after running command below, it means ipv6
      ## has been disabled
      cat /proc/sys/net/ipv6/conf/all/disable_ipv6
  • Find out the status wpa_supplicant

    sudo systemctl status wpa_supplicant
    ## If you find "disabled" in the output, you can simply enable it as below
    sudo systemctl enable wpa_supplicant
  • Find out your wifi ESSID

    sudo iwlist wlp3s0 scan | grep ESSID
    ## If you get error message like "network is down", use ifconfig to bring it up and 
    ## re-run previous commmand    
    sudo ifconfig wlp3s0 up
  • Setup the wpa passphrase for your wifi

    ## Use following command to add pass phrase to your wpa_supplicant
    ## wpa_passphrase <your-ESSID> <your-passphrase> | sudo tee /etc/wpa_supplicant.conf
    ## If your ESSID is mywifi and password of wifi is mypasswork, then you will end up the 
    ## command below
    wpa_passphrase mywifi mypasswork | sudo tee /etc/wpa_supplicant.conf
  • Config your wpa supplicant for your wifi interface and run the comand as background process

    sudo wpa_supplicant -c /etc/wpa_supplicant.conf -i wlp3s0 > /dev/null 2>1& &
  • Add SSID scan into config /etc/wpa_supplicant.conf

  • Get IP address from external DHCP

    sudo dhclient wlp3s0
    ## Check the ip address
    ifconfig wlp3s0

Wifi Trouble Shooting

  • There is no ip address assigned to your wifi interface

    • Check out the wpa_supplicant status sudo systemctl status wpa_supplicant

    • If you find some error like ‘Failed to construct signal’, it means some network service has been disabled

    sudo systemctl list-unit-files --state disabled | grep network

    • Enable systemd-networkd.service, networking.service if they are disabled
  • The error message comes after the dhclient

    • Enable the squid.service
  • Auto connect to wifi on Starup

    sudo cp /lib/systemd/system/wpa_supplicant.service /etc/systemd/system/wpa_supplicant.service
    sudo vi /etc/systemd/system/wpa_supplicant.service
  • Replace the following line ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant with ExecStart=/sbin/wpa_supplicant -u -s -c /etc/wpa_supplicant.conf -i wlp3s0

  • Add wifi interface into auto startup file /etc/network/interfaces

    auto lo
    iface lo net loopback
    auto wlp3s0
    iface wlp3s0 net dchp

UFW setup

sudo ufw enable
sudo ufw allow 80/tcp
sudo ufw allow ssh
sudo ufw allow 443/tcp
sudo ufw allow 8000/tcp

SSH server setup

!!! For production environment, SSH should be secured by the CA

sudo apt-get install openssh-server 

## backup default config 
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.factory-defaults
sudo chmod a-w /etc/ssh/sshd_config.factory-defaults

## use any editor to update sshd_config 
sudo nano /etc/ssh/sshd_config 

## uncomment  PasswordAuthentication yes to allow remote password login
## Password authentication is only for test environment

## setup ssh auto-start onboot
sudo update-rc.d ssh defaults

!!! Install the software-properties-common Package

sudo apt-get install software-properties-common python-software-properties

Time Zone setup

sudo dpkg-reconfigure tzdata

Install tmux

sudo apt-get install tmux

  • Most useful tmux commands

Ctrl+b “ — split pane horizontally.

Ctrl+b % — split pane vertically.

Ctrl+b arrow key — switch pane.

Hold Ctrl+b, don’t release it and hold one of the arrow keys — resize pane.

Ctrl+b c — ©reate a new window.

Ctrl+b , — rename reate a new window.

Ctrl+b n — move to the (n)ext window.

Ctrl+b p — move to the (p)revious window.

Install git

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

install docker CE (Ubuntu 16 LTS)

## Update the apt package index
sudo apt-get update

## Install packages to allow apt to use a repository over HTTPS
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \

## Add Docker’s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

## Verify the last 8 characters of the fingerprint.
sudo apt-key fingerprint xxxxxxxx

##   set up the stable repository
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \

## apt update 
sudo apt-get update

## install docker CE
sudo apt-get install docker-ce

Install JDK 8

  • Downlaod the JDK from Oracle website.

    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update
    sudo apt-get install oracle-java8-installer
    java -version
  • Setup environment

    sudo apt-get install oracle-java8-set-default
    sudo su
    cat >> /etc/environment <<EOL
  • Test JDK with a simple HelloWorld program

    import java.util.Calendar;
    class HelloWorld {
        public static void main(String[] args) {
            Calendar cal = Calendar.getInstance();
            int year = cal.get(Calendar.YEAR);
            int month = cal.get(Calendar.MONTH) + 1;
            int day = cal.get(Calendar.DATE);
            int hour = cal.get(Calendar.HOUR_OF_DAY);
            int minute = cal.get(Calendar.MINUTE);
            String username = System.getProperty("user.name");
            System.out.println(username+ ": Hello World! ");
            System.out.println(year + "/" + month + "/" + day + " " + hour + ":" + minute);
  • Compile and run the program

    javac HelloWorld.java
    java HelloWorld.java

Install nodejs

  • Install Nodejs 8.x

    curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
    sudo apt-get install -y nodejs
  • Install latest npm, yarn and ts

    sudo npm install -g npm
    sudo npm install -g typescript
    sudo mpm install -g yarn

Install PHP

  • Add new repo

    sudo apt-get install -y python-software-properties
    sudo add-apt-repository -y ppa:ondrej/php
    sudo apt-get update -y
    apt-cache pkgnames | grep php7.2
  • Option 1: Install LAMP stack

    sudo apt-get install -y apache2
    sudo apt-get install -y php7.2 libapache2-mod-php7.2 php7.2-cli php7.2-common \
    php7.2-mbstring php7.2-gd php7.2-intl php7.2-xml php7.2-mysql php7.1-mcrypt php7.2-zip
  • Option 2: Install LEMP stack

    sudo apt-get install -y nginx
    sudo apt-get install -y php7.2 php7.2-fpm php7.2-cli php7.2-common php7.2-mbstring \
    php7.2-gd php7.2-intl php7.2-xml php7.2-mysql php7.1-mcrypt php7.2-zip
  • Disable Apache and Nginx if you install both

    sudo systemctl disable apache2.service
    sudo systemctl disable nginx.service 

Install Python2, Python3

  • Ubuntu has python2 installed by default

    sudo apt-get python-pip 
    sudo apt-get install python3-pip
    sudo apt-get install python3-dev python-dev
    ## Install virtualenv 
    sudo pip install virtualenv
    sudo pip3 install virtualenv

Install Go

  • Install Go

    wget https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz
    ## check hash
    shasum -a 256 go*linux-amd64.tar.gz
    ## install tar ball
    sudo tar -C /usr/local -xvzf go1.9.2.linux-amd64.tar.gz
  • Setup GOROOT by overwriting the file /etc/environment with following content

  • Setup GOPATH by adding following lines to the end of .profile

    export GOPATH="$HOME/ws/go"
    export GOBIN="$GOPATH/bin"
    export PATH="$GOPATH/bin:$PATH"
  • Create a simple hello.go file to test

    package main                                                        
    import (                                                            
    func main(){                                                        
        user, err := user.Current()                                 
        if err != nil {                                             
        fmt.Printf(user.Name + " said : Hello World! \n" )      
  • Run the program

    go run $GOPATH/src/hello.go
    go install $GOPATH/src/hello.go

Install clang & cmake

sudo apt-get install clang
sudo apt-get install cmake

Install Rust

$ curl -f -L https://static.rust-lang.org/rustup.sh -O
$ sh rustup.sh