• LNMP环境搭建(PHP7.4.0)


    作为一名PHP开发者,我们一定要懂得如何搭建PHP开发环境,目前主流的PHP开发环境组合是LAMP和LNMP,本文将介绍如何在CentOS7.*上搭建LNMP开发环境。

    各项版本说明:

    CentOS7: 7.7

    Nginx: 1.16.1

    MySQL:5.7.28

    PHP:7.4.0

    准备工作

    安装wget

    wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的TCP/IP协议下载,并可以可以使用HTTP代理。

    sudo yum install wget
    

    安装net-tools

    最小化安装CentOS7时如果无法使用ifconfig命令,则需要安装net-tools,如果是安装的CentOS6版本则无需安装

    sudo yum -y install net-tools
    

    安装vim

    sudo yum -y install vim
    

    配置显示行号

    vim ~/.vimrc # 编辑.vimrc配置文件
    set nu # 输入set nu 后退出保存
    

    关闭防火墙

    systemctl stop firewalld.service  #令关闭防火墙
    systemctl disable firewalld.service  #关闭防火墙开机自启动
    通过浏览器输入IP测试是否成功
    

    安装Nginx

    安装依赖

    (1) 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装gcc-c++。

    yum -y install gcc gcc-c++
    

    (2) PCRE是一个Perl库,中文"Perl兼容的正则表达式库"。安装Nginx是为了使Nginx支持具备URI重写功能的rewrite模块,如果不安装pcre库,则Nginx无法使用rewrite模块功能,Nginx的Rewrite模块功能几乎是企业应用必须。

    yum -y install pcre pcre-devel
    

    (3) zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

    yum -y install zlib zlib-devel
    

    (4) OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。 nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要安装 OpenSSL 库 。

    yum -y install openssl openssl-devel
    

    说明: yum安装方式安装的pcre版本比较低,不过基本不影响使用,但是最好还是手动编译安装官网最新稳定版的openssl。

    检查基础依赖包

    上面的依赖安装完成后可以通过如下命令检查各个依赖安装是否成功

    rpm -qa pcre pcre-devel
    rpm -qa zlib zlib-devel
    rpm -qa pcre pcre-devel
    

    编译安装Nginx

    # 这里我们把安装包都放到了/usr/local/src目录下,便于统一管理
    cd /usr/local/src  #切换到软件包目录
    wget http://nginx.org/download/nginx-1.16.1.tar.gz   #下载nginx源码包
    useradd nginx -s /sbin/nologin -M   #创建nginx用户用于管理nginx程序
    tar -zxvf nginx-1.16.1.tar.gz  #解压nginx源码包
    
    cd nginx-1.16.1
    
    #注意,这里由于自定义了openssl位置,make时会报错,需要修改一个nginx源码里的一个conf文件
    #/usr/local/src/nginx-1.16.1/auto/lib/openssl/conf,修改方法见印象笔记
    
    #预编译
    ./configure 
    --user=nginx 
    --group=nginx 
    --prefix=/usr/local/nginx-1.16.1 
    --with-http_v2_module 
    --with-http_ssl_module 
    --with-http_stub_status_module
    
    make && make install #编译 和 安装
    
    cd /usr/local
    ln -s nginx-1.16.1 nginx  #创建nginx的软链接
    

    安装说明

    --prefix=PATH    #设置安装路劲
    --user=USER      #进程用户权限
    --group=GROUP    #进程用户组权限
    --with-http_v2_module  # HTTP2
    --with-http_stub_status_module   #激活状态信息
    --with-http_ssl_module  #激活ssl功能
    

    配置环境变量

    vim /etc/profile
    export PATH=/usr/local/nginx/sbin:$PATH
    source /etc/profile
    

    Systemd管理

    新建并编辑/usr/lib/systemd/system/nginx.service 文件

    vim /usr/lib/systemd/system/nginx.service
    

    并添加如下内容(这里的配置是根据自己安装Nginx的路径来配置的,Nginx安装在了/usr/local目录下)

    [Unit]
    Description=The nginx HTTP and reverse proxy server
    After=network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    ExecStartPre=/usr/local/nginx/sbin/nginx -t
    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
    

    通过yum安装的nginx,默认的nginx.service配置如下,可以作为参考

    # /usr/lib/systemd/system/nginx.service
    [Unit]
    Description=The nginx HTTP and reverse proxy server
    After=network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    PIDFile=/run/nginx.pid
    # Nginx will fail to start if /run/nginx.pid already exists but has the wrong
    # SELinux context. This might happen when running `nginx -t` from the cmdline.
    # https://bugzilla.redhat.com/show_bug.cgi?id=1268621
    ExecStartPre=/usr/bin/rm -f /run/nginx.pid
    ExecStartPre=/usr/sbin/nginx -t
    ExecStart=/usr/sbin/nginx
    ExecReload=/bin/kill -s HUP $MAINPID
    KillSignal=SIGQUIT
    TimeoutStopSec=5
    KillMode=process
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    

    重载daemon

    执行下面的命令重新载入 systemd,扫描新的或有变动的单元即可

    systemctl daemon-reload
    

    设置开机自启

    systemctl enable nginx.service # 设置开机自启
    systemctl disable nginx.service # 取消开机自启服务
    

    Nginx服务管理常用命令

    systemctl status nginx.service # 查看Nginx状态
    systemctl start nginx.service # 开启Nginx
    systemctl stop nginx.service # 关闭Nginx
    systemctl reload nginx.service # 重载配置
    systemctl restart nginx.service  # 重启Nginx(相当于stop&start)
    

    服务启动检查

    可以通过该命令查询80端口被谁占用

    lsof -i :80
    

    如果无法识别该命令,需要安装lsof

    sudo yum -y install lsof
    

    安装MySQL

    安装依赖

    (1)cmake是新版MySQL的编译工具,必须安装

    sudo yum -y install ncurses-devel perl perl-devel autoconf
    

    不使用yum方式安装cmake,因为默认的cmake版本较低,这会导致在后面安装PHP时出现版本过低,无法安装的问题,因为安装MySQL需要cmake,所以在这里直接装最新稳定版cmake

    cd /usr/local/src
    yum remove cmake
    wget https://github.com/Kitware/CMake/releases/download/v3.16.1/cmake-3.16.1.tar.gz
    tar -zxvf cmake-3.16.1.tar.gz
    
    cd cmake-3.16.1
    ./configure 
    --prefix=/usr/local/cmake
    make && make install
    
    cd /usr/local
    ln -s /usr/local/cmake/bin/cmake /usr/bin/cmake
    # ln -s /usr/local/cmake/share/cmake-3.16.1 /usr/share/cmake
    

    下载boost

    如果安装的MySQL5.7及以上的版本,在编译安装之前需要安装boost,因为高版本mysql需要boots库的安装才可以正常运行。否则会报CMake Error at cmake/boost.cmake:81 错误

    切换到/usr/local/src目录,然后在这个目录下下载boost
    MySQL5.7.28要求boost的版本是1.59,更高版本的不适用MySQL5.7.28

    wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
    

    编译安装MySQL

    # 添加MySQL用户
    useradd -s /sbin/nologin -M mysql
    
    # 切换到/usr/src目录
    cd /usr/local/src
    
    # 下载MySQL
    wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28.tar.gz
    
    # 解压MySQL
    tar -zxvf mysql-5.7.28.tar.gz
    
    #解压boost,并移至mysql/boost
    tar -zxvf boost_1_59_0.tar.gz
    mv boost_1_59_0 mysql-5.7.28/boost
    
    # 进到MySQL目录
    cd mysql-5.7.28
    
    # 预编译
    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.28 
    -DWITH_BOOST=boost 
    -DWITH_SYSTEMD=1 
    -DWITH_SSL=system 
    -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock 
    -DMYSQL_DATADIR=/var/lib/mysql/data 
    -DDEFAULT_CHARSET=utf8mb4 
    -DDEFAULT_COLLATION=utf8mb4_general_ci 
    -DWITH_EXTRA_CHARSETS=all 
    -DWITH_MYISAM_STORAGE_ENGINE=1 
    -DWITH_INNOBASE_STORAGE_ENGINE=1 
    -DWITH_MEMORY_STORAGE_ENGINE=1 
    -DWITH_READLINE=1 
    -DWITH_INNODB_MEMCACHED=1 
    -DWITH_DEBUG=OFF 
    -DWITH_ZLIB=bundled 
    -DENABLED_LOCAL_INFILE=1 
    -DENABLED_PROFILING=ON 
    -DMYSQL_MAINTAINER_MODE=OFF 
    -DMYSQL_TCP_PORT=3306
    
    # 编译&安装
    make && make install
    
    # 创建软链接
    cd /usr/local
    ln -s mysql-5.7.28 mysql
    

    配置环境变量

    # 添加到环境变量
    vim /etc/profile
    export PATH=/usr/local/mysql/bin:$PATH
    source /etc/profile
    

    修改配置文件

    1. /var/lib目录下创建一个mysql文件夹

      mkdir -p /var/lib/{mysql,mysql/data}
      touch /var/lib/mysql/mysqld.pid
      chown mysql.mysql -R /var/lib/mysql/
      
    2. 修改/etc/my.cnf文件

      # 修改/etc/my.cnf文件,编辑配置文件如下
      [mysqld]
      character-set-server=utf8mb4
      collation-server=utf8mb4_general_ci
      datadir=/var/lib/mysql/data
      socket=/var/lib/mysql/mysql.sock
      
      [mysqld_safe]
      log-error=/var/log/mysql/mysqld.log
      pid-file=/var/lib/mysql/mysqld.pid
      
      [client]
      default-character-set=utf8mb4
      
    3. 创建mysqld.logmysqld.pid文件,并修改文件权限

      # 创建mysqld.log 和 mysqld.pid文件
      mkdir /var/log/mysql
      touch /var/log/mysql/mysqld.log
      chown mysql.mysql -R /var/log/mysql/
      
    4. 初始化数据库

      # 初始化数据库, –initialize 表示默认生成一个安全的密码,–initialize-insecure 表示不生成密码
      mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql/data
      

    Systemd管理

    创建一个/usr/lib/systemd/system/mysqld.service文件,然后编辑内容如下

    vim /usr/lib/systemd/system/mysqld.service
    
    [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=/var/lib/mysql/mysqld.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/local/mysql/bin/mysqld_pre_systemd
    
    # Start main service
    ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/lib/mysql/mysqld.pid $MYSQLD_OPTS
    
    # Use this to switch malloc implementation
    EnvironmentFile=/etc/my.cnf
    
    # Sets open_files_limit
    LimitNOFILE = 5000
    
    Restart=on-failure
    
    RestartPreventExitStatus=1
    
    PrivateTmp=false
    

    重载daemon

    执行下面的命令重新载入 systemd,扫描新的或有变动的单元即可

    systemctl daemon-reload
    

    启动MySQL

    systemctl start mysqld.service # 启动MySQL
    systemctl stop mysqld.service # 关闭MySQL
    systemctl status mysqld.service # 查看MySQL状态
    

    开机自启

    systemctl enable mysqld.service # 设置开机自启
    systemctl disable mysqld.service # 取消开机自启
    

    登录MySQL

    mysql -u root -p #第一次登陆不需要密码,回车即可
    set password for root@localhost = password('root');  #修改密码
    

    安装PHP

    安装依赖

    sudo yum -y install gcc gcc-c++ zip unzip libxml2 libxml2-devel curl-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel gd-devel bzip2 bzip2-devel libsqlite3x libsqlite3x-devel oniguruma oniguruma-devel
    

    升级libzip

    yum remove libzip
    cd /usr/local/src
    wget https://libzip.org/download/libzip-1.5.2.tar.gz
    tar -zxvf libzip-1.5.2.tar.gz
    cd libzip-1.5.2
    mkdir build
    cmake .
    make && make install
    
    echo '/usr/local/lib64
    /usr/local/lib
    /usr/lib
    /usr/lib64'>>/etc/ld.so.conf
    ldconfig -v
    

    编译安装PHP

    cd /usr/local/src
    wget http://hk1.php.net/get/php-7.4.0.tar.gz/from/this/mirror -O php-7.4.0.tar.gz
    
    tar -zxvf php-7.4.0.tar.gz
    cd  php-7.4.0
    ./configure 
    --prefix=/usr/local/php-7.4.0 
    --enable-fpm 
    --with-fpm-user=nginx 
    --with-fpm-group=nginx 
    --with-zlib 
    --enable-mysqlnd 
    --enable-bcmath 
    --enable-gd 
    --with-pdo-mysql=mysqlnd 
    --with-mysqli=mysqlnd 
    --with-mysql-sock=/var/lib/mysql/mysql.sock 
    --with-jpeg 
    --with-freetype 
    --with-iconv 
    --with-openssl 
    --with-curl 
    --enable-mbstring 
    --enable-static 
    --enable-sockets 
    --enable-xml
    
    make && make install
    

    编译参数详解

    ./configure 
    --prefix=/usr/local/php-7.4.0  # 指定安装路径
    --enable-fpm              # 表示激活PHP-FPM方式服务,即FactCGI方式运行PHP服务。
    --with-fpm-user=nginx     # 指定PHP-FPM进程管理的用户为www,此处最好和Nginx服务用户统一。
    --with-fpm-group=nginx    # 指定PHP-FPM进程管理用户组为www,此处最好和Nginx服务用户组统一。
    --with-zlib  # 打开zlib库的支持,用于http压缩传输
    --enable-mysqlnd 
    --with-pdo-mysql=mysqlnd 
    --with-mysqli=mysqlnd 
    --with-mysql-sock=/var/lib/mysql/mysql.sock 
    --with-gd         # 打开gd库的支持
    --with-png-dir 
    --with-jpeg-dir 
    --with-freetype-dir 
    --with-openssl    # 打开openssl,加密传输时用到
    --with-curl       # 打开curl浏览工具的支持 
    --enable-mbstring  # 多字节,字符串的支持
    --enable-static  # 生成静态链接库
    --enable-zip  # 打开对zip的支持
    --enable-sockets  # 打开 sockets 支持
    --enable-xml
    

    配置

    cd /usr/local
    
    ln -s php-7.4.0 php
    cp  /usr/local/src/php-7.4.0/php.ini-development /usr/local/php-7.4.0/lib/php.ini
     
     vim /usr/local/php/lib/php.ini
     date.timezone = PRC  (大约在954行)
     expose_php = Off  #避免PHP信息暴露在http头中(大约369行)
     
     display_errors = Off(生产环境设置为off,开发环境就设置为On,便于调试)
     说明:设置了dispaly_errors为off后,需要在php-fpm.conf中开启错误日志记录路径error_log = log/php-fpm.log
     
    cd /usr/local/php 
    cp etc/php-fpm.conf.default etc/php-fpm.conf
    
    cd /usr/local/php/etc/php-fpm.d/
    cp www.conf.default www.conf
    cd /usr/local/php
    sbin/php-fpm
    ps -e | grep php-fpm
    
    如果在编译PHP时指定了--with-mysql=mysqlnd和--with-pdo-mysql=mysqlnd的参数,那么在生产中可能会遇到socket连接问题,解决办法是在php.ini里加入命令: pdo_mysql.default_socket=/usr/local/mysql/tmp/mysql.sock
    
    最好是在编译PHP的时候,指定mysql.socket的位置:
    --with-mysql-sock=/usr/local/mysql/tmp/mysql.sock
    

    管理PHP-FPM

    vim /usr/local/php/etc/php-fpm.conf
    pid = run/php-fpm.pid
    error_log = log/php-fpm.log #24行这个在php.ini设置display_errors = Off时启用
    设置完之后重启服务器
    向进程发送信号,就可以完成进程管理
    停止: kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
    平滑停止: kill -QUIT `cat /usr/local/php/var/run/php-fpm.pid`
    重启:kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
    重新打开日志:kill -USR1 `cat /usr/local/php/var/run/php-fpm.pid`
    

    配置环境变量

    vim /etc/profile
    export PATH=/usr/local/php/bin:$PATH
    source /etc/profile
    

    配置Systemd服务

    其实php-fpm.service文件php已经帮我们配置好了,只需要我们复制到指定位置,并启用就行了。

    cp /usr/local/src/php-7.4.0/sapi/fpm/php-fpm.service /usr/lib/systemd/system/
    

    并编辑该文件

    vim /usr/lib/systemd/system/php-fpm.service
    

    php-fpm.service文件内容如下:

    # It's not recommended to modify this file in-place, because it
    # will be overwritten during upgrades.  If you want to customize,
    # the best way is to use the "systemctl edit" command.
    
    [Unit]
    Description=The PHP FastCGI Process Manager
    After=network.target
    
    [Service]
    Type=simple
    PIDFile=/usr/local/php/var/run/php-fpm.pid
    ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
    ExecReload=/bin/kill -USR2 $MAINPID
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    

    重载daemon

    执行下面的命令重新载入 systemd,扫描新的或有变动的单元即可

    systemctl daemon-reload
    

    开机自启

    systemctl enable php-fpm.service
    systemctl disable php-fpm.service
    

    启动php-fpm

    systemctl start php-fpm.service
    

    关联Nginx和PHP

    nginx.conf配置

    #user  nobody;
    # 有一个工作的子进程,可以自行修改,但太大无益,因为要争夺CPU
    # 一般设置CPU数 * 核数
    worker_processes  1; 
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
    #一般是配置Nginx进程与连接的特性
    #若几个同时工作
        multi_accept on; #打开同时接受多个新网络连接请求的功能。
        use epoll;  #使用epoll事件驱动,因为epoll的性能相比其他事件驱动要好很多
        worker_connections  10240; #这是指一个子进程最大允许连接10240个连接
    }
    
    
    http { # 这是配置http服务器的主要段
        include       mime.types;
        default_type  application/octet-stream;
        
        #隐藏Nginx软件版本号
        server_tokens off;
        
        #激活tcp_nodelay功能,提高I/O性能
        tcp_nodelay on;
    
        # 设置读取客户端请求头数据的超时时间。此处的数值为15,其单位是秒,为经验参考值
        client_header_timeout 15;
    
        # 设置读取客户端请求体的超时时间
        client_body_timeout 15;
    
        # 指定响应客户端的超时时间
        send_timeout 25;
    
        # 上传文件大小限制
        client_max_body_size 8m;
        
        #压缩配置
        gzip on;
        gzip_min_length 1k;
        gzip_buffers 4 16k;
        gzip_http_version 1.0;
        gzip_comp_level 2;
        gzip_types text/css text/xml application/javascript;
        gzip_vary on;
        #include extra/gzip.config;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        include extra/*.conf;
    }
    

    安装Redis

    编译安装

    # 解压源码文件
    tar -zxf redis-5.0.6.tar.gz
    
    # 切换到解压目录
    cd redis-5.0.6
    
    # 编译安装
    mkdir /usr/local/redis-5.0.6
    make PREFIX=/usr/local/redis-5.0.6 install
    
    mkdir /usr/local/redis-5.0.6/etc
    cp redis.conf /usr/local/redis-5.0.6/etc/
    
    # 创建软链接
    cd /usr/local
    ln -sf redis-5.0.6 redis
    

    配置环境变量

    vim /etc/profile
    export PATH=/usr/local/redis/bin:$PATH
    source /etc/profile # 使修改立即生效
    

    配置后台运行

    redis以后台进程的形式运行

    vim /usr/local/redis/etc/redis.conf
    
    # daeonize no(改为)
    # 改为 ->
    daemonize yes
    

    配置Systemd服务

    /etc/systemd/system/添加一个redis.service文件,并添加如下内容

    [Unit]
    Description=Redis
    After=network.target
     
    [Service]
    Type=forking
    PIDFile=/var/run/redis_6379.pid
    ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
    ExecStop=/usr/local/redis/bin/redis-cli shutdown
    PrivateTmp=true
     
    [Install]
    WantedBy=multi-user.target
    

    重载daemon

    执行下面的命令重新载入 systemd,扫描新的或有变动的单元即可

    systemctl daemon-reload
    

    开机自启

    systemctl enable redis.service
    

    启动redis服务

    systemctl start redis.service
    

    参考资料

    centos7 源码编译安装 mysql5.7

    mysql在linux7下systemd的相关配置

    Managing MySQL Server with systemd

    centos7 7.3php编译安装

    centos7下编译安装php7.3

    cmake安装配置及入门指南

    编译CMake 3.15 和 gcc 5.3.0

    CentOS7升级OpenSSL到1.1.1

  • 相关阅读:
    (转)剖析Delphi中的构造和析构
    求排列组合
    用链表写的猴子选大王
    查找文件
    在Delphi程序中应用IE浏览器控件
    汉字转UNICODE?
    webbrowser去掉边框
    自己写的猴子选大王
    数据库IDE查询实例
    Compiz Check测试Linux桌面3D兼容性
  • 原文地址:https://www.cnblogs.com/itbsl/p/12106003.html
Copyright © 2020-2023  润新知