LNMP安装201812012237


发表这篇文章最初的意愿是想做个最新版的zabbix使用,后来看了下好多“软件”都升级了(如nginx、mysql等),就想干脆做个最新版本的LNMP环境得了,再单独做zabbix的最新版本省得以后升级

好了,废话不多说,上步骤.......


cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
uname -r
3.10.0-693.el7.x86_64


master IP 192.168.1.122


所有软件包位置: /home/LNMP
所有软件安装位置: /usr/loca/

声明:该教程是在虚拟机下运行的,编译mysql时的机器配置是4G内存,双核。
编译完mysql后正常使用时的配置是448M内存,单核CPU,仅供测试使用


关闭防火墙:
setenforce 0 #临时
systemctl stop firewalld
systemctl disable firewalld
vim /etc/selinux/config
SELINUX=disabled


安装依赖:
yum -y install gcc gcc-c++ ncurses ncurses-devel cmake

添加mysql禁止登陆的用户
groupadd mysql && useradd -r -g mysql -s /sbin/nologin mysql


mysql目录规划
mysql安装目录:/usr/local/mysql
mysql数据目录:/var/lib/mysql
mysql日志目录:/var/log/mysql
mkdir /usr/local/mysql && chown -R mysql.mysql /usr/local/mysql
mkdir /var/lib/mysql && chown -R mysql.mysql /var/lib/mysql
mkdir /var/log/mysql && chown -R mysql.mysql /var/log/mysql


下载包,解压MySQL并编译安装:
注:mysql-boost-5.7.20.tar.gz此版本带有boost
cd /home/LNMP
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.24.tar.gz
tar -zxvf mysql-boost-5.7.24.tar.gz
cd mysql-5.7.24
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/var/lib/mysql
-DDOWNLOAD_BOOST=1
-DWITH_BOOST=/home/LNMP/mysql-5.7.24/boost
-DSYSCONFDIR=/etc
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_PARTITION_STORAGE_ENGINE=1
-DWITH_FEDERATED_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_MYISAM_STORAGE_ENGINE=1
-DENABLED_LOCAL_INFILE=1
-DENABLE_DTRACE=0
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EMBEDDED_SERVER=1

make -j 4 && make install
(此过程比较长)


配置my.cnf文件     (手动添加并编辑该文件)
vim /etc/my.cnf
[client]
port=3306
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8

[mysqld]
port=3306
user=mysql
datadir=/var/lib/mysql/data
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysql.err
pid-file=/var/run/mysql/mysql.pid
character-set-server=utf8
server-id=1
slow_query_log=ON
long_query_time=2
slow_query_log_file=/var/log/mysql/query_log
log_queries_not_using_indexes=ON
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server = utf8
init-connect = 'SET NAMES utf8'
collation-server = utf8_general_ci
explicit_defaults_for_timestamp=true

[mysqld_safe]
log-error=/var/log/mysql/mysql.err
pid-file=/var/run/mysql/mysql.pid

touch /var/log/mysql/{mysql.err,query_log}
chown -R mysql.mysql /var/log/mysql/
chown -R mysql.mysql /usr/local/mysql/
mkdir /var/run/mysql
chown -R mysql.mysql /var/run/mysql

mkdir -p /var/lib/mysql/data

chown -R mysql.mysql /var/lib/mysql

