1. 程式人生 > >linux下【centos】nginx自動原始碼編譯安裝指令碼,以及通過service 啟動/停止/過載 nginx的服務指令碼

linux下【centos】nginx自動原始碼編譯安裝指令碼,以及通過service 啟動/停止/過載 nginx的服務指令碼

 第一:指令碼為nginx原始碼編譯安裝的指令碼,可以幫助使用者自動建立系統使用者“nginx”;可以使用者自己指定安裝路徑,配置檔案路徑,執行檔案路徑等;

第二:可以配置第二個指令碼使用,通過service服務來管理nginx。

[[email protected] code]# cat nginx_auto_install.bash 
#!/bin/bash
#mail: [email protected]
#author shrekee
#nginx 原始碼安裝nginx


#進入指令碼後,首先儲存當前路徑
original_dir=`pwd`

#定義一個輸入路徑的函式,遞迴方法實現;並且能簡單的幫助使用者判斷輸入的路勁是否有誤?
function input_nginx_dir() {
	read -p"請輸入解壓後的nginx原始碼包路徑:比如:/usr/local/src/nginx1-14.0  :" nginx_dir
	cd $nginx_dir 
#通過cd 命令,來判斷輸入路徑是否正確,如果出錯則重新輸入。
	[ $? -ne 0 ] && echo "路徑輸入錯誤,請重新輸入" && input_nginx_dir
#掃描當前目錄下的檔名稱,並儲存。
	list=`/bin/ls`
#定義一個變數,用來儲存解壓nginx原始碼後,一般會存在的檔案
	nginx_pack_names="html configure conf man"
	for i in $nginx_pack_names;do
		echo $list | grep "$i" &> /dev/null
		#逐一取出常用的名字,並用來和list中做比對,如果不存在,則提示使用者:
		if [ $? -ne 0 ]; then
			read -p"您輸入的目錄中並不包含$i檔案,您確定嗎?yes/no" ans1
			if [ $nas1 = 'yes' -o $ans1 = 'y' ];then
				continue
			else
				input_nginx_dir
			fi
		fi
	done				
}

cat<<EOF
********************************************

******歡迎使用本原始碼安裝nginx的指令碼********
**需要事先下載、並解壓nginx壓縮包!!!
**支援使用者自定義配置、二進位制檔案、安裝路徑
**預設建立nginx的系統使用者和使用者組,來管理nginx
**需要:使用者事先配置yum源,以解決軟體依賴問題
**支援在成功安裝nginx後,自動建立service服務
**支援通過service nginx start|stop|restatr等管理nginx

*********************************************

EOF
read -p”是否知曉並同意以上內容?yes/no“ ans
[ "$ans" = 'no' -o "$ans" = 'n' ] && echo "歡迎下次使用哦^_^..88" && exit 1
	


#第一步,首先解決原始碼包安裝nginx所需要的依賴“gcc pcre-devel openssl-devel zlib-devel”
pack="gcc pcre-devel openssl-devel zlib-devel"
yum -y install $pack

#遍歷軟體是否已全部安裝成功?
for i in $pack;do
	rpm -q $i > /dev/null
	[ $? -ne 0 ] && echo "未能成功安裝依賴-${i}-,請檢查您的環境" && exit 1
done


#建立nginx系統使用者,無登陸許可權,無家目錄
#判斷在“/etc/passwd”否有nginx使用者,如果沒有則自動建立

#取出組使用者名稱
group_name=`cat /etc/group | cut -d':' -f1`
echo $group_name |grep 'nginx' > /dev/null
#判斷在/etc/group中有無nginx組使用者,沒有,則建立
if [ $? -ne 0 ];then
	groupadd -r nginx &>/dev/null
fi

#取出“/etc/passwd”中的使用者
user_name=`cat /etc/passwd | cut -d':' -f1`
echo $user_name | grep 'nginx' > /dev/null
#判斷在/etc/passwd中有無nginx使用者
if [ $? -ne 0 ]; then
	useradd -r -g nginx -s /sbin/nologin  -M nginx
fi



#讓使用者指出解壓縮後的nginx目錄,如果目錄輸入錯誤則要求使用者一再輸入;而且具有基本的判斷功能,
#即幫助使用者來判斷:使用者輸入的目錄是否就是正確的目錄
input_nginx_dir

#清理使用者的編譯現場


#列印選單,包含nginx的常用安裝路徑
cat <<EOF
****************************************
****************************************
**********預設安裝路徑***************
預設使用者為nginx,預設組為nginx
預設安裝路徑:/usr/local/nginx
預設的二進位制路徑:/usr/local/nginx/sbin/nginx
預設的配置路徑: /usr/local/nginx/conf/nginx.conf
預設啟用openssl模組
****************************************
****************************************
EOF
read -p“是否同意以上預設配置,yes/no” ans

if [ "$ans" = 'yes' -o "$ans" = 'y' ] ;then
	./configure --user=nginx --group=nginx --with-http_ssl_module

	if [ $? -eq 0 ];then
		make && make install && echo "恭喜您,安裝成功"
	else
		echo "配置失敗,請檢視錯誤資訊" 
		exit 2
	fi

