最近的一个任务是写个一键安装LNMP的脚本,运行的平台是Ubuntu12.04,命令那些跟之前的RHEL和Centos 有一点点区别,这里做个记录。

#!/bin/bash
#############################################
#    Fuction: Install LNMP automaticlly.    #
#    Date: 2014-03-17                       #
#    Contact Infomation                     #
#    Q: 303228632                           #
#    T: ***********                         #
#    Designed by Pmghong                    #
#############################################
# Configuration Arguments
workpath="/usr/local/src"
install_path="/usr/local"
mysql="mysql-5.5.29"
php="php-5.4.11"
nginx="nginx-1.2.6"
# Install basic software
echo -e "\e[1;31m Installing basic software... \e[0m"
apt-get install -y gcc g++ make cmake
echo -e "\e[1;32m Complete \e[0m"
# Install mysql
echo -e "\e[1;31m Installing mysql... \e[0m"
apt-get install -y libncurses5-dev build-essential bison
groupadd mysql
useradd -r -g mysql mysql
cd ${workpath}
tar xf ${mysql}.tar.gz
cd ${mysql}
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ -DMYSQL_DATADIR=/usr/local/mysql/data -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/usr/local/mysql/data/mysql.sock -DMYSQL_USER=mysql -DWITH_DEBUG=0
make && make install
echo -e "\e[1;32m Complete!!! \e[0m"
# Configure mysql
echo -e "\e[1;31m Confuring mysql... \e[0m"
cd ${install_path}/mysql
scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
chown -R mysql.mysql .
cp support-files/my-medium.cnf /etc/my.cnf
sed -i "27i datadir = ${install_path}\/mysql\/data" /etc/my.cnf
sed -i "27i basedir = ${install_path}\/mysql" /etc/my.cnf
sed -i "27i user = mysql" /etc/my.cnf
sed -i "30i character_set_server = utf8" /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
sed -i "46s#basedir=#basedir=${install_path}\/mysql#" /etc/init.d/mysqld
sed -i "47s#datadir=#datadir=${install_path}\/mysql\/data#" /etc/init.d/mysqld
ln -s /usr/local/mysql/bin/* /usr/bin/
/etc/init.d/mysqld start
echo -e "\e[1;32m Complete!!! \e[0m"
# Install php
echo -e "\e[1;31m Installing php... \e[0m"
apt-get install -y libltdl-dev libssl-dev sendmail libjpeg8 libjpeg8-dev libpng12-0 libpng12-dev libxml2-dev libcurl4-openssl-dev libmcrypt-dev
cd ${workpath}
tar xf ${php}.tar.bz2
cd ${php}
./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-curl --with-mcrypt --enable-mbstring --enable-pdo --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-openssl --with-imap-ssl --with-gd --with-jpeg-dir=/usr/lib/ --with-png-dir=/usr/lib/ --enable-exif --enable-zip
make && make install
cp php.ini-production /usr/local/php/lib/php.ini
cd ${install_path}/php/etc
cp -a php-fpm.conf.default php-fpm.conf
useradd -s /sbin/nologin -M fpmuser
${install_path}/php/sbin/php-fpm
echo -e "\e[1;32m Complete!!! \e[0m"
# Install nginx
echo -e "\e[1;31m Installing nginx... \e[0m"
apt-get install -y libpcre3 libpcre3-dev zlib1g-dev libncurses5-dev
useradd -s /sbin/nologin -M www
cd ${workpath}
tar xf ${nginx}.tar.gz
cd ${nginx}
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /etc/init.d/
/etc/init.d/nginx
echo -e "\e[1;32m Complete!!! \e[0m"
# Configure nginx
echo -e "\e[1;31m Configuringing nginx... \e[0m"
sed -i "s/#user  nobody;/user www www;/" ${install_path}/nginx/conf/nginx.conf
IP=`ifconfig eth0|grep "\<inet\>"|cut -d':' -f2|sed -n 's/  Bcast//p'`
sed -i "37s/server_name  localhost;/server_name  ${IP};/" ${install_path}/nginx/conf/nginx.conf
sed -i '45s/index /& index.php/' ${install_path}/nginx/conf/nginx.conf
sed -i '65,71s/#//' ${install_path}/nginx/conf/nginx.conf
sed -i 's#\/scripts$fastcgi_script_name;#$document_root$fastcgi_script_name;#' ${install_path}/nginx/conf/nginx.conf
# Create a test page
cat << EOF >> ${install_path}/nginx/html/index.php
<?php
phpinfo();
?>
EOF
/etc/init.d/nginx -s reload
echo -e "\e[1;32m Totally Complete!!! Now you can test the LNMP system. \e[0m"


扩展:实际上,在部署服务器的时候,把nginx、mysql、php的包打包上传到服务器,再运行脚本编译安装整个环境是相当耗费时间的。一个较好的办法是在测试机上编译打包好整个LNMP 环境,做到一次编译处处运行。即只要软件安装包打开,LNMP环境即可使用,无需在新机器上再次编译。这样就省去了很多编译和安装的麻烦,只需要简单的进行解压和一些基本的配置即可。


关于安装包的介绍:

目标:制作一键LNMP的安装包


要求:一次编译,处处运行软件部署包。在不需要apt-get 软件包的前提下,直接把软件包部署并运行到同发行版本和版本号的机器上。即将整个已编译好的安装包,不管发到哪台机器上,只要解压完,即可使用,不需要其他编译安装工作。


安装包结构:
1. 相关软件,包括/usr/local/nginx,/usr/local/mysql,/usr/local/php 等
2. 相关脚本:一些基础配置脚本,包括添加相关用户、启动服务等
3. 相关库文件:在LNMP编译过程中需要很多库文件的支持


制作过程:

nginx和mysql 在编译过程会把需要的组件静态编译到程序里面,因此只要将整个目录打包即可。编译安装过程不再累述。主要是php,直接打包php目录上传到其他机器上是不能直接运行的,因为它的运行依赖着一些库文件,而新的机器上并没有预装这些库文件。所以,php的打包还必须包括一些库文件。


注:

   在测试机上,我将php需的组件全部编译安装到/usr/local/src/lib 这个目录下

例如

root@server:/usr/local/src/lib# cd curl-7.22.0
root@server:/usr/local/src/lib/curl-7.22.0 # ./configure --prefix=/usr/local/src/lib/curl
root@server:/usr/local/src/lib/curl-7.22.0 # make && make install


php编译参数如下:

root@ubuntu:/usr/local/src/php-5.4.11# ./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=fpmuser --with-fpm-group=fpmuser   --with-curl=/usr/local/src/lib/curl --with-mcrypt=/usr/local/src/lib/libmcrypt --enable-mbstring --enable-pdo --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-openssl=/usr/local/src/lib/openssl --with-imap-ssl --with-gd --with-jpeg-dir=/usr/local/src/lib/libjpeg  --with-png-dir=/usr/local/src/lib/libpng --enable-exif --enable-zip


打包:

需要打包有4个目录:

tar cPf mysql.tar.gz  /usr/local/mysql

tar cPf nginx.tar.gz  /usr/local/nginx

tar cPf php.tar.gz   /usr/local/php

tar cPf php_lib.gz   /usr/local/src/lib


   另外,把安装包发布到新的机器上后,还需要通过脚本对系统进行一些初始化:

脚本一:

   这个脚本的主要功能是解压nginx、php、mysql等,并对系统进行初始化

#!/bin/bash
cat << EOF
##############################################################
#                  Welcome to AutoLNMP!                      #
#    Fuction: This script will install LNMP automaticlly.    #
#    Date: 2014-03-19                                        #
#    Contact Infomation                                      #
#    T: ***********                                          #
#                                   Designed by Pmghong      #
##############################################################
Script is running please wait for a minune...
EOF
# Unzip packages
tar xPf nginx.tar.gz -C /usr/local/  2> /dev/null
tar xPf mysql.tar.gz -C /usr/local/   2> /dev/null
tar xPf php.tar.gz -C /usr/local/    2> /dev/null
mkdir -p /usr/local/src/lib
tar xPf php_lib.tar.gz -C /usr/local/src/  2> /dev/null
apt-get install expect -y > /dev/null 2>&1
# Add service users
groupadd mysql
useradd -r -g mysql mysql
useradd -s /sbin/nologin -M fpmuser
useradd -s /sbin/nologin -M www
# Configure Mysql
cd /usr/local/mysql
chown mysql.mysql . -R
scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data > /dev/null
cp mysqld /etc/init.d/
ln -s /usr/local/mysql/bin/* /usr/bin/
# Start services
/usr/local/nginx/sbin/nginx
/etc/init.d/mysqld start > /dev/null
/usr/local/php/sbin/php-fpm
echo
echo "Work complete!"
echo "Now you can test the page 'http://IP'."
echo "If you want to install wordpress.Follow this step: 1.Run expect.sh.  2.Run LNMP_tester.sh"


脚本二:

   这个脚本的主要功能是:设置mysql root用户的密码--123456

#!/usr/bin/expect
spawn mysqladmin -uroot password
expect "password:"
send "123456\r"
expect "password:"
send "123456\r"
interact


脚本三:

   这个脚本主要是快速搭建wordpress,对LNMP环境进行测试。(可选)

#!/bin/bash
USER="root"
PASSWD="123456"
IP=`ifconfig eth0|grep "Bcast"|cut -d":" -f2|sed -n "s/  Bcast//p"`
tar xf wordpress-3.7.1-zh_CN.tar.gz
cd wordpress
cp -Ra * /usr/local/nginx/html/
cd /usr/local/nginx/html/
cp wp-config-sample.php wp-config.php
sed -i "s#define('DB_NAME', 'database_name_here');#define('DB_NAME', 'blog');#" /usr/local/nginx/html/wp-config.php
sed -i "s#define('DB_USER', 'username_here');#define('DB_USER', 'blogadmin');#" /usr/local/nginx/html/wp-config.php
sed -i "s#define('DB_PASSWORD', 'password_here');#define('DB_PASSWORD', '123456');#" /usr/local/nginx/html/wp-config.php
sed -i "s#define('DB_HOST', 'localhost');#define('DB_HOST', '$IP');#" /usr/local/nginx/html/wp-config.php
#WORKPATH=`pwd`
#exec ./{WORKPATH}expect.sh
mysql -u $USER -p$PASSWD  <<EOF 2> /dev/null
create database blog;
grant all privileges on blog.* to blogadmin@'%' identified by '123456';
flush privileges;
EOF
[ $? -eq 0 ] && echo "OK" || echo "Error".


总结:

   经测试,从把安装包上传到新的服务器,到解压安装包、初始化服务器,再到LNMP运作起来,整个过程大概在2分钟以内便可完成。大大节省了部署的时间为批量部署提供方便。


文件目录如下:

wKiom1MqY4zSbD-NAACuZSu-viU429.jpg

将这些文件打包起来,放到相同环境下,运行脚本即可快速部署上LNMP环境。(注:实验环境为Ubuntu 12.04)