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警告页

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


    后记

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

  • 相关阅读:
    CSS之旅——第二站 如何更深入的理解各种选择器
    CSS之旅——第一站 为什么要用CSS
    记录一些在用wcf的过程中走过的泥巴路 【第一篇】
    asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
    asp.net mvc 之旅—— 第一站 从简单的razor入手
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
    Sql Server之旅——第十四站 深入的探讨锁机制
    Sql Server之旅——第十三站 对锁的初步认识
    Sql Server之旅——第十二站 sqltext的参数化处理
    Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  • 原文地址:https://www.cnblogs.com/nimo97/p/9704764.html
Copyright © 2011-2022 走看看