#建立二進位制檔案的軟連線
	read -p"是否為您在/usr/local/bin下,建立二進位制檔案nginx的軟連線?yes/no" ans
	if [ "$ans" = 'yes' -o "$ans" = 'y' ];then
		ln -sv /usr/local/nginx/sbin/nginx /usr/local/bin/nginx	
	fi
#建立nginx的service服務,以方便使用者通過service快捷管理nginx	的啟動/停止等
	read -p"是否為您在/etc/init.d下建立service的服務,以方便nginx啟動/停止等?yes/no" ans
	if [ "$ans" = 'yes' -o "$ans" = 'y' ];then
		cd $original_dir
		cp ./nginx.server /etc/init.d/nginx
		chomd +x /etc/init.d/nginx
		echo "service服務已經正確安裝,謝謝您的使用"
	fi
		
else
	read -p"請輸入nginx的安裝路徑,預設回車,則預設為:/usr/local/nginx" nginx_install
	[ -z $nginx_dir ] && nginx_dir="/usr/local/nginx"
	read -p"請輸入二進位制安裝路徑,預設預設為:如下:/usr/local/bin/nginx" bin_dir
	[ -z $nginx_dir ] && bin_dir="/usr/local/bin/nginx"
	read -p"請輸入配置檔案路徑,預設預設為:比如:/etc/nginx.conf"  conf_dir
	[ -z $nginx_dir ] && conf_dir="/etc/nginx.conf"
 
	./configure  --prefix=$nginx_install --user=nginx --group=nginx --with-http_ssl_module --sbin-path="$bin_dir" --conf-path="$conf_dir"

if [ $? -eq 0 ];then
#如果配置成功,則自動編譯和安裝
	make && make install && echo "恭喜您,軟體安裝成功哦" 
#如果編譯或者安裝錯誤,則列印提示資訊,並退出
	[ $? -ne 0 ] && echo "安裝失敗,請檢查錯誤資訊" && exit 4
else
#配置失敗,則列印提示,並自動退出
	echo "安裝失敗,請檢查錯誤資訊"
	exit 3
fi

#建立二進位制檔案的軟連線
	read -p"是否為您在/usr/local/bin下,建立二進位制檔案nginx的軟連線?yes/no" ans
	if [ "$ans" = 'yes' -o "$ans" = 'y' ];then
		if [ -f $bin_dir ]; then
			[ -e /usr/local/bin/nginx ] && echo "路徑/usr/local/bin/nginx已存在。。請檢查路徑"
			ln -sv $bin_dir /usr/local/bin/nginx	
		elif [ -d $sbin_dir ]; then
			[ -e /usr/local/bin/nginx ] && echo "路徑/usr/local/bin/nginx已存在。。請檢查路徑"
			ln -sv $sbin_dir/nginx /usr/local/bin/nginx
		fi
	fi
#建立nginx的service服務,以方便使用者通過service快捷管理nginx	的啟動/停止等
	read -p"是否為您在/etc/init.d下建立service的服務,以方便nginx啟動/停止等?yes/no" ans
	if [ "$ans" = 'yes' -o "$ans" = 'y' ];then
#返回原始路徑,做指令碼的遷移
		cd $original_dir
		sed -ri "s#(^nginx=).*#\1${bin_dir}#g" nginx.server
		sed -ri "s#(^NGINX_CONF_FILE=).*#\1${conf_dir}#g" nginx.server
#把剛剛修改完的資料落地到磁碟,並延遲一秒
		sync
		sleep 1
		cp ./nginx.server /etc/init.d/nginx
		chmod +x /etc/init.d/nginx
		echo "service服務已經正確安裝,謝謝您的使用"
	fi

fi 

 以下為通過系統service服務來控制nginx 啟動/停止/過載的服務指令碼。

[[email protected] code]# cat nginx.server 
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/loca/nginx/conf/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /usr/local/nginx/logs/nginx.pid

##定義兩個變數,分別儲存nginx二進位制的檔案和配置檔案路徑
nginx="/usr/loca/nginx/sbin/nginx"
NGINX_CONF_FILE="/usr/local/nginx/logs/nginx.conf"

start() {
	[ -x $nginx ] || exit 1
	[ -f $NGINX_CONF_FILE ] || exit 2
	echo "starting nginx..."
	deamon $nginx -c $NGINX_CONF_FILE
	retval=$?
	return $retval
}
stop() {
	[ -x $nginx ] || exit 3
	[ -f $NGINX_CONF_FILE ] || exit 4
	echo "stoping nginx..."
	$nginx -s quit
	return $?
}
reload() {
	configtest || return $?
	echo "reloadding nginx..."
	$nginx -s reload
}
status() {
	[ -x $nginx ] || exit 5
	[ -f $NGINX_CONF_FILE ] || exit 6
	$nginx -s status
}



configtest() {
	$nginx -t -c $NGINX_CONF_FILE 
}

case $1 in 
	status )
		status
		;;
	start )
		start
		;;
	stop )
		stop
		;;
	reload )
		reload
		;;
esac