最近的一个任务是写个一键安装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 软件包的前提下,直接把软件包部署并运行到同发行版本和版本号的机器上。即将整个已编译好的安装包,不管发到哪台机器上,只要解压完,即可使用,不需要其他编译安装工作。
制作过程:
nginx和mysql 在编译过程会把需要的组件静态编译到程序里面,因此只要将整个目录打包即可。编译安装过程不再累述。主要是php,直接打包php目录上传到其他机器上是不能直接运行的,因为它的运行依赖着一些库文件,而新的机器上并没有预装这些库文件。所以,php的打包还必须包括一些库文件。
注:
在测试机上,我将php需的组件全部编译安装到/usr/local/src/lib 这个目录下
例如
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分钟以内便可完成。大大节省了部署的时间为批量部署提供方便。
文件目录如下:
将这些文件打包起来,放到相同环境下,运行脚本即可快速部署上LNMP环境。(注:实验环境为Ubuntu 12.04)
转载于:https://blog.51cto.com/pmghong/1379702