本地LNMP开发环境搭建

本文最后由 森林生灵 于 2019/01/23 16:47:23 编辑

文章目录 (?) [+]

    Docker LNMP 请参考 https://github.com/lanseyujie/docker-lnmp

    文中内容仅供在 Deepin Linux amd64 15.7 系统环境下搭建 测试 环境参考,其它版本系统和生产环境请酌情参考。

            学习 PHP 的过程是避免不了与开发环境打交道的,之前在 Windows 系统时用的是 phpStudy 集成环境,图形化的界面和高度集成的傻瓜式操作,确实是方便简单了不少,但也因此让我忽视了环境配置。后来转到 Deepin 系统了,使用的也是使用一个集成开发环境 —— XAMPP,这次是在 Linux 环境了,配置环境不能再像 phpStudy 那样点点鼠标就行了,但由于前期在 Windows 上并没有注重这些,开始用的时候确实十分不顺手。又用过一段时间,发现几个 XAMPP 有许多小问题,比如不能编译插件,配置繁琐。中间有想换成 LNMP 的,可是搜索后发现 Linux 上并没有此类集成开发环境,想到服务器是用的一键 LNMP 安装包便想安装一下,但没成想这个一键安装包会卸载 DDE 桌面环境......终于被逼无奈的搭建了适合自己的本地 LNMP 开发环境,本文由此开始......


    LNMP


    # 我的平台信息
    choi@lanseyujie:~$ uname -a
    Linux lanseyujie 4.15.0-29deepin-generic #31 SMP Fri Jul 27 07:12:08 UTC 2018 x86_64 GNU/Linux
    # 当前用户根路径 $HOME
    # 所有编译的源文件都在 $HOME/lnmp
    # 网站根目录 $HOME/wwwroot
    # 默认站点路径 $HOME/wwwroot/default
    # Nginx 和 PHP-FPM 用户和组都是 choi,MySQL 的用户和组都是 mysql (如果编译安装的话),编译时需要根据实际情况更换用户名


    Nginx

    编译安装

    # 到 https://nginx.org/en/download.html 下载主线版本
    cd ~ && mkdir lnmp && cd lnmp
    wget -c http://nginx.org/download/nginx-1.15.2.tar.gz
    tar zxvf nginx-1.15.2.tar.gz && cd nginx-1.15.2
    # 安装依赖
    sudo apt install libpcre3 libpcre3-dev openssl libssl-dev
    # 检查配置
    ./configure --user=choi --group=choi --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module
    # 编译安装
    make -j4
    sudo make install
    sudo ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

    环境配置

    文件位置:/usr/local/nginx/conf/nginx.conf,下载示例 nginx.conf 文件 https://www.lanseyujie.com/download/nginx.conf

    user  choi choi;
    worker_processes  auto;
    error_log  logs/error.log  crit;
    pid        logs/nginx.pid;
    worker_rlimit_nofile  51200;
    
    events {
        use  epoll;
        worker_connections  51200;
        multi_accept  on;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #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;
    
        server_names_hash_bucket_size  128;
        client_header_buffer_size  32k;
        large_client_header_buffers  4  32k;
        client_max_body_size  50m;
    
        sendfile        on;
        tcp_nopush      on;
    
        keepalive_timeout  60;
        tcp_nodelay     on;
    
        fastcgi_connect_timeout  300;
        fastcgi_send_timeout  300;
        fastcgi_read_timeout  300;
        fastcgi_buffer_size  64k;
        fastcgi_buffers  4  64k;
        fastcgi_busy_buffers_size  128k;
        fastcgi_temp_file_write_size  256k;
    
    
    
        gzip  on;
        gzip_min_length  1k;
        gzip_buffers  4  16k;
        gzip_http_version  1.1;
        gzip_comp_level  2;
        gzip_types  text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
        gzip_vary  on;
        gzip_proxied  expired no-cache no-store private auth;
        gzip_disable  "MSIE [1-6]\.";
    
        server_tokens  off;
        access_log  off;
    
        server {
            listen       80;
            server_name  localhost;
            root   /home/choi/wwwroot/default;
            index  index.html index.htm index.php;
    
            #access_log  logs/host.access.log  main;
    
            location ~ [^/]\.php(/|$) {
                try_files  $uri =404;
                fastcgi_pass  unix:/tmp/php-cgi.sock;
                fastcgi_index  index.php;
                include  fastcgi.conf;
            }
    
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            location / {
                autoindex  on;
                autoindex_exact_size  off;
                autoindex_localtime  on;
            }
    
            location /nginx_status {
                stub_status  on;
                access_log  off;
            }
    
            location ~ /\. {
                deny  all;
            }
        }
    
        include vhost/*.conf;
    
    }

    常用命令

    # 启动
    sudo nginx
    # 测试 nginx.conf
    sudo nginx -t
    # 重载
    sudo nginx -s reload
    # 停止
    sudo nginx -s stop

    环境信息

    nginx path prefix: "/usr/local/nginx"

    nginx binary file: "/usr/local/nginx/sbin/nginx"

    nginx modules path: "/usr/local/nginx/modules"

    nginx configuration prefix: "/usr/local/nginx/conf"

    nginx configuration file: "/usr/local/nginx/conf/nginx.conf"

    nginx pid file: "/usr/local/nginx/logs/nginx.pid"

    nginx error log file: "/usr/local/nginx/logs/error.log"

    nginx http access log file: "/usr/local/nginx/logs/access.log"

    nginx http client request body temporary files: "client_body_temp"

    nginx http proxy temporary files: "proxy_temp"

    nginx http fastcgi temporary files: "fastcgi_temp"

    nginx http uwsgi temporary files: "uwsgi_temp"

    nginx http scgi temporary files: "scgi_temp"


    PHP

    编译安装

    # 到 http://php.net/downloads.php 下载最新稳定版
    cd ~/lnmp
    wget -c http://am1.php.net/distributions/php-7.2.9.tar.gz
    tar zxvf php-7.2.9.tar.gz && cd php-7.2.9
    # 安装依赖
    sudo apt install g++ autoconf openssl libssl-dev libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev libxml2 libxml2-dev libxslt1-dev libzip-dev curl libcurl4-gnutls-dev
    # 查看可用的配置选项
    ./configure -h
    # 检查配置
    ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-libdir=/lib/x86_64-linux-gnu --disable-rpath --enable-fpm --with-fpm-user=choi --with-fpm-group=choi --with-openssl --enable-bcmath --with-zlib --with-curl --enable-exif --enable-ftp --with-gd --with-webp-dir=/usr --with-jpeg-dir=/usr --with-png-dir=/usr --with-freetype-dir=/usr --with-gettext --with-mhash --enable-intl --enable-mbstring --enable-mbregex --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --with-xmlrpc --with-libxml-dir=/usr --with-iconv-dir --with-xsl --enable-zip --with-libzip --enable-mysqlnd
    # 编译安装(耗时约 5 分钟)
    make -j4
    sudo make install
    sudo ln -s /usr/local/php/sbin/php-fpm /usr/sbin/php-fpm

    安装扩展

    请参考 https://www.lanseyujie.com/post/php-extension-compile-and-installation.html

    参数解释

    --with-iconv-dir 启用 XMLRPC-EPI:iconv 支持

    --with-freetype-dir 指定 FreeType2 的安装目录

    --with-jpeg-dir 指定 libjpeg 的安装目录

    --with-png-dir 指定 libpng 的安装目录

    --with-zlib 用于 http 压缩传输

    --disable-rpath 禁用传递其他运行库搜索路径

    --enable-bcmath 公元前风格精度数学

    --enable-shmop --enable-sysvsem 支持 IPC 相关函数

    --enable-mbregex 支持多字节正则表达式

    --enable-mbstring 支持多字节字符串处理

    --enable-intl 启用国际化支持

    --with-mhash mhash 算法扩展

    --enable-pcntl 启用 pcntl 支持(仅限 CLI/CGI 模式)

    --with-gettext 包含 GNU gettext 支持

    常见错误

    # libjpeg-dev 缺失

    configure: error: jpeglib.h not found.

    # 解决方法

    sudo apt install libjpeg-dev

    # libxml2-dev 缺失

    configure: error: xml2-config not found.

    # 解决方法

    sudo apt install libxml2-dev

    # libcurl4-gnutls-dev 未安装或路径问题

    configure: error: Please reinstall the libcurl distribution -

        easy.h should be in <curl-dir>/include/curl/

    # 解决方法

    sudo apt install curl libcurl4-gnutls-dev
    sudo ln -s /usr/include/x86_64-linux-gnu/curl/ /usr/local/include/curl

    常用命令

    # 启动
    sudo /usr/local/php/sbin/php-fpm
    # 停止
    sudo killall php-fpm

    环境配置

    cd /usr/local/php/etc
    sudo cp php-fpm.conf.default php-fpm.conf
    
    sudo cp ~/lnmp/php-7.2.9/php.ini-development /usr/local/php/etc/php.ini
    
    cd /usr/local/php/etc/php-fpm.d
    sudo cp www.conf.default www.conf
    
    # 使用 unix socket 优化并发
    sudo nano www.conf
    
    ;listen = 127.0.0.1:9000
    listen = /tmp/php-cgi.sock
    listen.owner = choi
    listen.group = choi
    listen.mode = 0660
    
    # 环境变量(root用户下执行)
    echo -e '\n\nexport PATH=$PATH:/usr/local/php/bin\n' >> /etc/profile && source /etc/profile

    环境信息

    /bin/bash /home/choi/lnmp/php-7.2.9/libtool --silent --preserve-dup-deps --mode=install cp ext/opcache/opcache.la /home/choi/lnmp/php-7.2.9/modules

    Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/

    Installing PHP CLI binary:        /usr/local/php/bin/

    Installing PHP CLI man page:      /usr/local/php/php/man/man1/

    Installing PHP FPM binary:        /usr/local/php/sbin/

    Installing PHP FPM defconfig:     /usr/local/php/etc/

    Installing PHP FPM man page:      /usr/local/php/php/man/man8/

    Installing PHP FPM status page:   /usr/local/php/php/php/fpm/

    Installing phpdbg binary:         /usr/local/php/bin/

    Installing phpdbg man page:       /usr/local/php/php/man/man1/

    Installing PHP CGI binary:        /usr/local/php/bin/

    Installing PHP CGI man page:      /usr/local/php/php/man/man1/

    Installing build environment:     /usr/local/php/lib/php/build/

    Installing header files:          /usr/local/php/include/php/

    Installing helper programs:       /usr/local/php/bin/

      program: phpize

      program: php-config

    Installing man pages:             /usr/local/php/php/man/man1/

      page: phpize.1

      page: php-config.1

    Installing PEAR environment:      /usr/local/php/lib/php/

    [PEAR] Archive_Tar    - installed: 1.4.3

    [PEAR] Console_Getopt - installed: 1.4.1

    [PEAR] Structures_Graph- installed: 1.1.1

    [PEAR] XML_Util       - installed: 1.4.2

    [PEAR] PEAR           - installed: 1.10.5

    Wrote PEAR system config file at: /usr/local/php/etc/pear.conf

    You may want to add: /usr/local/php/lib/php to your php.ini include_path

    /home/choi/lnmp/php-7.2.9/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin

    ln -s -f phar.phar /usr/local/php/bin/phar

    Installing PDO headers:           /usr/local/php/include/php/ext/pdo/


    MariaDB

    方法一

    参考文档 https://mariadb.com/kb/en/library/installing-mariadb-binary-tarballs/

    二级制文件安装

    # 到 https://downloads.mariadb.org 到最新稳定版页面右侧选择 Generic Linux
    cd ~/lnmp/
    wget -c http://mirror.lstn.net/mariadb//mariadb-10.3.8/bintar-linux-x86_64/mariadb-10.3.8-linux-x86_64.tar.gz
    tar zxvf mariadb-10.3.8-linux-x86_64.tar.gz
    sudo mv mariadb-10.3.8-linux-x86_64 /usr/local/mariadb

    环境配置

    # 初始化数据库
    cd /usr/local/mariadb
    ./scripts/mysql_install_db
    
    # 环境变量(root用户下执行)
    echo -e '\n\nexport PATH=$PATH:/usr/local/mariadb/bin\n' >> /etc/profile && source /etc/profile

    环境信息

    Installing MariaDB/MySQL system tables in './data' ...

    OK

    To start mysqld at boot time you have to copy

    support-files/mysql.server to the right place for your system

    PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !

    To do so, start the server, then issue the following commands:

    './bin/mysqladmin' -u root password 'new-password'

    './bin/mysqladmin' -u root -h lanseyujie password 'new-password'

    Alternatively you can run:

    './bin/mysql_secure_installation'

    which will also give you the option of removing the test

    databases and anonymous user created by default.  This is

    strongly recommended for production servers.

    See the MariaDB Knowledgebase at http://mariadb.com/kb or the

    MySQL manual for more instructions.

    You can start the MariaDB daemon with:

    cd '.' ; ./bin/mysqld_safe --datadir='./data'

    You can test the MariaDB daemon with mysql-test-run.pl

    cd './mysql-test' ; perl mysql-test-run.pl

    Please report any problems at http://mariadb.org/jira

    The latest information about MariaDB is available at http://mariadb.org/.

    You can find additional information about the MySQL part at:

    http://dev.mysql.com

    Consider joining MariaDB's strong and vibrant community:

    https://mariadb.org/get-involved/

    常用命令

    # 启动
    mysqld_safe >/dev/null &
    # 停止
    sudo killall mysqld
    
    # 修改 root 密码
    mysqladmin -uroot password '123456'

    环境信息

    数据库文件位置 /usr/local/mariadb/data

    方法二

    此种方法比较麻烦且耗时较长,不推荐。

    编译安装

    # 到 https://downloads.mariadb.org 到最新稳定版页面右侧选择 Source Code
    cd ~/lnmp
    wget -c http://mirrors.neusoft.edu.cn/mariadb//mariadb-10.2.8/source/mariadb-10.2.8.tar.gz
    tar zxvf mariadb-10.2.8.tar.gz && cd mariadb-10.2.8/
    # 安装依赖
    sudo apt install cmake autoconf bison libncurses5-dev
    # https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html
    # 检查配置
    cmake \
    -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  \
    -DMYSQL_DATADIR=/data/mysql  \
    -DSYSCONFDIR=/etc/mysql \
    -DMYSQL_USER=mysql \
    -DWITH_MYISAM_STORAGE_ENGINE=1 \
    -DWITH_INNOBASE_STORAGE_ENGINE=1 \
    -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
    -DWITH_MEMORY_STORAGE_ENGINE=1 \
    -DWITH_READLINE=1 \
    -DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock \
    -DMYSQL_TCP_PORT=3306 \
    -DENABLED_LOCAL_INFILE=1 \
    -DENABLE_DOWNLOADS=1 \
    -DWITH_PARTITION_STORAGE_ENGINE=1  \
    -DEXTRA_CHARSETS=all \
    -DDEFAULT_CHARSET=utf8mb4 \
    -DDEFAULT_COLLATION=utf8mb4_general_ci \
    -DWITH_DEBUG=0 \
    -DMYSQL_MAINTAINER_MODE=0 \
    -DWITH_SSL:STRING=bundled \
    -DWITH_ZLIB:STRING=bundled \
    -DWITHOUT_MROONGA_STORAGE_ENGINE=1
    # 编译安装(耗时约 1 小时)
    make
    sudo make install

    环境配置

    # 环境变量
    echo -e '\n\nexport PATH=$PATH:/usr/local/mysql/bin\n' >> /etc/profile && source /etc/profile
    # echo -e '\n\nexport PATH=$PATH:/usr/local/mysql/bin\n' >> ~/.bashrc && source ~/.bashrc
    
    # 权限配置
    sudo groupadd mysql
    sudo useradd -g mysql mysql
    sudo mkdir -p /data/mysql
    sudo mkdir /var/run/mysqld
    sudo mkdir /etc/mysql
    sudo chown -R mysql:mysql /data/mysql/
    sudo chown -R mysql:mysql /var/run/mysqld/
    
    # 基础配置
    sudo cp support-files/my-small.cnf /etc/mysql/my.cnf
    sudo nano /etc/mysql/my.cnf
    
    [client]
    default-character-set = utf8
    [mysqld]
    datadir = /data/mysql
    character-set-server = utf8
    
    # 初始化数据库
    cd /usr/local/mysql
    scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql

    常用命令

    # 修改 root 密码
    mysqladmin -uroot password '123456'
    # 或者
    mysql -uroot
    mysql> SET PASSWORD = PASSWORD('123456');
    # 启动
    mysqld_safe --defaults-file=/etc/mysql/my.cnf --user=mysql &
    # 停止
    sudo killall mysqld

    环境信息

    Installing MariaDB/MySQL system tables in '/data/mysql' ...

    OK

    To start mysqld at boot time you have to copy

    support-files/mysql.server to the right place for your system

    PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !

    To do so, start the server, then issue the following commands:

    '/usr/local/mysql/bin/mysqladmin' -u root password 'new-password'

    '/usr/local/mysql/bin/mysqladmin' -u root -h lanseyujie password 'new-password'

    Alternatively you can run:

    '/usr/local/mysql/bin/mysql_secure_installation'

    which will also give you the option of removing the test

    databases and anonymous user created by default.  This is

    strongly recommended for production servers.

    See the MariaDB Knowledgebase at http://mariadb.com/kb or the

    MySQL manual for more instructions.

    You can start the MariaDB daemon with:

    cd '/usr/local/mysql' ; /usr/local/mysql/bin/mysqld_safe --datadir='/data/mysql'

    You can test the MariaDB daemon with mysql-test-run.pl

    cd '/usr/local/mysql/mysql-test' ; perl mysql-test-run.pl

    Please report any problems at http://mariadb.org/jira

    The latest information about MariaDB is available at http://mariadb.org/.

    You can find additional information about the MySQL part at:

    http://dev.mysql.com

    Consider joining MariaDB's strong and vibrant community:

    https://mariadb.org/get-involved/


    PHPMyAdmin

    安装过程

    # 到 https://www.phpmyadmin.net/downloads/ 下载最新稳定版
    cd ~/lnmp/
    wget -c https://files.phpmyadmin.net/phpMyAdmin/4.7.7/phpMyAdmin-4.7.7-all-languages.tar.gz
    tar zxvf phpMyAdmin-4.7.7-all-languages.tar.gz
    mv phpMyAdmin-4.7.7-all-languages /home/choi/wwwroot/default/phpmyadmin

    环境配置

    cd /home/choi/wwwroot/default/phpmyadmin
    cp config.sample.inc.php config.inc.php
    
    nano config.inc.php
    
    $cfg['blowfish_secret'] = md5('testkey'); // 32 位的密码短语必须设置
    $cfg['Servers'][$i]['auth_type'] = 'cookie';
    $cfg['Servers'][$i]['host'] = 'localhost'; // 数据库采用 方法二 安装的需要修改此行为 '127.0.0.1',原来的 localhost 不能使用是因为这种方式使用 Unix 套接字,而默认的 Unix 套接字 /tmp/mysql.sock 并不存在


    Redis

    安装过程

    wget -c http://download.redis.io/releases/redis-5.0.0.tar.gz
    tar -zxvf redis-5.0.0.tar.gz && cd redis-5.0.0/
    make
    cd src
    sudo make PREFIX=/usr/local/redis install
    
    # 修改权限以避免因权限问题而无法退出
    sudo chown $USER:$USER -R /usr/local/redis

    环境配置

    sudo cp redis.conf /usr/local/redis/
    cd /usr/local/redis/
    sudo nano redis.conf
    # 或者在启动后使用 CONFIG SET 命令进行配置

    常用命令

    # 启动服务端
    nohup redis-server /usr/local/redis/redis.conf  >/dev/null 2>&1 &
    
    # 打开客户端
    ./bin/redis-cli

    常见问题

    内存设置问题

    现象

    WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

    原因

    0  表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

    1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

    2  表示内核允许分配超过所有物理内存和交换空间总和的内存。

    解决

    # 临时解决
    sudo su
    echo 1 > /proc/sys/vm/overcommit_memory
    
    # 永久解决(修改后需要重启生效)
    sudo su
    echo \"vm.overcommit_memory=1\" > /etc/sysctl.conf

    透明大页问题

    现象

    WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

    原因

    内核使用透明大页可能会导致 redis 延迟和内存使用问题。

    解决

    # 临时解决
    sudo su
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
    # 永久解决(修改后需要重启生效)
    sudo su
    # 如果存在 /etc/rc.local 文件需要追加这一句
    echo \"echo never > /sys/kernel/mm/transparent_hugepage/enabled\" >> /etc/rc.local
    # 如果不存在 /etc/rc.local 则需要创建添加修改
    echo -e '#!/bin/sh \\n echo never > /sys/kernel/mm/transparent_hugepage/enabled' > rc.local

    无法退出问题

    现象

    User requested shutdown...

    Saving the final RDB snapshot before exiting.

    Failed opening the RDB file dump.rdb (in server root dir /usr/local/redis) for saving: Permission denied

    Error trying to save the DB, can't exit.

    原因

    redis 路径权限不够

    解决

    sudo chown $USER:$USER -R /usr/local/redis


    本文标题:本地LNMP开发环境搭建
    本文链接:https://www.lanseyujie.com/post/build-local-lnmp-development-environment.html
    版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
    点赞 0 分享 0