LNMP环境一键部署

LNMP环境一键部署脚本:

#!/bin/bash
#用于安装LNMP环境

[ ! -d /software/ ] && mkdir /software

#功能选择菜单
menu(){
        echo -e "\033[31;32m                              LNMP编译安装脚本                                 \033[0m"
        echo -e "\033[31;32m================================================================================\033[0m"
        echo -e "\033[34m   此脚本能直接在rhel7.5、Centos 7.5上成功执行   \033[0m"
        echo -e "\033[33m   安装包版本:  nginx:1.14.0   mysql5.7.23   php7.2.6   \033[0m"
        echo "   相关依赖包:pcre-devel、gd-devel、openssl、openssl-devel、php-mysql、bzip2   "
        echo "               perl-devel、libxml2-devel bzip2-devel libcurl-devel   "
        echo -e "\033[47;34m------------安装需联网下载软件包,若下载地址失效,需自行更新下载地址------------\033[0m"
        echo -e "\033[31;32m================================================================================\033[0m"
        echo -e "\033[33m   nginx安装目录:/usr/local/nginx,日志目录:/data/logs/nginx/   \033[0m"
        echo -e "\033[33m   mysql安装目录:/usr/local/mysql,数据存放目录:/data/mysql/   \033[0m"
        echo -e "\033[33m   php安装目录:/usr/local/php7   \033[0m"
        echo -e "\033[31;32m================================================================================\033[0m"
        echo -e "\033[34m请选择:\033[0m"
        echo -e "\033[36m0、安装依赖包   1、安装nginx   2、源码编译安装mysql   3、安装php   \033[0m"
        echo -e "\033[36m4、整合nginx和php   5、启动nginx、mysql、php-fpm服务   \033[0m"
        echo -e "\033[36m6、一键安装并部署lnmp   7、退出脚本   \033[0m"
        echo -e "\033[31;32m================================================================================\033[0m"
        echo
        read -p "请输入数字:0-5[单独安装](单独安装需要先安装依赖包),6[一键安装],7[退出脚本]: " num
}

#(0)安装依赖包
install_package(){
        cd /software

	    yum install -y vim-enhanced lrzsz net-tools gcc rsync epel-release wget unzip curl
        yum install -y bzip2-devel openssl-devel gnutls-devel gcc gcc-c++ cmake ncurses-devel bison-devel libaio-devel openldap  openldap-devel
        yum install -y autoconf bison libxml2-devel libcurl-devel libevent libevent-devel gd-devel expat-devel numactl

        if [ ! -f libmcrypt-2.5.8.tar.gz ]
        then
            wget http://nchc.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
        fi

        [ ! -d libmcrypt-2.5.8 ] && tar -zxf libmcrypt-2.5.8.tar.gz
        cd libmcrypt-2.5.8
        ./configure && make && make install

        if [ $? -eq 0 ]
        then
               sleep 3
               echo -e "\033[36m==========依赖包安装成功==========\033[0m"
          else
               echo -e "\033[31m**********安装依赖包失败,请检查**********\033[0m"
        fi
}

