zoukankan      html  css  js  c++  java
  • centos7 系统下搭建 lnmp 环境

    目录

    概述

    在之前的工作中,搭建过一次 zabbix 监控平台,应用的就是 LNMP 环境,但都是用的 rpm 包直接安装的。
    由于是在阿里云封闭网络环境中搭建的,要想二次利用 LNMP 架构就得重新配置,所以做了本次操作,全部组件都是源码编译,配置成型,方便以后迁移利用。
    也编制了文档,方便查阅、二次编辑。

    准备工作

    本次安装用到的资源包(点击可自动下载):
    MySQL-5.6.40
    Nginx-1.14.0
    PHP-7.1.18
    Apache-2.4.33:虽然不是 LAMP 架构,但还是准备了 Apache 的源码包下载地址,方便你我他。

    将源码包统一放置在 /root/app 下:
    # ls -lh /root/app/
    -rw-r–r–. 1 root root 8.7M May 31 14:17 httpd-2.4.33.tar.gz
    -rw-r–r–. 1 root root 31M May 31 14:17 mysql-5.6.40.tar.gz
    -rw-r–r–. 1 root root 993K May 31 14:17 nginx-1.14.0.tar.gz
    -rw-r–r–. 1 root root 19M May 31 14:17 php-7.1.18.tar.gz

    开始编译安装

    1. 安装 Nginx

    1. 解压

    # tar -xf nginx-1.14.0.tar.gz
    # cd nginx-1.14.0/
    

    2. 环境准备

    # yum -y install gcc
    # useradd -s /sbin/nologin -M nginx
    # id nginx
    # mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
    

    3. 编译过程

    在 Nginx 解压的目录下执行

    ./configure 
    --prefix=/usr/local/nginx 
    --user=nginx 
    --group=nginx 
    --with-http_ssl_module 
    --with-http_flv_module 
    --with-http_stub_status_module 
    --with-http_gzip_static_module 
    --http-client-body-temp-path=/var/tmp/nginx/client 
    --http-proxy-temp-path=/var/tmp/nginx/proxy 
    --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi 
    --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi 
    --http-scgi-temp-path=/var/tmp/nginx/scgi 
    --with-pcre 
    --with-file-aio 
    --with-http_secure_link_module 
    --with-threads
    • 此时可能遇到的报错:

      错误 1:./configure: error: the HTTP rewrite module requires the PCRE library.
      错误 2: ./configure: error: SSL modules require the OpenSSL library.
      解决办法(缺少依赖库,安装就好了)
      # yum -y install pcre-devel
      # yum -y install openssl-devel

    • configure 成功后,执行:
      # make
      # make install
      注:可在编译结束后,通过 echo $? 来查看任务输出码,一般为 0 则是成功。

    4. Nginx 服务

    启动服务
    # /usr/local/nginx/sbin/nginx
    # ss -antp |grep nginx
    LISTEN 0 128 *:80 *:* users:((“nginx”,pid=8814,fd=6), (“nginx”,pid=8813,fd=6))


    设置开机自启动:
    # tail -1 /etc/rc.d/rc.local
    /usr/local/nginx/sbin/nginx
    创建软连接:
    # ln -s /usr/local//nginx/sbin/nginx /usr/bin/nginx

    2. 安装 MySQL

    1. 解压

    # tar -xf mysql-5.6.40.tar.gz
    # cd mysql-5.6.40/

    2. 环境准备

    • 卸载系统原装数据库 mariadb
      # rpm -qa | grep mariadb
      mariadb-libs-5.5.56-2.el7.x86_64
      # rpm -e --nodeps mariadb-libs

    • 创建数据目录
      # mkdir -p /mydata/data

    • 还有很重要的两步
      # groupadd -g 27 mysql
      # useradd -u 27 -g 27 -s /sbin/nologin -M mysql
      # chown -R mysql.mysql /mydata/data/


    注:MySQL5.5 之前的版本使用的是 gcc 编译器,自5.5版本以后,就开始使用 CMake 编译工具了,因此,在安装源文件中找不到 configure 文件是正常的。

    3. 安装 CMake 编译器:

    # rpm -qa |grep cmake
    # yum list |grep cmake
    cmake.x86_64            2.8.12.2-2.el7            base
    cmake-fedora.noarch     2.9.3-1.el7               epel
    cmake-gui.x86_64        2.8.12.2-2.el7            base
    cmake3.x86_64           3.11.0-1.el7              epel
    cmake3-data.noarch      3.11.0-1.el7              epel
    cmake3-doc.noarch       3.11.0-1.el7              epel
    cmake3-gui.x86_64       3.11.0-1.el7              epel
    extra-cmake-modules.noarch     5.36.0-1.el7       epel  
    
    # yum -y install cmake
    

    4. 编译过程

    进入解压的 MySQL 目录执行

    • 环境检查
      # cmake -L

      可能有如下报错:
      … …
      Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
      CMake Error at cmake/readline.cmake:85 (MESSAGE):
      Curses library not found. Please install appropriate package,
      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
      Call Stack (most recent call first):
      cmake/readline.cmake:128 (FIND_CURSES)
      cmake/readline.cmake:218 (MYSQL_USE_BUNDLED_EDITLINE)
      CMakeLists.txt:448 (MYSQL_CHECK_EDITLINE)


      解决办法:
      # yum -y install ncurses-devel
      另外要注意
      错误的编译信息会存放到解压目录下 CMakeCache.txt 文件中,所以每次解决完问题,重新编译需要将此文件删掉.

    • Cmake
    # cmake . 
    -DCMAKE_INSTALL_PREFIX=/usr/local/mysql 
    -DMYSQL_UNIX_ADDR=/tmp/mysql.sock 
    -DDEFAULT_CHARSET=utf8 
    -DDEFAULT_COLLATION=utf8_general_ci 
    -DMYSQL_DATADIR=/mydata/data 
    -DMYSQL_TCP_PORT=3306 
    -DWITH_MYISAM_STORAGE_ENGINE=1 
    -DWITH_INNOBASE_STORAGE_ENGINE=1 
    -DWITH_ARCHIVE_STORAGE_ENGINE=1 
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1
    • make && make install
      # make
      # make install

    5. 初始化数据库

    先修改 mysql 目录的属主属组
    # chown -R mysql.mysql /usr/local/mysql

    单纯执行初始化命令会报错,可能报错如下:
    2018-05-31 16:53:40 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).
    2018-05-31 16:53:40 0 [Note] –secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
    2018-05-31 16:53:40 0 [Note] /usr/local/mysql/bin/mysqld (mysqld 5.6.40) starting as process 87262 …
    2018-05-31 16:53:40 87262 [Note] Plugin ‘FEDERATED’ is disabled.
    /usr/local/mysql/bin/mysqld: Table ‘mysql.plugin’ doesn’t exist
    2018-05-31 16:53:40 87262 [ERROR] Can’t open the mysql.plugin table. Please run mysql_upgrade to create it.


    数据库初始化报错

    网上找了好多相似案例,终于用下面的方法解决了

    先执行如下操作
    /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/data
    再执行初始化命令
    /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/data
    ls -h /mydata/data/
    -rw-rw----. 1 mysql mysql   56 May 31 17:03 auto.cnf
    -rw-rw----. 1 mysql mysql  76M Jun  1 09:21 ibdata1
    -rw-rw----. 1 mysql mysql  48M Jun  1 09:21 ib_logfile0
    -rw-rw----. 1 mysql mysql  48M May 31 16:56 ib_logfile1
    -rw-rw----. 1 mysql mysql  33K Jun  1 09:20 lnmp.linux.com.err
    -rw-rw----. 1 mysql mysql    6 May 31 17:14 lnmp.linux.com.pid
    drwx------. 2 mysql mysql 4.0K May 31 16:56 mysql
    drwx------. 2 mysql mysql 4.0K May 31 16:56 performance_schema
    drwx------. 2 mysql mysql   94 Jun  1 09:21 test

    6. MySQL 服务

    • 启动服务

      # cd /usr/local/mysql/support-files/
      # cp my-default.cnf /etc/my.cnf
      # vim /etc/my.cnf # 此步骤暂不说明,请根据需求自行解决
      # /usr/local/mysql/bin/mysqld_safe --user=mysql & # 这里敲两下回车
      # netstat -antp |grep mysqld
      tcp6 0 0 :::3306 :::* LISTEN 87606/mysqld

    • 设置开机自启动:

      # cp mysql.server /etc/init.d/mysqldd
      # chmod +x /etc/init.d/mysqldd
      # /etc/init.d/mysqldd restart
      Shutting down MySQL..180529 14:29:26 mysqld_safe mysqld from pid file
      /mydata/data/LNMP.linux.com.pid ended SUCCESS!
      [1]+ Done ./bin/mysqld_safe –user=mysql (wd: /usr/local/mysql)
      (wd now: /usr/local/mysql/support-files)
      # chkconfig --add mysqldd
      # chkconfig mysqldd on
      # #chkconfig mysqldd --list
      … …
      mysqldd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

    • 设置全局变量:

      可以在 profile 文件中添加,也可以单独在 profile.d 目录中创建 .sh 文件,我一般用后者:
      # ls -ld /etc/profile*
      -rw-r–r–. 1 root root 1813 May 28 14:04 /etc/profile
      drwxr-xr-x. 2 root root 4096 May 28 17:09 /etc/profile.d
      # vim mysql.sh
      # cat /etc/profile.d/mysql.sh
      export PATH=$PATH:/usr/local/mysql/bin
      # source /etc/profile.d/mysql.sh
      # echo $PATH
      /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin

    3. 安装 PHP

    1. 安装依赖包

    # yum -y install libxml2-devel bzip2-devel libmcrypt libmcrypt-devel mcrypt mhash mhash-devel
    # yum -y install curl-devel libjpeg-devel libpng libpng-devel freetype freetype-devel
    
    PS:为什么我知道安装这些包,因为这是一遍一遍环境检测教育出来的... ...
    

    2. 编译安装

    ./configure 
    --prefix=/usr/local/php7 
    --exec-prefix=/usr/local/php7 
    --bindir=/usr/local/php7/bin 
    --sbindir=/usr/local/php7/sbin 
    --includedir=/usr/local/php7/include 
    --libdir=/usr/local/php7/lib/php 
    --mandir=/usr/local/php7/php/man 
    --with-config-file-path=/usr/local/php7/etc 
    --with-mysql-sock=/tmp/mysql.sock 
    --with-mcrypt=/usr/include 
    --with-mhash 
    --with-openssl 
    --with-mysqli=/usr/local/mysql/bin/mysql_config 
    --with-pdo-mysql=/usr/local/mysql 
    --enable-mysqlnd 
    --with-gd 
    --with-iconv 
    --with-zlib 
    --enable-zip 
    --enable-inline-optimization 
    --disable-debug 
    --disable-rpath 
    --enable-shared 
    --enable-xml 
    --enable-bcmath 
    --enable-shmop 
    --enable-sysvsem 
    --enable-mbregex 
    --enable-mbstring 
    --enable-ftp 
    --enable-gd-native-ttf 
    --enable-pcntl 
    --enable-sockets 
    --with-xmlrpc 
    --enable-soap 
    --without-pear 
    --with-gettext 
    --enable-session 
    --with-curl 
    --with-jpeg-dir 
    --with-freetype-dir 
    --enable-opcache 
    --enable-fpm 
    --with-fpm-user=nginx 
    --with-fpm-group=nginx 
    --without-gdbm 
    --disable-fileinfo  

    为了方便以后的移植(也不知道用不用得上),我把一般能用到的参数都添加上了,此处特别强调一下 mysql 相关的参数,因为我为此重新编译了 MySQL 和 PHP。

    最开始编译时就是从网上 copy 的,包括 - -with-mysql 参数,但是不知道从什么版本(后来查过官网才知道)开始,这个参数就被摒弃了。
    

    重新编译时,加了下面两个参数:
    –with-pdo-mysql=/usr/local/mysql
    –enable-mysqlnd
    加这两个参数的意义,会在文章的后面简单提到
    详解请查看官方文档

    • make && make install
      # make
      # make install

    3. 配置 PHP

    • 拷贝各种配置文件:
    #cd /root/app/php-7.1.18
    #cp php.ini-production /etc/php.ini
    #cd /usr/local/php7/etc
    #cp php-fpm.conf.default php-fpm.conf
    #cd /root/app/php-7.1.18/sapi/fpm
    #cp init.d.php-fpm /etc/init.d/php-fpm
    #chmod a+x /etc/init.d/php-fpm
    
    设置开机自启动
    #chkconfig --add php-fpm
    #chkconfig --list php-fpm
    ...
    php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off
    编辑配置文件,这很重要
    至于各个参数的意义,请自行查找相应文档
    # vim /usr/local/php7/etc/php-fpm.conf
    # cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
    # vim /usr/local/php7/etc/php-fpm.d/www.conf
    
    [root@LNMP.linux.com /usr/local/php7/etc] LNMP
    # grep -Ev '^$|^;' /usr/local/php7/etc/php-fpm.conf
    [global]
    pid = run/php-fpm.pid
    error_log = log/php-fpm.log
    include=/usr/local/php7/etc/php-fpm.d/*.conf
    
    [root@LNMP.linux.com /usr/local/php7/etc] LNMP
    # grep -Ev '^$|^;' php-fpm.d/www.conf
    [www]
    user = nginx
    group = nginx
    listen = 127.0.0.1:9000 
    pm = dynamic
    pm.max_children = 15            # 这些参数自行计算修改,参考官方文档或大神博客
    pm.start_servers = 10
    pm.min_spare_servers = 5
    pm.max_spare_servers = 15
    
    注:以上值的大小必须遵循如下排列
    pm.max_spare_servers > pm.start_servers > pm.min_spare_servers


    • 启动服务

    [root@LNMP.linux.com /usr/local/php7/etc] LNMP
    # /etc/init.d/php-fpm start
    Starting php-fpm done


    [root@LNMP.linux.com /usr/local/php7/etc] LNMP
    # ss -antp |grep php-fpm
    LISTEN 0 128 127.0.0.1:9000 : users:((“php-fpm”,pid=81980,fd=0),(“php-fpm”,pid=81979,fd=0),(“php-fpm”,pid=81978,fd=0),(“php-fpm”,pid=81977,fd=0),(“php-fpm”,pid=81976,fd=0),(“php-fpm”,pid=81975,fd=0),(“php-fpm”,pid=81974,fd=0),(“php-fpm”,pid=81973,fd=0),(“php-fpm”,pid=81972,fd=0),(“php-fpm”,pid=81971,fd=0),(“php-fpm”,pid=81970,fd=7))


    注:
    此时用 systemctl 查看 php-fpm 服务启动状态,看到是未启动的话,就停止 php-fpm 服务.
    然后 systemctl start php-fpm,之前的步骤已经设置过开机自启动,此处不用再做。

    4. 整合 LNMP

    终于编译完这些 balabala… 终于可以干点儿正事儿啦!!!

    1 编辑 Nginx 配置文件

    整合 Nginx 和 PHP,改动内容如下:
    ...
        location / {
            root   html;
            index  index.php a.php index.html index.htm;
            }
        ...
        location ~ .php$  {
               root           /web/docs;
               fastcgi_pass   127.0.0.1:9000;
               fastcgi_index  index.php;
               fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
               include        fastcgi_params;
        }
    

    2 编辑fastcgi_params文件

    • 编辑/usr/local//nginx/conf/fastcgi_params文件,并将内容修改为如下内容,配置fastcgi参数:

    #grep -Ev '^$|^#' /usr/local/nginx/conf/fastcgi_params
    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_NAME        $fastcgi_script_name;
    fastcgi_param  SCRIPT_FILENAME    $document_root$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  REQUEST_SCHEME     $scheme;
    fastcgi_param  HTTPS              $https if_not_empty;
    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
    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;
    fastcgi_param  REDIRECT_STATUS    200;
    

    3 编辑测试页

    在 /web/docs(我自定义了PHP初始页位置,可以不改,默认放在Nginx的html目录下)目录下编写 index.php 和 a.php ,内容如下:

    #cat index.php
        <?php
            phpinfo();
        ?>
    

    编写连接数据库的测试页:

        #cat a.php
        <?php
            $link=mysqli_connect("localhost","root","");
            if ($link)
                echo "Succeed!";
            else
                echo "Fail!";
            mysqli_close();
        ?>
    

    4 访问站点测试效果

    访问 $IP 可以看到 PHP 初始页面 ~ nice


    PHP首页

    访问 $IP/a.php 很可能会有http error 500的报错 ~ XXX


    HTML error 500

    我在测试数据库连接这里卡了一天的时间,看了各个日志,参考了网友同类型报错,但始终解决不了。
    只好重新编译,查找和MySQL相关的参数,如上文提到的,加了那两个参数,再次编译果然能用了。
    

    成功之前,还有一个另类的报错:
    Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /usr/local/nginx/html/a.php:7 Stack trace: #0 {main} thrown in /usr/local/nginx/html/a.php on line 2
    

    这里和PHP版本有关,查看了官方文档,发现自5.5.0版本开始废弃了好多api,并在自 PHP 7.0.0 开始被移除。应使用 MySQLi 或 PDO_MySQL 扩展来替换之。
    具体的可以参考官方文档。链接:http://php.net/manual/zh/ref.mysql.php


    突然想起郭德纲的那句话:“大难不死,必有下回”,在我这应验了,深深的理解了什么叫绝望 T_T

        成功之后竟然还有一个报警!!!
        Warning: mysqli_connect(): Headers and client library minor version mismatch. Headers:50640 Library:50556 in /usr/local/nginx/html/a.php on line 2
    


    PHP-mysql警告页

    对于这个,我实在没耐心继续搞了,毕竟是利用了好多工作时间,欠的工作要补救一下了。也希望有大牛在评论下指点一二


    后记

    用了大概一周的时间,断断续续的编译、搭建,学习了很多,但也发现不懂的更多。官方文档和强大的网友总能给你惊喜,要是没收到,那就歇一会儿再做就好了 ^_^

  • 相关阅读:
    Firefly 介绍
    9秒社团跨平台开发引擎CrossApp宣布正式开源
    页面置换算法
    Selenium
    C++虚函数、虚继承
    链表题目
    二叉树分类
    求连续子数组的最大和
    拓扑排序
    二叉树题目
  • 原文地址:https://www.cnblogs.com/nimo97/p/9704764.html
Copyright © 2011-2022 走看看