初始化数据库:
cd /usr/local/mysql/bin/      #mysql安装的位置
./mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql/data
######################################################################################
坑1:[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
解决1:在/etc/my.cnf中的mysqld的段中添加explicit_defaults_for_timestamp=true
再执行上面的初始化命令即可
######################################################################################
./mysql_ssl_rsa_setup    #生成秘钥类似的东西,具体是什么还没去细究。该步按需操作


启动数据库:
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
启动mysql:
/etc/init.d/mysqld start
######################################################################################
坑2:
Starting MySQL. ERROR! The server quit without updating PID file (/var/run/mysql/mysql.pid).
解决:/etc/init.d/mysqld status
ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists
rm -rf /var/lib/mysql/data/*    #删除数据目录下的所有
chown mysql.mysql /var/lib/mysql/    #修改数据目录的权限
mkdir /var/run/mysql
chown -R mysql.mysql /var/run/mysql
/etc/init.d/mysqld start   #还有一种可能就是要重新初始化数据库

坑3:

日志中显示:

2019-05-01T09:39:41.098841Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
2019-05-01T09:39:41.098966Z 0 [ERROR] Fatal error: Failed to initialize ACL/grant/time zones structures or failed to remove temporary table files.

解决: rm -rf /var/lib/mysql/* && cd /usr/local/mysql/bin && ./mysqld --initialize-insecure              #单独执行,后面什么都不加

[root@node1 bin]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!

######################################################################################
修改数据库mysql用户的密码:
vim /etc/my.cnf
skip-grant-tables    #手动添加该行

/etc/init.d/mysqld restart

登录数据库:
/usr/local/mysql/bin/mysql #此时登录数据库是将不要密码,直接按回车即可

修改密码:
use mysql;
update mysql.user set authentication_string=password('123456') where user='root';
查看:
select user,host,authentication_string from mysql.user;
刷新:
flush privileges;
修改完毕后exit退出mysql,并再次打开/etc/my.cnf把skip-grant-tables行删除后重启下mysql后即可登录


修改环境变量
vim /etc/profile
PATH=/usr/local/mysql/bin/:$PATH
export PATH

数据库备份:
mysqldump --defaults-extra-file=/etc/my.cnf database > /data/mysql_bak/bak_test.sql    //备份导出数据库
mysql --defaults-extra-file=/etc/my.cnf database < test_db.sql    //导入数据库


问题总结:
mysql -uroot -p123456 -e"grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by '123456';"
提示:mysql: [Warning] Using a password on the command line interface can be insecure.
解释:mysql5.7不能-p直接输入密码,把-p后面的密码去掉其他不变即可


nginx安装
参考地址:https://www.cnblogs.com/zhang-shijie/p/5294162.html
下载地址:http://nginx.org/download/
cd /home/LNMP/
groupadd nginx && useradd -r -g nginx -s /sbin/nologin nginx
yum -y install gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openssl-devel
wget http://nginx.org/download/nginx-1.15.7.tar.gz
tar -zxvf nginx-1.15.7.tar.gz
cd nginx-1.15.7
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx
--conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid
--lock-path=/var/lock/nginx.lock --group=nginx --with-http_ssl_module
--with-http_stub_status_module --with-http_gzip_static_module
--http-client-body-temp-path=/var/tmp/nginx/client/ --user=nginx
--http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre

make && make install

启动前的修改:
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;    #修改启动关闭ngixn的用户
error_log /var/log/nginx/error.log;    #修改错误日志位置
listen 8001;    #修改监听端口,避免和其他发生冲突

mkdir -p /var/tmp/nginx/client/
mkdir /var/run/nginx    #nginx.pid的存放位置

/usr/local/nginx/sbin/nginx    #启动nginx
/usr/local/nginx/sbin/nginx/nginx -s reload    #不停止服务重读配置文件
/usr/local/nginx/sbin/nginx/nginx -s stop    #停止服务
ln -s /usr/local/nginx/sbin/nginx /usr/bin/    #做个软连接
########################################################################
支持的信号:
kill -QUIT 13337    #平缓关闭Nginx,即不再接受新的请求,但是等当前请求处理完毕后再关闭Nginx。
kill -TERM 21665    #快速停止Nginx服务
kill -HUP 21703    #使用新的配置文件启动进程然后平缓停止原有的nginx进程,即平滑重启。
kill -USR1 21703    #重新打开配置文件,用于nginx 日志切割
########################################################################
日期切割的脚本:
#!/bin/bash
PID=`cat /var/run/nginx/nginx.pid`
mv /var/log/nginx/access.log /var/log/nginx/`date +%Y_%m_%d:%H:%M:%S`.access.log
kill -USR1 $PID
[root@Server1 nginx]# kill -USR2 21703      #使用新版本的nginx文件启动服务,然后在平缓停止原有的nginx服务,即平滑升级。
[root@Server1 nginx]# kill -WINCH 21703    #平滑停止nginx的工作进程,用于nginx平滑升级。
########################################################################


PHP安装:
cd /home/LNMP
安装依赖:
yum -y install libxml2 libxml2-devel curl-devel libjpeg-devel libpng-devel freetype-devel
libxslt libxslt-devel cyrus-sasl-plain cyrus-sasl cyrus-sasl-devel cyrus-sasl-lib
m4 autoconf gcc gcc-c++ openssl openssl-devel pcre pcre-devel zlib zlib-devel wget net-tools zip

创建组群:
groupadd php-fpm && useradd -s /sbin/nologin -g php-fpm -M php-fpm

下载包:
wget http://cn2.php.net/distributions/php-7.2.12.tar.gz
tar -zxvf php-7.2.12.tar.gz
cd php-7.2.12

./configure --prefix=/usr/local/php7.2
--with-config-file-path=/usr/local/php7.2/etc
--with-curl --with-gd --with-gettext --with-iconv-dir
--with-kerberos --with-libdir=lib64 --with-libxml-dir=/usr/                            
--with-openssl --with-pcre-regex --with-pdo-sqlite
--with-pear --with-xmlrpc --with-xsl --with-zlib
--enable-fpm --enable-bcmath --enable-libxml
--enable-inline-optimization --enable-mbregex
--enable-mbstring --enable-opcache --enable-pcntl
--enable-shmop --enable-soap --enable-sockets
--enable-sysvsem --enable-xml --enable-zip
--enable-static --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
--with-freetype-dir --with-jpeg-dir --with-png-dir
--disable-debug --disable-fileinfo --enable-fpm

注: --with-libxml-dir=/usr 这个参数在centos7.5上会报 collect2: error: ld returned 1 exit status make: *** [sapi/cli/php] 错误 1 加上/usr即可

make && make install

/usr/local/php7.2/bin/php -v      #查看php版本,也是查看安装是否安装成功

cd /usr/local/php7.2/etc/
cp /home/LNMP/php-7.2.12/php.ini-production php.ini
cp php-fpm.conf.default php-fpm.conf

配置php-fpm
cd php-fpm.d/
[root@localhost php-fpm.d]# pwd
/usr/local/php7.2/etc/php-fpm.d
cp www.conf.default www.conf
find / -name php-fpm
/home/LNMP/php-7.2.12/sapi/fpm/php-fpm
/var/spool/mail/php-fpm
/usr/local/php7.2/sbin/php-fpm
cp /home/LNMP/php-7.2.12/sapi/fpm/php-fpm /etc/init.d/
chmod +x /etc/init.d/php-fpm

启动php:
/etc/init.d/php-fpm
查看php-fpm启动状况
ps -ef | grep php-fpm
修改php.ini相关参数
vim /usr/local/php7.2/etc/php.ini
expose_php = On    #防止Web服务器签名,防止在http头里暴露X-Powered-By:PHP/7.2这样的敏感信息
short_open_tag = On    #启用php短标签
max_execution_time = 120    #PHP程序处理请求的最大时间,单位“秒”
max_input_time = 60    #此变量可以以“秒”为单位对通过POST、GET以及PUT方式接收数据时间进行限制
memory_limit = 128M    #允许使用内存的最大值限制。设置脚本可以分配的最大内存量,防止失控的脚本独占服务器内存
file_uploads = On    #确定服务器上的PHP脚本是否可以接受HTTP文件上传
post_max_size = 8M   #限制通过POST方法可以接受的信息最大量
upload_max_filesize = 7M    #限制PHP处理上传文件的最大值,此值必须小于post_max_size值
date.timezone = Asia/Shanghai    #设置PHP执行的默认时间的时区规则
mbstring.func_overload=2
常用的substr()会被自动替换为 mb_substr()
0:代表不重载任何函数(默认值)
1:代表重载mail()函数
2:代表重载str系列字符串处理函数
4:代表重载ereg系列正则处理函数
7:代表重载所有以上提及的函数


修改www.conf相关参数
vim /usr/local/php7.2/etc/php-fpm.d/www.conf
user = nginx   #启动进程的帐户
group = nginx    #启动进程的组
listen = 127.0.0.1:9000    #该项必须开启
pm = dynamic    #默认即可
pm.max_children = 180      #子进程最大数
pm.start_servers = 50      #启动时的进程数
pm.min_spare_servers = 50    #前提是pm = dynamic,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers = 180    #前提是pm = dynamic,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
pm.max_requests = 500    #设置每个子进程重生之前服务的请求数,如为0则一直接受请求
request_terminate_timeout = 180   #设置单个请求的超时中止时间
###############################################################################
FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到
;pm.status_path = /status
FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。
;ping.path = /ping
用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.
;ping.response = pong
设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用.
设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项
request_terminate_timeout = 180
当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中,0为关闭
;request_slowlog_timeout = 10
慢请求的记录日志,配合request_slowlog_timeout使用
;slowlog = log/$pool.log.slow
设置文件打开描述符的rlimit限制,默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改
;rlimit_files = 1024
设置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整数. 默认值: 系统定义值
;rlimit_core = 0
启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用
;chroot =
设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录
;chdir = /var/www
重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空
;catch_workers_output = yes
###############################################################################


配置php-fpm.conf
vim /usr/local/php7.2/etc/php-fpm.conf
pid = /usr/local/php7.2/run/php-fpm.pid
;error_log = log/php-fpm.log    #按需打开,这里未开启
;log_level = notice    #错误级别,alert(必须立即处理)error(错误情况)warning(警告情况)notice(一般重要信息)debug(调试信)
;emergency_restart_interval = 0

#在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过这个数,php-fpm就会重启。一般保持默认值


启动php-fpm:
/usr/local/php7.2/sbin/php-fpm
添加开机启动php-fpm
echo "/usr/local/php7.2/sbin/php-fpm">>/etc/rc.local


修改nginx解析php页面:
vim /usr/local/nginx/conf/nginx.conf
....
  .....
    location / {
    root html;
    index index.php index.html index.htm;
    }
....
  ....
    location ~ .php$ {
    root html;      #指定php的根目录
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }


vim /usr/local/nginx/html/index.php
<?php
  phpinfo();
?>

浏览器访问: IP + Port/index.php

zabbix安装(接上面的环境)
#如果直接在以下命令中加上密码会输出一条类似错误的信息,mysql5.7的一种机制

mysql -uroot -p -e"create database zabbix character set utf8;"
mysql -uroot -p -e"grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by '123456';"
mysql -uroot -p -e"grant all privileges on zabbix.* to 'zabbix'@'%' identified by '123456';"
mysql -uroot -p -e"grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by '123456';"
/etc/init.d/mysqld restart
rpm -i https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent
导入数据库:
zcat /usr/share/doc/zabbix-server-mysql-4.0.2/create.sql.gz |mysql -uroot -p zabbix

为Zabbix服务器配置数据库:
vim /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log    #保持默认
LogFileSize=0    #保持默认
PidFile=/var/run/zabbix/zabbix_server.pid    #保持默认
SocketDir=/var/run/zabbix    #保持默认
DBHost=localhost    #待测试改变成IP形式
DBName=zabbix    #保持默认
DBUser=zabbix    #保持默认
DBPassword=123456    #登录数据库的zabbix用户的密码

启动zabbix:

groupadd apache && useradd -s /sbin/nologin -g php-fpm -M apache
service zabbix-server start
service zabbix-agent start
systemctl enable zabbix-server
systemctl enable zabbix-agent
chkconfig --level 2345 zabbix-server on
chkconfig --level 2345 zabbix-agent on

Zabbix前端配置
vim /etc/httpd/conf.d/zabbix.conf
  php_value date.timezone Asia/Shanghai      #所有都不用改,仅取消该行注释并修改为亚洲时区

修改httpd的端口:

vim /etc/httpd/conf/httpd.conf

  Listen 8002

启动httpd:service httpd start

访问zabbix:http://ip:8002/zabbix

账/密:Admin/Zabbix

      zabbix配置版块可以参照我的上几篇文章


统一启动:
/usr/local/nginx/sbin/nginx
service httpd start
/etc/init.d/mysqld restart
/usr/local/php7.2/sbin/php-fpm
报错1:
Unable to create the PID file (/usr/local/php7.2/run/php-fpm.pid).: No such file or directory (2)
解决:
mkdir /usr/local/php7.2/run    #再启动php-fpm


最后配置zabbix,这里不做详细解释....
这样就实现了我的最新版的LNMP和最新版的zabbix的安装

原文地址:https://www.cnblogs.com/smlile-you-me/p/10051526.html