#(1)编译安装nginx
install_nginx(){
        cd /software

        #1、新建nginx系统用户
        id nginx &> /dev/null
        [ $? -ne 0 ] && useradd -r -s /sbin/nologin nginx

        #2、新建nginx日志存放目录
        [ ! -d /data/logs/nginx/ ] &&  mkdir -pv /data/logs/nginx/ && chown -R  nginx:nginx /data/logs/nginx/

        #3、定义nginx安装的版本
        NGINX_VERS=nginx-1.14.0

        #4、下载nginx
        if [ ! -f $NGINX_VERS.tar.gz ]
        then
           echo -e "\033[34m==========正在下载nginx源码包==========\033[0m"
           curl -O  http://nginx.org/download/$NGINX_VERS.tar.gz
        fi

        #5、解压下载包
        [ ! -d $NGINX_VERS ] && tar xf $NGINX_VERS.tar.gz

        #6、进入nginx解压后的目录
        cd $NGINX_VERS

        #7、编译安装
        ./configure --prefix=/usr/local/nginx \
        --user=nginx \
        --group=nginx \
        --http-log-path=/data/logs/nginx/access.log \
        --error-log-path=/data/logs/nginx/error.log \
        --with-http_ssl_module \
        --with-http_realip_module \
        --with-http_flv_module \
        --with-http_mp4_module \
        --with-http_gunzip_module \
        --with-http_gzip_static_module \
        --with-http_image_filter_module \
        --with-http_stub_status_module &&  make && make install

        if [ $? -eq 0 ]
        then
               sleep 3
               echo -e "\033[36m==========nginx编译安装成功==========\033[0m"
        else
               echo -e "\033[31m**********nginx编译安装失败,请检查**********\033[0m"
               exit 1
        fi
	
	    cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running \`nginx -t\` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF
	    systemctl enable nginx && systemctl daemon-reload
}

#(2)源码编译安装mysql
install_mysql(){
        cd /software

        VERSION=5.7.23      #mysql版本

        if [ ! -f mysql-$VERSION.tar.gz ]
        then
            #下载mysql
            echo -e "\033[34m==========下载mysql源码包==========\033[0m"
            curl -o mysql-$VERSION.tar.gz https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/mysql-$VERSION-linux-glibc2.12-x86_64.tar.gz
        fi

        # 1、创建mysql用户
        id mysql &> /dev/null
        [ $? -ne 0 ] && useradd -r -s /sbin/nologin mysql

        #2、解压mysql
        echo -e "\033[34m==========解压mysql...==========\033[0m"

        if [ -f mysql-$VERSION.tar.gz ]
        then
           tar xvf mysql-$VERSION.tar.gz
           mv mysql-$VERSION-* /usr/local/mysql
        fi
	
	    #3、创建数据库数据存放目录、安装目录
        [ ! -d  /data/mysql/ ] && mkdir -pv /data/mysql/
	    [ ! -f /usr/local/mysql/log/error.log ] && mkdir -pv /usr/local/mysql/log/ && touch /usr/local/mysql/log/error.log
        chown -R mysql:mysql  /data/mysql/
        chown -R mysql:mysql  /usr/local/mysql/

        #4、初始化
	
	    cd /usr/local/mysql
	
        if [ $? -eq 0 ]
        then
            echo -e "\033[34m==========数据库开始初始化==========\033[0m"
            ./bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql/  --datadir=/data/mysql/
	        if [ $? -eq 0 ]
	        then
		        echo -e "\033[36m==========数据库初始化成功==========\033[0m"
	        else
		        echo -e "\033[31m**********编译安装错误!初始化失败**********\033[0m"
            	exit 1
	        fi
        fi

        #5、配置数据库配置文件
        cat > /etc/my.cnf << EOF
[client]
port    = 3306
socket = /usr/local/mysql/tmp/mysql.sock

[mysql]
default-character-set=utf8

[mysqld]
default-storage-engine=INNODB
character_set_server=utf8
explicit_defaults_for_timestamp
basedir=/usr/local/mysql/
datadir=/data/mysql/
socket=/usr/local/mysql/tmp/mysql.sock
log_error = /usr/local/mysql/log/error.log

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
EOF

        [ ! -f /etc/init.d/mysql ] && \cp  /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
        
	    sed -i '46s/basedir=/basedir=\/usr\/local\/mysql/' /etc/init.d/mysql
	    sed -i '47s/datadir=/datadir=\/data\/mysql/' /etc/init.d/mysql
	
        chmod +x /etc/init.d/mysql
	
        #6、配置环境变量
        n=`grep "/usr/local/mysql/bin" /etc/profile |wc -l`
	
	    if [ $n -eq 0 ]
	    then
            echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
            source /etc/profile
        else 
            source /etc/profile
	    fi

        #7、创建日志目录、/var/run/mysqld/
        [ ! -d /var/log/mysql/ ] && mkdir /var/log/mysql/ && chown -R mysql:mysql /var/log/mysql/
        [ ! -d /var/run/mysqld/ ] && mkdir /var/run/mysqld/ && chown -R mysql:mysql /var/run/mysqld/
	    [ ! -d /usr/local/mysql/tmp/ ] && mkdir /usr/local/mysql/tmp/ && chown -R mysql:mysql /usr/local/mysql/tmp/
	
	    #8、配置成mysqld服务并启动
	    cat > /usr/lib/systemd/system/mysqld.service << EOF
[Unit]
Description=MySQL Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf

#连接数限制
LimitNOFILE=65535
LimitNPROC=65535

#Restart配置可以在进程被kill掉之后,让systemctl产生新的进程,避免服务挂掉
#Restart=always
PrivateTmp=false
EOF

	    systemctl daemon-reload && systemctl enable mysqld && systemctl start mysqld && systemctl daemon-reload
	
	    if [ $? -eq 0 ]
	    then
	        echo -e "\033[36m==========mysql安装成功并启动==========\033[0m"
	    fi	
	   
	    n=`grep "/usr/local/mysql/bin" /etc/profile |wc -l`
	
	    if [ $n -eq 0 ]
	    then
            echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
            source /etc/profile
        else
            source /etc/profile
	    fi
	    
	    mysql -uroot -D mysql -e "UPDATE user SET authentication_string=PASSWORD("123456789") WHERE user='root';"
	    mysql -uroot -e "FLUSH PRIVILEGES;"
	    mysql -uroot -p123456789 -e "grant all privileges on *.* to root@'%'  identified by '123456789';"
	
	    if [ $? -eq 0 ]
        then
           echo -e "\033[36m==========数据库root密码修改为123456789成功==========\033[0m"
        else
           echo -e "\033[31m**********数据库root密码修改为123456789失败,为空**********\033[0m"
        fi	
}

#(3)编译安装php
install_php(){
        cd /software
        
        PHPVERS=7.2.6       #PHP版本
        DLOAD_PHP=http://mirrors.sohu.com/php/php-$PHPVERS.tar.gz  #PHP下载地址

        #0 、创建php-fpm用户,用户名:php-fpm
        id php-fpm &> /dev/null
        [ $? -ne 0 ] && useradd -r -s /sbin/nologin php-fpm

        #1、下载php
        [ ! -f  php-$PHPVERS.tar.gz ] && echo -e "\033[36m正在下载php源码包...\033[0m"  && curl -O $DLOAD_PHP

        #2、解压php
        [ ! -d php-$PHPVERS/ ] && tar xf php-$PHPVERS.tar.gz
        echo -e "\033[36m编译安装php需要很长时间,请慢慢等待...\033[0m"
        sleep 3
        cd php-$PHPVERS/

        #3、编译安装
        ./configure  --prefix=/usr/local/php7 \
        --with-config-file-path=/usr/local/php7/etc \
        --with-mysqli=mysqlnd  \
        --with-pdo-mysql=mysqlnd \
	    --with-mysql=/usr/local/mysql \
        --with-mysql-sock=/usr/local/mysql/tmp/mysql.sock \
        --with-iconv-dir \
        --with-freetype-dir \
        --with-jpeg-dir \
        --with-png-dir \
        --with-zlib \
        --with-bz2 \
        --with-libxml-dir \
        --with-curl \
        --with-gd \
        --with-openssl \
        --with-mhash  \
        --with-xmlrpc \
        --with-pdo-mysql \
        --with-libmbfl \
        --with-onig \
        --with-pear \
        --enable-xml \
        --enable-bcmath \
        --enable-shmop \
        --enable-sysvsem \
        --enable-inline-optimization \
        --enable-mbregex \
        --enable-fpm \
        --enable-mbstring \
        --enable-pcntl \
        --enable-sockets \
        --enable-zip \
        --enable-soap \
        --enable-opcache \
        --enable-pdo \
        --enable-mysqlnd-compression-support \
        --enable-maintainer-zts  \
        --enable-session \
        --with-fpm-user=php-fpm \
        --with-fpm-group=php-fpm  && make -j 2 && make -j 2 install

        if [ $? -eq 0 ]
        then
            echo -e "\033[36m==========php编译安装成功==========\033[0m"
        else
            echo -e "\033[31m**********php编译安装失败,请检查**********\033[0m"
            exit 1
        fi

        #4、配置php-fpm服务文件
        [ ! -d /usr/local/php7/etc/ ] && mkdir /usr/local/php7/etc/
        \cp php.ini-production  /usr/local/php7/etc/php.ini
        sed -i '/post_max_size/s/8/16/g;/max_execution_time/s/30/300/g;/max_input_time/s/60/300/g;s#\;date.timezone.*#date.timezone \= Asia/Shanghai#g' /usr/local/php7/etc/php.ini
        \cp sapi/fpm/init.d.php-fpm  /etc/init.d/php-fpm
        chmod +x /etc/init.d/php-fpm

        #5、将php-fpm添加到系统服务
        chkconfig --add php-fpm
        chkconfig php-fpm on

        #6、php-fpm配置文件
        cd /usr/local/php7/
        cat > etc/php-fpm.conf << EOF
[global]
pid = /usr/local/php7/var/run/php-fpm.pid
error_log = /usr/local/php7/var/log/php-fpm.log
[www]
listen = 127.0.0.1:9000
listen.mode = 666
listen.owner = nobody
listen.group = nobody
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
EOF

        #7、编译ldap模块
        echo -e "\033[34m==========安装ldap模块==========\033[0m"
        cd /software/php-$PHPVERS/ext/ldap
        \cp -af /usr/lib64/libldap* /usr/lib/
        /usr/local/php7/bin/phpize
        [ $? -eq 0 ] && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install
        sed -i '/\;extension=bz2/aextension=ldap.so' /usr/local/php7/etc/php.ini

        #8、编译gettext模块
        echo -e "\033[34m==========安装gettext模块==========\033[0m"
        cd /software/php-$PHPVERS/ext/gettext
        \cp -af /usr/lib64/libldap* /usr/lib/
        /usr/local/php7/bin/phpize
        [ $? -eq 0 ] && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install
        sed -i '/\;extension=bz2/aextension=gettext.so' /usr/local/php7/etc/php.ini
	
	    echo -e "\033[36m==========PHP安装步骤完成==========\033[0m"
}

#(4)整合nginx和php
config_lnmp(){
        cd /usr/local/nginx

        #1、编辑nginx配置文件
	    cat > conf/nginx.conf << EOF
user nobody nobody;	
worker_processes  1;
error_log /data/logs/nginx/error.log crit;
pid /run/nginx.pid;
worker_rlimit_nofile 51200;

events {
    use epoll;
    worker_connections  1024;
}

http {
    include       mime.types;
    log_format  main  '\$remote_addr - \$remote_user [\$time_local] "\$request" '
                      '\$status \$body_bytes_sent "\$http_referer" '
                      '"\$http_user_agent" "\$http_x_forwarded_for"';

    access_log  /data/logs/nginx/access.log  main;

    server_tokens       off;
    sendfile        	on;
    send_timeout        3m;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    client_header_timeout 3m;
    client_body_timeout 3m;
    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 8 4k;
    request_pool_size 4k;
    output_buffers 4 32k;
    postpone_output 1460;
    client_max_body_size 10m;
    client_body_buffer_size 256k;
    client_body_temp_path /usr/local/nginx/client_body_temp;
    proxy_temp_path /usr/local/nginx/proxy_temp;
    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
    fastcgi_intercept_errors on;    

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 8k;
    gzip_comp_level 5;
    gzip_http_version 1.1;
    gzip_types text/plain application/x-javascript text/css text/htm 
    application/xml;

    default_type  application/octet-stream;
    include  /usr/local/nginx/conf.d/*.conf;
}
EOF
        #2、将server配置段从nginx.conf分离出来
        [ ! -d conf.d ] && mkdir conf.d	
	
        #3、创建conf.d/server.conf文件整合nginx与php
        cat > conf.d/server.conf << EOF
server {
	listen       80;
	server_name  localhost;
	location / {
		root   /usr/local/nginx/html;
		index  index.php index.html index.htm;
	}
	
	error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        	root   html;
        }	

	location ~ \.php$ {
	root   /usr/local/nginx/html;
	fastcgi_pass   127.0.0.1:9000;
	fastcgi_index  index.php;
	fastcgi_param  SCRIPT_FILENAME  \$document_root\$fastcgi_script_name;
	include        fastcgi_params;
	}
}
EOF

        #4、修改conf/fastcgi_params
        > conf/fastcgi_params
        cat > conf/fastcgi_params << EOF
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       \$query_string;
fastcgi_param  REQUEST_METHOD     \$request_method;
fastcgi_param  CONTENT_TYPE       \$content_type;
fastcgi_param  CONTENT_LENGTH     \$content_length;
fastcgi_param  SCRIPT_FILENAME    \$document_root\$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        \$fastcgi_script_name;
fastcgi_param  REQUEST_URI        \$request_uri;
fastcgi_param  DOCUMENT_URI       \$document_uri;
fastcgi_param  DOCUMENT_ROOT      \$document_root;
fastcgi_param  SERVER_PROTOCOL    \$server_protocol;
fastcgi_param  REMOTE_ADDR        \$remote_addr;
fastcgi_param  REMOTE_PORT        \$remote_port;
fastcgi_param  SERVER_ADDR        \$server_addr;
fastcgi_param  SERVER_PORT        \$server_port;
fastcgi_param  SERVER_NAME        \$server_name;
EOF

        #5、关闭SELinux、防火墙
        setenforce 0 && sed -i 's/enforcing/disabled/g' /etc/selinux/config
        systemctl stop firewalld && systemctl disable firewalld

        #6、创建测试页,备份nginx默认的页面

        cat > html/1.php << EOF

EOF

        if [ $? -eq 0 ]
        then
            sleep 3
            echo -e "\033[36m==========整合nginx和php成功==========\033[0m"
        else
            echo -e "\033[31m**********整合nginx和php失败,请检查**********\033[0m"
            # exit 1
        fi
}

#(5)启动nginx、mysql、php-fpm服务
start_service(){
	    systemctl daemon-reload && systemctl start nginx 
       
	    if [ $? -eq 0 ]
            then
                echo -e "\033[36m==========nginx服务启动成功==========\033[0m"
        else
            echo -e "\033[31m**********nginx服务启动失败**********\033[0m"
        fi

        systemctl start mysqld  &&  /etc/init.d/php-fpm start

        if [ $? -eq 0 ]
        then
            sleep 3
            echo -e "\033[36m==========mysql、php-fpm服务启动成功==========\033[0m"
            echo -e "\033[33m查看端口启用情况:\033[0m"
            ss -tnl
            echo -e "\033[33m端口:80、3306、9000已启动!\033[0m"
            echo -e "\033[36m==========编译安装lnmp已完成==========\033[0m"
            echo -e "\033[36m==========数据库root密码为123456789==========\033[0m"
            echo -e "\033[36m--------打开浏览器输入你的ip/1.php,看看测试页--------\033[0m"
        else
             echo -e "\033[31m**********mysql、php-fpm服务启动失败**********\033[0m"
        fi
        
        source /etc/profile
}

#脚本运行入口
run_install(){
        while true;do
        menu

        case $num in
        "0")
                #0、安装依赖包
                    echo -e "\033[34m==========安装依赖包==========\033[0m"
                    install_package
                    ;;
        "1")
                #1、编译安装nginx
                    echo -e "\033[34m==========编译安装nginx==========\033[0m"
                    install_nginx
                    ;;
        "2")
                #2、编译安装mysql
                    echo -e "\033[34m==========编译安装mysql==========\033[0m"
               	    install_mysql
                    ;;
        "3")    #3、编译安装php
                    echo -e "\033[34m==========编译安装php==========\033[0m"
                    install_php
                    ;;
        "4")    #4、整合nginx和php
                    echo -e "\033[34m==========整合nginx和php==========\033[0m"
               	    config_lnmp
                    ;;
        "5")    #5、启动nginx、mysql、php-fpm服务
                    echo -e "\033[34m==========启动nginx、mysql、php-fpm服务==========\033[0m"
                    start_service
                    ;;
        "6")    #6、一键编译安装lnmp
                    echo -e "\033[34m==========一键编译安装并配置lnmp==========\033[0m"
                    install_package
                    install_nginx
                    install_mysql
                    install_php
                    config_lnmp
                    start_service
                    exit 0
                    ;;
        "7")    #7、退出脚本
                    exit 0
                    ;;
          *)
                    ;;
        esac
        done
}

#调用脚本运行入口
run_install

手动单独安装可以参考这里:https://blog.csdn.net/miss1181248983/article/details/80890649


你可能感兴趣的:(#,Shell脚本)