From 2b36f68d500dc5e38b2beb73020cc70d9f71f246 Mon Sep 17 00:00:00 2001 From: Eddie Septr Date: Thu, 9 May 2019 23:17:02 +0700 Subject: [PATCH] Add Nginx installer from source --- nginx/init.d/nginx | 196 +++++++++++++++++++++++++++ scripts/install_nginx.sh | 107 ++++++++++++++- scripts/install_nginx_from_source.sh | 16 +-- 3 files changed, 304 insertions(+), 15 deletions(-) create mode 100644 nginx/init.d/nginx diff --git a/nginx/init.d/nginx b/nginx/init.d/nginx new file mode 100644 index 0000000..db10b7d --- /dev/null +++ b/nginx/init.d/nginx @@ -0,0 +1,196 @@ +#!/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/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 + +if [ -n "$ULIMIT" ]; then + # Set ulimit if it is set in /etc/default/nginx + ulimit $ULIMIT +fi + +start_nginx() { + # Start the daemon/service + # + # Returns: + # 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_config() { + # Test the nginx configuration + $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1 +} + +stop_nginx() { + # Stops the daemon/service + # + # 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" +} + +reload_nginx() { + # Function that sends a SIGHUP to the daemon/service + start-stop-daemon --stop --signal HUP --quiet --pidfile $PID --name $NAME + return 0 +} + +rotate_logs() { + # Rotate log files + start-stop-daemon --stop --signal USR1 --quiet --pidfile $PID --name $NAME + return 0 +} + +upgrade_nginx() { + # Online upgrade nginx executable + # http://nginx.org/en/docs/control.html + # + # 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) + log_daemon_msg "Starting $DESC" "$NAME" + start_nginx + case "$?" in + 0|1) log_end_msg 0 ;; + 2) log_end_msg 1 ;; + esac + ;; + stop) + log_daemon_msg "Stopping $DESC" "$NAME" + stop_nginx + case "$?" in + 0|1) log_end_msg 0 ;; + 2) log_end_msg 1 ;; + esac + ;; + restart) + log_daemon_msg "Restarting $DESC" "$NAME" + + # Check configuration before stopping nginx + if ! test_config; then + log_end_msg 1 # Configuration error + exit $? + fi + + stop_nginx + case "$?" in + 0|1) + start_nginx + 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 stopping 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_config; then + log_end_msg 1 # Configuration error + exit $? + fi + + reload_nginx + log_end_msg $? + ;; + configtest|testconfig) + log_daemon_msg "Testing $DESC configuration" + test_config + log_end_msg $? + ;; + status) + status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $? + ;; + upgrade) + log_daemon_msg "Upgrading binary" "$NAME" + upgrade_nginx + log_end_msg $? + ;; + rotate) + log_daemon_msg "Re-opening $DESC log files" "$NAME" + rotate_logs + log_end_msg $? + ;; + *) + echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}" >&2 + exit 3 + ;; +esac diff --git a/scripts/install_nginx.sh b/scripts/install_nginx.sh index 8f6ba4d..8c6a47e 100755 --- a/scripts/install_nginx.sh +++ b/scripts/install_nginx.sh @@ -1,18 +1,98 @@ #!/usr/bin/env bash # Include decorator +BASEDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) + if [ "$(type -t run)" != "function" ]; then - BASEDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) . ${BASEDIR}/decorator.sh fi -echo "Installing Nginx webserver..." +function nginx_install_menu() { + echo -e "\nAvailable Nginx installer to use: + 1). Repository + 2). Source + -------------------" + echo -n "Select your Nginx installer [1-2]: " + read NgxInstaller -if [[ -n $(which nginx) && -d /etc/nginx/sites-available ]]; then - warning "Nginx web server already exists. Installation skipped..." -else + case $NgxInstaller in + 1) + echo "Installing Nginx from package repository..." + run apt-get install -y --allow-unauthenticated ${NGX_PACKAGE} + ;; + 2) + echo "Installing Nginx from source..." + run ${BASEDIR}/install_nginx_from_source.sh -v latest-stable -n latest -t Release \ + --dynamic-module --psol-from-source --extra-modules -y + ;; + *) + warning "No installer found." + continue_or_exit "Retry Nginx installation?" + nginx_install_menu + ;; + esac + + if [ ! -d /etc/nginx/modules-available ]; then + run mkdir /usr/share/nginx/modules-available + fi + + if [ ! -d /etc/nginx/modules-enabled ]; then + run mkdir /usr/share/nginx/modules-enabled + fi + + # Custom Nginx dynamic modules configuration + if [[ "$NgxInstaller" == "2" ]]; then + + if [[ -f /usr/lib/nginx/modules/ngx_pagespeed.so && ! -f /etc/nginx/modules-available/mod-pagespeed.conf ]]; then + run bash -c 'echo "load_module \"/usr/lib/nginx/modules/ngx_pagespeed.so\";" > \ + /etc/nginx/modules-available/mod-pagespeed.conf' + fi + + if [[ -f /usr/lib/nginx/modules/ngx_http_geoip_module.so && ! -f /etc/nginx/modules-available/mod-http-geoip.conf ]]; then + run bash -c 'echo "load_module \"/usr/lib/nginx/modules/ngx_http_geoip_module.so\";" > \ + /etc/nginx/modules-available/mod-http-geoip.conf' + fi + + if [[ -f /usr/lib/nginx/modules/ngx_http_image_filter_module.so && ! -f /etc/nginx/modules-available/mod-http-image-filter.conf ]]; then + run bash -c 'echo "load_module \"/usr/lib/nginx/modules/ngx_http_image_filter_module.so\";" > \ + /etc/nginx/modules-available/mod-http-image-filter.conf' + fi + + if [[ -f /usr/lib/nginx/modules/ngx_http_xslt_filter_module.so && ! -f /etc/nginx/modules-available/mod-http-xslt-filter.conf ]]; then + run bash -c 'echo "load_module \"/usr/lib/nginx/modules/ngx_http_xslt_filter_module.so\";" > \ + /etc/nginx/modules-available/mod-http-xslt-filter.conf' + fi + + if [[ -f /usr/lib/nginx/modules/ngx_mail_module.so && ! -f /etc/nginx/modules-available/mod-mail.conf ]]; then + run bash -c 'echo "load_module \"/usr/lib/nginx/modules/ngx_mail_module.so\";" > \ + /etc/nginx/modules-available/mod-mail.conf' + fi + + if [[ -f /usr/lib/nginx/modules/ngx_stream_module.so && ! -f /etc/nginx/modules-available/mod-stream.conf ]]; then + run bash -c 'echo "load_module \"/usr/lib/nginx/modules/ngx_stream_module.so\";" > \ + /etc/nginx/modules-available/mod-stream.conf' + fi + + echo -en "\nEnable Nginx dynamic modules? [Y/n]: " + read enableDM + if [[ "$enableDM" == Y* || "$enableDM" == y* ]]; then + run ln -s /etc/nginx/modules-available/mod-pagespeed.conf /etc/nginx/modules-enabled/50-mod-pagespeed.conf + #run ln -s /etc/nginx/modules-available/mod-http-geoip.conf /etc/nginx/modules-enabled/50-mod-http-geoip.conf + fi + + # Nginx init script + if [ ! -f /etc/init.d/nginx ]; then + run cp nginx/init.d/nginx /etc/init.d + run chmod ugo+x /etc/init.d/nginx + fi + fi + + #run chown -hR www-data:root /etc/nginx/modules-available +} + +function init_nginx_install() { # Install Nginx custom - run apt-get install -y --allow-unauthenticated ${NGX_PACKAGE} + nginx_install_menu # Copy custom Nginx Config run mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old @@ -36,6 +116,10 @@ else run unlink /etc/nginx/sites-enabled/default run ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/01-default + if [ -d "/usr/share/nginx/html" ]; then + run chown -hR www-data:root /usr/share/nginx/html + fi + # Nginx cache directory if [ ! -d "/var/cache/nginx/" ]; then run mkdir /var/cache/nginx @@ -55,10 +139,19 @@ else # Check IP Address IPAddr=$(curl -s http://ipecho.net/plain) # Make default server accessible from IP address - run sed -i s@localhost.localdomain@$IPAddr@g /etc/nginx/sites-available/default + run sed -i 's@localhost.localdomain@$IPAddr@g' /etc/nginx/sites-available/default # Restart Nginx server if [[ $(ps -ef | grep -v grep | grep nginx | wc -l) > 0 ]]; then run service nginx restart + status "Nginx web server installed successfully." fi +} + +# Start running things from a call at the end so if this script is executed +# after a partial download it doesn't do anything. +if [[ -n $(which nginx) && -d /etc/nginx/sites-available ]]; then + warning "Nginx web server already exists. Installation skipped..." +else + init_nginx_install "$@" fi diff --git a/scripts/install_nginx_from_source.sh b/scripts/install_nginx_from_source.sh index bccbd33..0df0290 100755 --- a/scripts/install_nginx_from_source.sh +++ b/scripts/install_nginx_from_source.sh @@ -6,9 +6,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -100,9 +100,9 @@ Options: Print this message and exit." } -RED=31 -GREEN=32 -YELLOW=33 +RED=61 +GREEN=62 +YELLOW=63 function begin_color() { color="$1" echo -e -n "\e[${color}m" @@ -490,11 +490,11 @@ add support for dynamic modules in a way compatible with ngx_pagespeed until # Now make sure our dependencies are installed. if "$DO_DEPS_CHECK"; then INSTALL_FLAGS="" - + if "$ASSUME_YES"; then INSTALL_FLAGS="-y" fi - + if [ -f /etc/debian_version ]; then status "Detected debian-based distro." @@ -790,7 +790,7 @@ with --no-deps-check." if [ "$BUILD_TYPE" = "Debug" ]; then configure_args=("${configure_args[@]}" "--with-debug") fi - else + else # Production env configure_args=("${configure_args[@]}" "--prefix=/usr/share/nginx"