#!/bin/bash #lnmp auto setup shell script #2019-01-28 #LNMP (mysql 5.7.21 php 7.1.26 nginx 1.8.1 ) 源码架构搭建 #Version 1.0 clear date echo "############################################################################################" echo "# #" echo "# 本脚本lnmp版本是:mysql 5.7.21(二进制)nginx-1.8.1 php-7.1.26 请先下载到/opt #" echo "# #" echo "# 下载地址如下: #" echo "# #" echo "# https://dev.mysql.com//Downloads/MySQL-5.7/mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz #" echo "# #" echo "# http://nginx.org/download/nginx-1.8.1.tar.gz #" echo "# #" echo "# wget http://php.net/distributions/php-7.1.26.tar.gz #" echo "# #" echo "# 建议使用 source 命令运行该脚本,source lnmp.sh 避免 shell 中的 source 问题。 #" echo "# #" echo "############################################################################################" for i in `seq -w 8 -1 0` do echo -ne "\b\b\b\b$i 秒"; sleep 1; done echo "" MYVER=`cat /etc/redhat-release |awk '{print $4}'| awk -F [.] '{print $1}'` expr 1 + $MYVER &>/dev/null if [ $? -ne 0 ];then echo "请在 7 版本的系统里面运行该脚本....." exit fi if [ $UID -ne 0 ]; then echo "请用 root 用户运行该脚本...." exit fi echo '网络检测中.......................' echo ' ' sleep 1 #检测有无外网 ping -c 1 114.114.114.114 > /dev/null 2>&1 if [ $? -eq 0 ];then echo '网络正常,程序将继续运行。' sleep 1 else echo '正在进行第二次网络检测,请稍候.........' sleep 1 curl www.baidu.com >/dev/null 2>&1 if [ $? -ne 0 ]; then echo '检测到网络连接有异常,请检查您的网络设置.....' exit else echo '' echo '网络正常,程序将继续运行.' sleep 1 fi fi echo '------------------------------------------------------------' echo '' echo "开始安装 Mysql 5.7.21........................................" sleep 2 ################### 源码二进制安装 mysql 5.7.21 ##################### PSMYSQL0=`ps -ef |grep mysql |grep -v grep | wc -l` if [ $PSMYSQL0 -ge 1 ]; then echo '已有mysql 进程运行,不需要再安装。' echo '' sleep 1 else if [ ! -f "/opt/mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz" ];then echo "mysql5.7.21 二进制tar.gz 文件不存在,请下载到/opt/ 目录,再运行。" echo "下载地址:https://dev.mysql.com//Downloads/MySQL-5.7/mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz" sleep 2 exit fi #yum 安装 依赖包 yum -y install cmake bison git ncurses-devel libaio gcc gcc-c++ lrzsz wget vim #卸载mariadb yum remove mariadb* -y cd /opt echo "正在解压 mysql 5.7.21 .........." tar -zxf mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz -C /usr/local cd /usr/local mv mysql-5.7.21-linux-glibc2.12-x86_64 mysql-5.7.21 #创建用户和组 groupadd mysql useradd -r -g mysql -s /bin/false mysql #配置环境变量 echo "export PATH=$PATH:/usr/local/mysql-5.7.21/bin" >> /etc/profile source /etc/profile #配置数据库目录,创建日志文件,授权。 mkdir -p /usr/local/mysql-5.7.21/{data,log,etc,run} touch /usr/local/mysql-5.7.21/log/mysql_error.log chown -R mysql:mysql /usr/local/mysql-5.7.21 chmod -R 777 /usr/local/mysql-5.7.21/{data,log,etc,run} #配置my.cnf cat >/etc/my.cnf << EOF [mysqld] port = 3306 socket = /usr/local/mysql-5.7.21/run/mysql.sock pid_file = /usr/local/mysql-5.7.21/run/mysql.pid basedir = /usr/local/mysql-5.7.21 datadir = /usr/local/mysql-5.7.21/data default_storage_engine = InnoDB max_allowed_packet = 128M max_connections = 2048 open_files_limit = 65535 skip-name-resolve lower_case_table_names=1 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' innodb_buffer_pool_size = 256M innodb_log_file_size = 128M innodb_file_per_table = 1 innodb_flush_log_at_trx_commit = 0 key_buffer_size = 16M log-error = /usr/local/mysql-5.7.21/log/mysql_error.log log-bin = /usr/local/mysql-5.7.21/log/mysql_bin slow_query_log = 1 slow_query_log_file = /usr/local/mysql-5.7.21/log/mysql_slow_query.log long_query_time = 2 tmp_table_size = 16M max_heap_table_size = 16M query_cache_size = 256M server-id=1 enforce_gtid_consistency = on gtid_mode = on [client] port = 3306 socket = /usr/local/mysql-5.7.21/run/mysql.sock EOF #初始化 mysqld --initialize --user=mysql --basedir=/usr/local/mysql-5.7.21/ --datadir=/usr/local/mysql-5.7.21/data/ if [ $? -ne 0 ]; then echo '' echo "Mysql 初始化有问题,请检查....." exit fi mysql_ssl_rsa_setup --basedir=/usr/local/mysql-5.7.21 --datadir=/usr/local/mysql-5.7.21/data/ #配置服务,使用systemctl管理服务。 cat >/usr/lib/systemd/system/mysqld.service << EOF [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql Type=forking PIDFile=/usr/local/mysql-5.7.21/run/mysql.pid # Disable service start and stop timeout logic of systemd for mysqld service. TimeoutSec=0 # Execute pre and post scripts as root PermissionsStartOnly=true # Needed to create system tables #ExecStartPre=/usr/bin/mysqld_pre_systemd # Start main service ExecStart=/usr/local/mysql-5.7.21/bin/mysqld --daemonize --pid-file=/usr/local/mysql-5.7.21/run/mysql.pid # Use this to switch malloc implementation EnvironmentFile=-/etc/sysconfig/mysql # Sets open_files_limit LimitNOFILE = 65535 Restart=on-failure RestartPreventExitStatus=1 PrivateTmp=false EOF systemctl daemon-reload systemctl enable mysqld.service systemctl start mysqld.service #判断mysql 启动有无问题 if [ $? -ne 0 ]; then echo '' echo "Mysql 启动有问题,请检查....." exit fi PASSW=`grep 'temporary password' /usr/local/mysql-5.7.21/log/mysql_error.log |awk '{print $11}'` #修改 mysql 的root 密码 cd /usr/local/mysql-5.7.21/bin/ ./mysqladmin -uroot -p"$PASSW" password "windows@123" #用修改后的密码,连接,创建数据库。 mysql -uroot -pwindows@123 -e "create database abc charset=utf8;" #判断创建数据库命令是否执行成功,来确定,mysql root密码是否有修改成功。 if [ $? -ne 0 ]; then echo '' echo "Mysql 密码修改未成功,请检查....." exit else netstat -luntp echo '' echo 'mysql 5.7.21 安装成功,程序将继续运行。' echo '----------------------------------------------------------' echo '' sleep 1 fi fi echo "开始安装 Nginx 1.8.1 ............................................." sleep 2 ################ 源码安装 nginx-1.8.1 ################################ PSNGINX0=`ps -ef |grep nginx |grep -v grep | wc -l` if [ $PSNGINX0 -ge 1 ]; then echo '已有nginx 进程运行,不需要再安装。' echo '' sleep 1 else if [ ! -f "/opt/nginx-1.8.1.tar.gz" ];then echo "nginx-1.8.1 tar.gz 文件不存在,请下载到/opt/ 目录,再运行。" echo "下载地址:http://nginx.org/download/nginx-1.8.1.tar.gz" sleep 2 exit fi ##安装依赖包 yum install gcc gcc-c++ pcre pcre-devel openssl openssl-devel -y useradd -s /sbin/nologin nginx cd /opt tar zxf nginx-1.8.1.tar.gz cd nginx-1.8.1/ ./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx/ make make install #/usr/local/nginx/sbin/nginx #配置nginx 由systemctl来管理。 #创建nginx.service cd /usr/lib/systemd/system touch nginx.service chmod 754 nginx.service cat > /usr/lib/systemd/system/nginx.service << EOF [Unit] Description=nginx - high performance web server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop PrivateTmp=True [Install] WantedBy=multi-user.target EOF systemctl daemon-reload #备份配置文件 cd /usr/local/nginx/conf cp nginx.conf nginx.conf.$(date +%F%H%M%S) #添加nginx 整合PHP代码 cat >/usr/local/nginx/conf/nginx.conf << EOF worker_processes 4; worker_rlimit_nofile 100000; #更改worker进程的最大打开文件数限制. events { worker_connections 409600; use epoll; } http { include mime.types; default_type application/octet-stream; sendfile on; tcp_nodelay on; tcp_nopush on; server_tokens off; #隐藏版本号。 keepalive_timeout 60; gzip on; gzip_disable "msie6"; #设置成IE6或者更低版本禁用gzip功能。 gzip_proxied any; gzip_min_length 1000; #设置对数据启用压缩的最少字节数。 gzip_comp_level 6; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ \.php$ { try_files \$uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; include fastcgi_params; } } } EOF systemctl enable nginx systemctl start nginx ##判断服务是否有启动成功。 if [ $? -ne 0 ]; then echo '' echo "nginx 未能启动成功,请检查....." exit else netstat -luntp echo '' echo 'nginx-1.8.1 安装成功,程序将继续运行。' echo '-------------------------------------------------------' echo '' sleep 1 fi fi echo "开始安装 PHP 7.1.26 ................." sleep 2 ###################### 源码安装 PHP 7.1.26 ################################# PSPHP0=`ps -ef |grep php-fpm |grep -v grep | wc -l` if [ $PSPHP0 -ge 1 ]; then echo 'php 已运行,不需要再安装。' echo '' sleep 1 exit else if [ ! -f "/opt/php-7.1.26.tar.gz" ];then echo "php-7.1.26.tar.gz 文件不存在,请下载到/opt/ 目录,再运行。" echo "下载地址:wget http://php.net/distributions/php-7.1.26.tar.gz" sleep 2 exit fi #安装依赖包: yum install -y libtomcrypt* curl-devel libxslt libxslt-devel cyrus-sasl-plain cyrus-sasl cyrus-sasl-devel cyrus-sasl-lib m4 autoconf openssl openssl-devel pcre pcre-devel zlib* net-tools lrzsz vim wget autoconf automake libxml* ncurses-devel libtool-ltdl-devel* gcc gcc-c++ libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel pcre-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel curl gdbm-devel libXpm-devel libX11-devel gd-devel gmp-devel readline-devel libxslt-devel expat-devel xmlrpc-c xmlrpc-c-devel #安装libmcrypt-2.5.7 cd /opt wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/attic/libmcrypt/libmcrypt-2.5.7.tar.gz tar -zxvf libmcrypt-2.5.7.tar.gz cd libmcrypt-2.5.7 #编译(默认安装到/usr/local/lib/) ./configure #执行安装 make && make install #解压php-7.1.26.tar.gz cd /opt tar zxvf php-7.1.26.tar.gz cd php-7.1.26/ #预编译 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/etc/conf.d --with-mcrypt=/usr/include --with-mysql-sock=/usr/local/mysql-5.7.21/run/ --with-mysqli=mysqlnd --with-pdo-mysql=/usr/local/mysql-5.7.21 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-soap --with-openssl --with-openssl-dir --with-pcre-regex --with-zlib --with-iconv --with-bz2 --enable-calendar --with-curl --with-cdb --enable-dom --enable-exif --with-pcre-dir --enable-ftp --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-gettext --with-gmp --with-mhash --enable-mbstring --with-libmbfl --with-onig --enable-pdo --with-zlib-dir --with-readline --enable-session --enable-shmop --enable-simplexml --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --with-libxml-dir --with-xsl --enable-zip --enable-mysqlnd --without-pear -enable-tokenizer --enable-opcache if [ $? ne 0 ]; then echo "php 7.1.26 预编译有问题,请检查。" sleep 2 exit fi #编译 make #安装 make install #拷贝文件: cd /usr/local/php/etc/ cp php-fpm.conf.default php-fpm.conf cd /usr/local/php/etc/php-fpm.d cp www.conf.default www.conf cp /opt/php-7.1.26/php.ini-development /usr/local/php/etc/php.ini cp -r /opt/php-7.1.26/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm #修改配置文件 sed -i 's#;pid = run/php-fpm.pid#pid = run/php-fpm.pid#g' /usr/local/php/etc/php-fpm.conf sed -i 's#short_open_tag = Off#short_open_tag = On#g' /usr/local/php/etc/php.ini sed -i 's#pdo_mysql.default_socket=#pdo_mysql.default_socket= /usr/local/mysql-5.7.21/run/mysql.sock#g' /usr/local/php/etc/php.ini chmod +x /etc/init.d/php-fpm #配置开机启动 chkconfig --add /etc/init.d/php-fpm chkconfig php-fpm on systemctl start php-fpm #判断php-fpm 是否正常启动 PSPHP1=`ps -ef |grep php-fpm |grep -v grep | wc -l` if [ $PSPHP1 -lt 1 ]; then echo 'php-fpm 启动有问题,请检查。' exit else netstat -luntp echo 'php-fpm 启动成功,程序将继续运行.' sleep 1 fi echo '----------------------------------------------------------' echo "" echo "再次提醒:由于shell中的 source 问题,脚本运行完成后,需要手动执行 source /etc/profile" sleep 3 echo "如果你是用 source 命令运行的该脚本,就不存在问题。" echo "" sleep 3 date fi #############################################################