Recently I purchased a Banana Pro single board computer. This board is an Raspberry Pi alternative with an AllWinner A20 chip. Setting it up is really a pain as the ecosystem for this board is still not mature.

Installation

First download the image and follow the instructions on the download page to burn the image into a fresh SD card.

dd if=bananian-1504.img of=/dev/<your-sd-card> bs=1M

Insert the SD card into the board and plug in the power cord. Connect the Ethernet port to your home router OR attach a keyboard and HDMI cable to your display.

Login using the default user/password combination root/pi. After that, key in the command bananian-config to enter the setup process. This step will expand the file system to the entire SD card so that you can use the whole free space on the card.

You should now have a working system. Now is the time to configure software mirrors. DO NOT config software mirror manually if you do not know what you are doing as it will cause hard-to-solve dependency problems as described above.

However, as the official Debian sources have prebuilt binaries for armhf architectures, you can replace the default ftp.de.debian.org sources in /etc/apt/source.list to corresponding local mirrors like ftp.cn.debian.org etc.

The Bananian sources are in /etc/apt/sources.list.d/bananian.list so be careful not to modify it.

Setting up Nginx

The official nginx repository in the Debian Jessie main repository is 1.6.5 and is a little bit out-of-date, thus it is better that we build from the sources ourselves.

First download the official release:

wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar xzf nginx-1.8.0.tar.gz
cd nginx-1.8.0

Install the dependencies:

sudo apt-get install libpcre3-dev libxslt1-dev libgd-dev libgeoip-dev

Then configure using the following settings:

./configure \
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi \
--pid-path=/run/nginx.pid \
--lock-path=/run/lock/subsys/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-ipv6 \
--with-http_ssl_module \
--with-http_spdy_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module \
--with-http_image_filter_module \
--with-http_geoip_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_stub_status_module  \
--with-mail \
--with-mail_ssl_module \
--with-pcre \
--with-pcre-jit

If the configuration fails, check the dependency.

Compile it, and install using

make -j2
sudo make install

Then add the users and groups.

sudo addgroup nginx
sudo adduser --no-create-home --disabled-login --ingroup nginx nginx

We also have to create the necessary directories for nginx:

cd /var/lib
sudo mkdir nginx
cd nginx
sudo mkdir tmp

Finally, we should manually create an init script for nginx to allow it to run as a service daemon:

sudo nano /etc/init.d/nginx

