Centos 8.0 LNMPR

#!/bin/bash
#CentOS 8 lnmp auto setup shell script
#2020-02-10
#LNMP (mysql 5.7.25 php 7.1.6 nginx 1.15.9 )+Redis5.05 源码安装
#Version 1.0
################# 基础环境检查 ####################
function chk_base(){
clear
date
echo " Centos 8 部署 LNMPR "
echo "###################################"
echo "# Mysql:5.7.25 Nginx:1.15.9 #"
echo "# Php: 7.1.6 Redis:5.05 #"
echo "###################################"
for i in `seq -w 3 -1 0`
do
echo -ne "\b\b\b\b$i 秒";
sleep 1
done
MYVER=`cat /etc/redhat-release |awk '{print $4}'| awk -F [.] '{print $1}'`
if [ $MYVER -ne 8 ]; then
echo "请在 8 版本的系统里面运行该脚本....."
exit
fi
if [ $UID -ne 0 ]; then
echo "请用 root 用户运行该脚本...."
exit
fi
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 '网络正常,程序将继续运行.'
sleep 1
fi
fi
}
############## 源码二进制安装 mysql 5.7.25 #################
function mysql_setup(){
SOFT_ADD="http://www.xchinagroup.top/softdown"
#更改yum源为阿里云的yum源
ls /etc/yum.repos.d/*.repo 2>/tmp/repo_n.log >/tmp/repo_y.log
if [ $? -eq 0 ];then
mv /etc/yum.repos.d/*.repo /tmp/
wget -q -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
yum makecache >/tmp/yum_update.log 2>&1
else
wget -q -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
yum makecache >/tmp/yum_update.log 2>&1
fi
yum install wget tar net-tools -y >/tmp/a.txt 2>&1
echo "开始安装 Mysql 5.7.25........................................"
sleep 2
PSMYSQL0=`ps -ef |grep mysqld |grep -v grep | wc -l`
if [ $PSMYSQL0 -ge 1 ]; then
echo '已有mysql 进程运行,不需要再安装。'
ps -ef |grep mysqld | grep -v grep
sleep 1
else
if [ ! -f "/opt/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz" ];then
echo "mysql5.7.25 二进制tar.gz 文件不存在,我们将在网上下载........"
sleep 2
cd /opt
echo "正在下载............."
wget -q ${SOFT_ADD}/centos7/03_mysql/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
if [ $? -ne 0 ]; then
echo "下载有问题,请检查......"
exit
fi
fi
#yum 安装 依赖包
yum -y install cmake openssl-devel ncurses-devel bison git ncurses-devel libaio gcc gcc-c++ lrzsz wget vim >/tmp/mysql_yl.log 2>&1
#卸载mariadb
yum remove mariadb* -y >/tmp/mariadb.log 2>&1
cd /opt
tar -zxf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz -C /usr/local
cd /usr/local
mv mysql-5.7.25-linux-glibc2.12-x86_64 mysql-5.7.25
#创建用户和组
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
#配置环境变量
echo "export PATH=$PATH:/usr/local/mysql-5.7.25/bin" >> /etc/profile
source /etc/profile
#配置数据库目录,创建日志文件,授权。
mkdir -p /usr/local/mysql-5.7.25/{data,log,etc,run}
touch /usr/local/mysql-5.7.25/log/mysql_error.log
chown -R mysql:mysql /usr/local/mysql-5.7.25
chmod -R 777 /usr/local/mysql-5.7.25/{data,log,etc,run}
#配置my.cnf
cat >/etc/my.cnf << EOF
[mysqld]
port = 3306
socket = /usr/local/mysql-5.7.25/run/mysql.sock
pid_file = /usr/local/mysql-5.7.25/run/mysql.pid
basedir = /usr/local/mysql-5.7.25
datadir = /usr/local/mysql-5.7.25/data
default_storage_engine = InnoDB
max_allowed_packet = 128M
max_connections = 2048
open_files_limit = 65535
skip-name-resolve=on
log_slave_updates=1
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.25/log/mysql_error.log
log-bin = /usr/local/mysql-5.7.25/log/mysql_bin
slow_query_log = on
slow_query_log_file = /usr/local/mysql-5.7.25/log/mysql_slow_query.log
long_query_time = 3
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.25/run/mysql.sock
EOF
#初始化
mysqld --initialize --user=mysql --basedir=/usr/local/mysql-5.7.25/ --datadir=/usr/local/mysql-5.7.25/data/
if [ $? -ne 0 ]; then
echo "Mysql 初始化有问题,请检查....."
exit
fi
#配置服务,使用systemctl管理服务。
touch /usr/lib/systemd/system/mysqld.service
chmod 754 /usr/lib/systemd/system/mysqld.service
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.25/run/mysql.pid
#Disable service start and stop timeout logic of systemd for mysqld servi
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.25/bin/mysqld --daemonize --pid-file=/usr/local/mysql-5.7.25/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 >/tmp/mysqd.enable.log 2>&1
systemctl start mysqld
#判断mysql 启动有无问题
if [ $? -ne 0 ]; then
echo "Mysql 启动有问题,请检查....."
exit
fi
#添加libncurses.so.5的软连接
#由于Centos8的库都比较新,mysql支持的库较旧,
#所以会报libncurses.so.5 还有libtinfo.so.5找不到的问题
#可以创建libncurses.so.5 指向libncurses.so.6.1的软连接,
#这个共享库可以向下兼容。
if [ ! -f "/usr/lib64/libncurses.so.5" ];then
if [ -f "/usr/lib64/libncurses.so.6.1" ];then
cd /usr/lib64
ln -s libncurses.so.6.1 libncurses.so.5
ln -s libtinfo.so.6.1 libtinfo.so.5
else
echo "缺少libncurses.so.6.1 共享库文件....."
exit
fi
fi
PASSW=`grep 'temporary password' /usr/local/mysql-5.7.25/log/mysql_error.log |awk '{print $11}'`

#修改 mysql 的root 密码
cd /usr/local/mysql-5.7.25/bin/
./mysqladmin -uroot -p"$PASSW" password "Dfsc123321" 2>>/tmp/mysqladmin.log
#用修改后的密码,连接,创建数据库。
mysql -uroot -pDfsc123321 -e "create database abc charset=utf8;" 2>/tmp/mysql.test
#判断创建数据库命令是否执行成功,来确定,mysql root密码是否有修改成功。
if [ $? -ne 0 ]; then
echo "Mysql 密码修改未成功,请检查....."
exit
else
netstat -luntp |grep mysqld
echo -e "\033[31m mysql 5.7.25 安装成功,程序将继续运行。\033[0m"
sleep 1
fi
fi
}
########### 源码安装 nginx-1.15.9 ##########################
function nginx_setup(){
echo "开始安装 Nginx 1.15.9 ............................................."
sleep 2
PSNGINX0=`netstat -luntp |grep nginx|wc -l`
if [ $PSNGINX0 -ge 1 ]; then
echo '已有nginx 进程运行,不需要再安装。'
ps -ef |grep nginx | grep -v grep
sleep 1
else
if [ ! -f "/opt/nginx-1.15.9.tar.gz" ];then
echo "nginx-1.15.9.tar.gz 文件不存在,我们将在网上下载....."
sleep 2
cd /opt
echo "正在下载......"
wget -q ${SOFT_ADD}/centos7/02_nginx/nginx-1.15.9.tar.gz
if [ $? -ne 0 ]; then
echo "下载有问题,请检查......"
exit
fi
fi
##安装依赖包
yum install gcc gcc-c++ make pcre pcre-devel openssl openssl-devel ncurses-devel -y >/tmp/nginx_yl.log 2>&1
useradd -s /sbin/nologin nginx
cd /opt
tar zxf nginx-1.15.9.tar.gz
cd nginx-1.15.9/
./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx/ >/tmp/nginx_yby.log 2>&1
if [ $? -ne 0 ]; then
echo "Nginx 1.15.9 预编译有问题,日志文件/tmp/nginx_yby.log。"
sleep 1
exit
fi
make >/tmp/nginx_by.log 2>&1
if [ $? -ne 0 ]; then
echo "Nginx 1.15.9 编译有问题,日志文件/tmp/nginx_by.log。"
sleep 1
exit
fi
make install >/tmp/nginx.install.log 2>&1
#/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;
events {
worker_connections 409600;
}

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";
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 >/tmp/nginx.enable 2>&1
systemctl start nginx
##判断服务是否有启动成功。
if [ $? -ne 0 ]; then
echo "nginx 未能启动成功,请检查....."
exit
else
netstat -luntp |grep nginx
echo -e "\033[31m nginx-1.15.9 安装成功,程序将继续运行。\033[0m"
sleep 1
fi
fi
}
############### 源码安装 PHP 7.1.6 ############################
function php_setup(){
echo "开始安装 PHP 7.1.6 ................."
sleep 2
PSPHP0=`ps -ef |grep php-fpm |grep -v grep | wc -l`
if [ $PSPHP0 -ge 1 ]; then
echo 'php 已运行,不需要再安装。'
ps -ef |grep php | grep -v grep
sleep 1
netstat -luntp |grep php
else
if [ ! -f "/opt/php-7.1.6.tar.gz" ];then
echo "php-7.1.6.tar.gz 文件不存在,我们将在网上下载......"
sleep 2
cd /opt
wget -q ${SOFT_ADD}/centos7/01_php/php-7.1.6.tar.gz
if [ $? -ne 0 ]; then
echo ''
echo "下载有问题,请检查......"
exit
fi
fi
#安装依赖包:
yum install -y curl-devel freetype-devel libxslt-devel cyrus-sasl-plain cyrus-sasl cyrus-sasl-devel m4 autoconf openssl openssl-devel ncurses-devel pcre-devel automake libtool-ltdl-devel libjpeg libjpeg-devel glibc glib2 glib2-devel bzip2 curl gdbm-devel libXpm-devel gd-devel gmp-devel readline-devel >/tmp/php_yl.log 2>&1
#安装re2c-1.0.1.tar.gz
if [ ! -f "/opt/re2c-1.0.1.tar.gz" ];then
echo "re2c-1.0.1.tar.gz 文件不存在,我们将在网上下载........"
sleep 2
cd /opt
echo "正在下载............."
wget -q ${SOFT_ADD}/centos7/01_php/re2c-1.0.1.tar.gz
if [ $? -ne 0 ]; then
echo "下载有问题,请检查......"
exit
fi
tar zxf re2c-1.0.1.tar.gz
cd re2c-1.0.1
./configure >/tmp/re2c1.log 2>&1
make >/tmp/re2c2.log 2>&1
make install >/tmp/re2c3.log 2>&1
fi
#解压php-7.1.6.tar.gz
cd /opt
tar zxf php-7.1.6.tar.gz
cd php-7.1.6/
#预编译
./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-mysql-sock=/usr/local/mysql-5.7.25/run/ --with-mysqli=mysqlnd --with-pdo-mysql=/usr/local/mysql-5.7.25 --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 >/tmp/php7.1.6.by.log 2>&1

if [ $? -ne 0 ]; then
echo "php 7.1.6 预编译有问题,日志文件/tmp/php7.1.6.by.log。"
sleep 2
exit
fi
#编译
make >/tmp/php7.1.6.make.log 2>&1
if [ $? -ne 0 ]; then
echo "php 7.1.6 编译有问题,日志文件/tmp/php7.1.6.make.log。"
sleep 2
exit
fi
#安装
make install >/tmp/php7.1.6.install.log 2>&1
if [ $? -ne 0 ]; then
echo "php 7.1.6 安装有问题,日志文件/tmp/php7.1.6.install.log。"
sleep 2
exit
fi
#拷贝文件:
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.6/php.ini-development /usr/local/php/etc/php.ini
cp -r /opt/php-7.1.6/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.25/run/mysql.sock#g' /usr/local/php/etc/php.ini
echo "[Zend Opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=200000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.validate_timestamps=1
opcache.file_cache=/tmp" >>/usr/local/php/etc/php.ini
cat >/usr/local/nginx/html/test.php <<EOF
<?php
phpinfo();
?>
EOF
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 |grep php-fpm
echo -e "\033[31m php7.1.6 启动成功,程序将继续运行.\033[0m"
sleep 1
fi
fi
}
############### 源码安装 Redis 5.05 ############################
function redis_setup(){
REDIS=`ps -ef |grep redis |grep -v grep | wc -l`
echo "开始安装 Redis 5.05 ................."
sleep 2
if [ $REDIS -ge 1 ]; then
echo 'Redis 已运行,不需要再安装。'
echo ''
ps -ef |grep redis | grep -v redis
sleep 1
netstat -luntp |grep redis
else
if [ ! -f "/opt/redis-5.0.5.tar.gz" ];then
echo "redis-5.0.5.tar.gz 文件不存在,我们将在网上下载......"
sleep 2
cd /opt
echo "正在下载..........."
wget -q ${SOFT_ADD}/centos7/09_redis/redis-5.0.5.tar.gz
if [ $? -ne 0 ]; then
echo ''
echo "下载有问题,请检查......"
exit
fi
fi
#安装依赖包:
yum install gcc gcc-c++ wget vim -y &>/tmp/redis_yl.log 2>&1
cd /opt
tar zxf redis-5.0.5.tar.gz
cd redis-5.0.5/
make PREFIX=/usr/local/redis install >/tmp/redis_by.log 2>&1
if [ $? -ne 0 ]; then
echo "redis 5.05 预编译有问题,请检查。"
sleep 2
exit
fi
#redis 服务器的内核参数调整:
echo "net.core.somaxconn= 1024" >>/etc/sysctl.conf
echo "vm.overcommit_memory=1" >>/etc/sysctl.conf
sysctl -p >/tmp/sysctl_p.log
cp /opt/redis-5.0.5/redis.conf /usr/local/redis/bin/
#修改配置文件
sed -i 's#daemonize no#daemonize yes#g' /usr/local/redis/bin/redis.conf
sed -i '/requirepass foobared/a \requirepass dfsc!@#ia..2018' /usr/local/redis/bin/redis.conf
#配置redis服务由systemctl 管理
touch /usr/lib/systemd/system/redisd.service
chmod 754 /usr/lib/systemd/system/redisd.service
cat >/usr/lib/systemd/system/redisd.service << EOF
[Unit]
Description=Redis
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/redis-cli
systemctl enable redisd >/tmp/redis.enable.log 2>&1
systemctl start redisd
#判断Redis 是否正常启动
REDIS1=`ps -ef |grep redis-server |grep -v grep | wc -l`
if [ $PSPHP1 -lt 1 ]; then
echo 'Redis 启动有问题,请检查。'
exit
else
netstat -luntp |grep redis
echo -e "\033[31m Redis 5.0.5 安装成功,程序将继续运行。\033[0m"
sleep 1
fi
fi
}

#安装PHP 的 redis 4.3 扩展
function redis_kz(){
echo "开始安装 php redis 4.3 扩展......."
REDIS_KZ=`sed -n '/redis.so/p' /usr/local/php/etc/php.ini |head -1|awk -F '=' '{print $2}'`
if [ ! -z ${REDIS_KZ} ];then
echo "redis 扩展已安装,不需要再次安装。"
else
if [ ! -f "/opt/redis-4.3.0.tgz" ];then
echo "redis-4.3.0.tgz 文件不存在,我们将在网上下载......"
sleep 2
cd /opt
echo "正在下载....."
wget -q ${SOFT_ADD}/centos7/01_php/redis-4.3.0.tgz
if [ $? -ne 0 ]; then
echo ''
echo "下载有问题,请检查......"
exit
fi
fi
cd /opt
PHPIZE_FILE=`find /usr/local -name "phpize" |head -1`
PHPCON_FILE=`find /usr/local -name "php-config" |head -1`
PHPINI_FILE=`find /usr/local -name "php.ini" |head -1`
tar zxf redis-4.3.0.tgz
cd redis-4.3.0/

$PHPIZE_FILE >/tmp/phpize.redis.log 2>&1
./configure --with-php-config=$PHPCON_FILE >/tmp/php-redis4.3.log 2>&1
if [ $? -ne 0 ]; then
echo "PHP redis-4.3.0 扩展预编译有问题,请检查。"
sleep 2
exit
fi

make >/tmp/php-redis4.3.mak 2>&1
make install >/tmp/php-redis4.3.install 2>&1
sed -i '/;extension=php_xsl.dll/a \extension=redis.so' $PHPINI_FILE
systemctl restart php-fpm
echo -e "\033[31m PHP redis-4.3.0 扩展安装成功。\033[0m "
echo '----------------------------------------------------------'
echo -e "\033[31m 脚本运行完成后,需要手动执行 source /etc/profile \033[0m"
echo -e "\033[31m 如果你是用 source 命令运行的该脚本,就不存在问题。\033[0m"
echo ""
sleep 3
fi
}

########
START_TIME=`date +%s`
chk_base
mysql_setup
nginx_setup
php_setup
redis_setup
redis_kz
date
END_TIME=`date +%s`
#程序总花费的时间,计算出来是秒为单位的。
TOTAL_TIME=`expr $(($END_TIME-$START_TIME))`
#程序总花费的时间 对 3600 取模,得到小时数
TOTAL_H=`expr $TOTAL_TIME / 3600`
#程序总花费的时间对3600取余,再对 60 取模,得到 分钟数
TOTAL_M=`expr $TOTAL_TIME % 3600 / 60`
##程序总花费的时间对3600取余,再对 60 取余,得到 秒数
TOTAL_S=`expr $TOTAL_TIME % 3600 % 60`
echo "程序总耗时: $TOTAL_H 小时 $TOTAL_M 分 $TOTAL_S 秒 。"
########################################################