and insert the following contents (Quoted from http://www.rudraraj.net/2015/05/23/how-to-install-nginx-from-source-in-debian-jessie/) into the file, Ctrl+X and then Y to save.

 #!/bin/sh
 ### BEGIN INIT INFO
 # Provides: nginx
 # Required-Start: $local_fs $remote_fs $network $syslog $named
 # Required-Stop: $local_fs $remote_fs $network $syslog $named
 # Default-Start: 2 3 4 5
 # Default-Stop: 0 1 6
 # Short-Description: starts the nginx web server
 # Description: starts nginx using start-stop-daemon
 ### END INIT INFO
 PATH=/usr/local/sbin:/usr/share/nginx:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 DAEMON=/usr/sbin/nginx
 NAME=nginx
 DESC=nginx
 # Include nginx defaults if available
 if [ -r /etc/default/nginx ]; then
 . /etc/default/nginx
 fi
 STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/5/KILL/5}"
 test -x $DAEMON || exit 0
 . /lib/init/vars.sh
 . /lib/lsb/init-functions
 # Try to extract nginx pidfile
 PID=$(cat /etc/nginx/nginx.conf | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)
 if [ -z "$PID" ]
 then
 PID=/run/nginx.pid
 fi
 # Check if the ULIMIT is set in /etc/default/nginx
 if [ -n "$ULIMIT" ]; then
 # Set the ulimits
 ulimit $ULIMIT
 fi
 #
 # Function that starts the daemon/service
 #
 do_start()
 {
 # Return
 # 0 if daemon has been started
 # 1 if daemon was already running
 # 2 if daemon could not be started
 start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON --test > /dev/null \
 || return 1
 start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON -- \
 $DAEMON_OPTS 2>/dev/null \
 || return 2
 }
 test_nginx_config() {
 $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1
 }
 #
 # Function that stops the daemon/service
 #
 do_stop()
 {
 # Return
 # 0 if daemon has been stopped
 # 1 if daemon was already stopped
 # 2 if daemon could not be stopped
 # other if a failure occurred
 start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PID --name $NAME
 RETVAL="$?"
 sleep 1
 return "$RETVAL"
 }
 #
 # Function that sends a SIGHUP to the daemon/service
 #
 do_reload() {
 start-stop-daemon --stop --signal HUP --quiet --pidfile $PID --name $NAME
 return 0
 }
 #
 # Rotate log files
 #
 do_rotate() {
 start-stop-daemon --stop --signal USR1 --quiet --pidfile $PID --name $NAME
 return 0
 }
 #
 # Online upgrade nginx executable
 #
 # "Upgrading Executable on the Fly"
 # http://nginx.org/en/docs/control.html
 #
 do_upgrade() {
 # Return
 # 0 if nginx has been successfully upgraded
 # 1 if nginx is not running
 # 2 if the pid files were not created on time
 # 3 if the old master could not be killed
 if start-stop-daemon --stop --signal USR2 --quiet --pidfile $PID --name $NAME; then
 # Wait for both old and new master to write their pid file
 while [ ! -s "${PID}.oldbin" ] || [ ! -s "${PID}" ]; do
 cnt=`expr $cnt + 1`
 if [ $cnt -gt 10 ]; then
 return 2
 fi
 sleep 1
 done
 # Everything is ready, gracefully stop the old master
 if start-stop-daemon --stop --signal QUIT --quiet --pidfile "${PID}.oldbin" --name $NAME; then
 return 0
 else
 return 3
 fi
 else
 return 1
 fi
 }
 case "$1" in
 start)
 [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
 do_start
 case "$?" in
 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
 stop)
 [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
 do_stop
 case "$?" in
 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
 restart)
 log_daemon_msg "Restarting $DESC" "$NAME"
 # Check configuration before stopping nginx
 if ! test_nginx_config; then
 log_end_msg 1 # Configuration error
 exit 0
 fi
 do_stop
 case "$?" in
 0|1)
 do_start
 case "$?" in
 0) log_end_msg 0 ;;
 1) log_end_msg 1 ;; # Old process is still running
 *) log_end_msg 1 ;; # Failed to start
 esac
 ;;
 *)
 # Failed to stop
 log_end_msg 1
 ;;
 esac
 ;;
 reload|force-reload)
 log_daemon_msg "Reloading $DESC configuration" "$NAME"
 # Check configuration before reload nginx
 #
 # This is not entirely correct since the on-disk nginx binary
 # may differ from the in-memory one, but that's not common.
 # We prefer to check the configuration and return an error
 # to the administrator.
 if ! test_nginx_config; then
 log_end_msg 1 # Configuration error
 exit 0
 fi
 do_reload
 log_end_msg $?
 ;;
 configtest|testconfig)
 log_daemon_msg "Testing $DESC configuration"
 test_nginx_config
 log_end_msg $?
 ;;
 status)
 status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $?
 ;;
 upgrade)
 log_daemon_msg "Upgrading binary" "$NAME"
 do_upgrade
 log_end_msg 0
 ;;
 rotate)
 log_daemon_msg "Re-opening $DESC log files" "$NAME"
 do_rotate
 log_end_msg $?
 ;;
 *)
 echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}" >&2
 exit 3
 ;;
 esac

Now you can start the server by sudo /etc/init.d/nginx start.

If I have time I will reorganize the notes I made on this topic and post them here.