Debian9下源码安装LNMP一、前言之前,我的开发环境是Windows-10+PHP-7.1+Nginx-1.10+MariaDB-10.1。后面开发需要使用到memcached,redis等nosql比较多,而在Windows下定制难度,很多PHP拓展并没有.dll文件,且PHP拓展在Windows下compile难度还是比较大的。所以促使我转向Linux下开发。首先,我search了一下,主要是Red Hat 与Debian。基于Red Hat:商业版,Centos,Fedora基于Debian: Debian,Ubuntu我选择了Debian 9,PHP-7.2,MariaDB-10.2,Nginx-1.13二、Requirements一般安装顺序,mariadb > nginx > php,以下的涉及的软件,库名均是基于Debian(Ubuntu)。2.1 PHP的需要的额外库:## 源码需要的词法分析器apt install bison## 源码都是c程序,需要c编译器,注意编译器版本apt install gcc-6## C++编译器apt install g++## xml解析库apt install libxml2 libxml2-dev## make cmake m4 autoconfapt install make cmake m4 autoconf## webp 格式,能够带来更小体积的图片apt install libwebp6 libwebp-dev## jpeg格式支持apt install libjpeg-dev## png格式支持apt install libpng-dev## 免费开源字体引擎apt install libfreetype6 libfreetype6-dev## ssl加密库支持(源码安装openssl,可以选择使用Debian 包来安装openssl)apt install openssl## ssh2 库(源码安装)apt install libssh2-1-dev## mhash 库apt install libmhash2## zlib 压缩库(源码安装)apt install zlib1g zlib1g-dev## pcre 正则表达式库(源码安装)apt install libpcre3-dev libpcre3## gzipapt install gzip## bz2apt install libbz2-1.0 libbz2-dev## soduim php7.2新特性 现代加密标准apt install libsodium-dev## argon2 php7.2新特性 新的加密函数,由PHC(Password Hashing Competition)发布apt install argon2 libargon2-0 libargon2-0-dev2.2 Nginx 需要的额外库主要是三个,openssl,zlib,pcre,可以通过Debian本身的库安装,也可以选择源码安装。我选择后者,所以,并不会与上面的冲突,后面会涉及到原因。2.3 MariaDB 需要的额外库## bison词法分析器apt install bison## libncurses 一个可用于编写独立终端基于文本的的程序库apt install libncurses5 libncurses5-dev## libevent-dev 一个事件库apt install libevent-dev## openssl 一个加密库apt install openssl三、 安装过程按照MariaDB > Nginx > PHP的顺序安装,安装前请再次检查上述所需的额外库都已安装。3.1 对应的系统用户创建为什么要创建用户? 答:因为安装完成后,我们只需要这些程序只用于系统服务就好(daemon或者其他自己运行的进程),并不需要使用一个具体用户身份去操作他。即创建系统账户,以及系统用户组。groupadd -r mysqluseradd -r -g mysql -s /bin/false -M mysqlmkdir /usr/local/data/mysqlchown -R mysql:mysql /usr/local/data/mysql note 参数含义通过man groupadd 或者man useradd 可以调出具体的手册-r 创建系统用户或者用户组-g 指定用户所属用户组-s 指定用户登录shell名字,sh,bash,因为是系统用户,并不需要,设置 /bin/false或者/usr/sbin/nologin-M 不创建用户主目录同样,分别创建nginx,php-fpmgroupadd -r php-fpmuseradd -r -g php-fpm -s /bin/false -M php-fpmgroupadd -r nginxuseradd -r -g nginx -s /bin/false -M nginx 3.2 MariaDBMariaDB 安装可能略显麻烦,并不是常见的make方式,而是cmake方式。获取mariadb-10.2源码wget http://mirror.jaleco.com/mariadb//mariadb-10.2.12/source/mariadb-10.2.12.tar.gz tar -zxvf mariadb-10.2.12.tar.gzmkdir build-mariadbcd build-mariadbcmake ../ -DCMAKE_INSTALL_PREFIX=/opt/soft/mariadb-10.3.4 -DMYSQL_DATADIR=/var/data/mysql -DSYSCONFDIR=/etc -DWITHOUT_TOKUDB=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STPRAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWIYH_READLINE=1 -DWIYH_SSL=system -DVITH_ZLIB=system -DWITH_LOBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DBUILD_LIBPROTOBUF_FROM_SOURCES=ONmake && make install 如果失败 使用 rm -rf CMakeCache.txt3.2.1 配置MariaDBvim /etc/profile.d/mariadb.shaddexport PATH=$PATH:/opt/soft/mariadb-10.2/binsource /etc/profile.d/mariadb.shcd /opt/soft/mariadb-10.2scripts/mysql_install_db –user=mysql –datadir=/usr/local/data/mysql成功输出信息:Installing MariaDB/MySQL system tables in ‘/data/mysql’ …OKTo start mysqld at boot time you have to copysupport-files/mysql.server to the right place for your systemPLEASE 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 localhost.localdomain password ’new-password’Alternatively you can run:’./bin/mysql_secure_installation’which will also give you the option of removing the testdatabases and anonymous user created by default. This isstrongly recommended for production servers.See the MariaDB Knowledgebase at http://mariadb.com/kb or theMySQL manual for more instructions.You can start the MariaDB daemon with:cd ‘.’ ; ./bin/mysqld_safe –datadir=’/data/maria’You can test the MariaDB daemon with mysql-test-run.plcd ‘./mysql-test’ ; perl mysql-test-run.plPlease report any problems at http://mariadb.org/jiraThe latest information about MariaDB is available at http://mariadb.org/.You can find additional information about the MySQL part at:http://dev.mysql.comConsider joining MariaDB’s strong and vibrant community:https://mariadb.org/get-involved/复制cd /opt/soft/mariadb-10.2cp support-files/my-large.cnf /etc/my.cnf或者cp support-files/my-large.cnf /etc/mysql/my.cnf创建系统启动脚本(使用systemd)cd /etc/systemd/systemvim mysqld.service [Unit]Description=MariaDB ServerAfter=network.target[Service]ExecStart=/opt/soft/mariadb-10.2/bin/mysqld –defaults-file=/etc/mysql/my.cnf –datadir=/usr/local/data/mysql –socket=/tmp/mysql.sockUser=mysqlGroup=mysqlWorkingDirectory=/opt/soft/mariadb-10.2[Install]WantedBy=multi-user.targetsystemctl daemon-reloadsystemctl restart mysqld.servicesystemctl status mysqld.servie 如果没有启动,请使用journalctl -xn 或者 journalctl -xl来查看错误信息如果想开机启动,请使用systemctl enable mysqld.service安全设置$:mysql_secure_installation Enter current password for root (enter for none): 输入当前root密码(没有输入)Set root password? [Y/n] 设置root密码?(是/否)New password: 输入新root密码Re-enter new password: 确认输入root密码Password updated successfully! 密码更新成功By default, a MariaDB installation has an anonymous user, allowing anyoneto log into MariaDB without having to have a user account created forthem. This is intended only for testing, and to make the installationgo a bit smoother. You should remove them before moving into aproduction environment.默认情况下,MariaDB安装有一个匿名用户,允许任何人登录MariaDB而他们无需创建用户帐户。这个目的是只用于测试,安装去更平缓一些。你应该进入前删除它们生产环境。Remove anonymous users? [Y/n] 删除匿名用户?(是/否)Normally, root should only be allowed to connect from ’localhost’. Thisensures that someone cannot guess at the root password from the network.通常情况下,root只应允许从localhost连接。这确保其他用户无法从网络猜测root密码。Disallow root login remotely? [Y/n] 不允许root登录远程?(是/否)By default, MariaDB comes with a database named ’test’ that anyone canaccess. This is also intended only for testing, and should be removedbefore moving into a production environment.默认情况下,MariaDB提供了一个名为“测试”的数据库,任何人都可以访问。这也只用于测试,在进入生产环境之前应该被删除。Reloading the privilege tables will ensure that all changes made so farwill take effect immediately.重新加载权限表将确保所有到目前为止所做的更改将立即生效。Reload privilege tables now? [Y/n] 现在重新加载权限表(是/否)All done! If you’ve completed all of the above steps, your MariaDBinstallation should now be secure.全部完成!如果你已经完成了以上步骤,MariaDB安装现在应该安全。Thanks for using MariaDB!至此,mariaddb已经安装完成,可以使用 ps -aux | grep mysql 查看服务现在测试一下,mysql -u root -p 或者 mysql -h localhost -P 5001 -u shanechiu -p 3.3 PHP 安装PHP 安装比较简单,主要是选择你要安装的拓展或者需要开启的功能可以使用./configure –help 来浏览源码安装提供的安装选项有些属于PHP内置的功能,你只需要 enable或者disable,比如php-fpm,是需要启用的。有些拓展是可以动态加载的,称之为shared extension,但是官方也说了,并不是所有的拓展都是能够shared.获取源码:wget http://am1.php.net/distributions/php-7.2.1.tar.bz2解压:tar -xvf php-7.2.1.tar.bz2cd php-7.2.1./configure –prefix=/opt/soft/php7.2 --with-config-file-path=/opt/soft/php7.2/etc --with-mysql-sock=/tmp/mysql.sock --with-openssl --with-mhash --with-mysqli=shared,mysqlnd --with-pdo-mysql=shared,mysqlnd --with-pdo-pgsql=/opt/soft/pgsql --with-gd --with-iconv --with-zlib --enable-exif --enable-intl --enable-calendar --enable-zip --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-xml --enable-bcmath --enable-shmop --enable-mbregex --enable-mbstring --enable-ftp --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-sockets --enable-ipv6 --with-bz2 --with-xmlrpc --enable-soap --without-pear --with-gettext --enable-session --with-curl=/opt/soft/curl7.57–enable-debug --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-opcache --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-sodium --with-libxml-dir --with-password-argon2 --without-gdbm --with-pcre-regex --with-pcre-jit --enable-fast-install --enable-fileinfo配置进入源码文件,cp php.ini.development /opt/soft/php-7.2/php.ini修改以下部分extension_dir=/opt/soft/php-7.2/lib/php/extensions/no-debug-non-zts-20170718/extension=mysqlitime_zone=PRC同时要添加php-fpm配置文件,安装目录下 etc/ 下 cp php-fpm.conf.default php-fpm.conf 和 cp php.conf.d/www.conf.default php.conf.d/www.confPHP-FPM启动脚本(systemd)PHP 非常人性化,在源码目录下/sapi/fpm下可以找到php-fpm.service文件,复制到/etc/systemd/system/php-fpm.service中systemdctl start php-fpm.servicesystemdctl status php-fpm.service如果发生错误,使用journalctl -xn查看具体错误信息开机启动,sytemctl enable php-fpm.service3.4 Nginx 源码安装Nginx的编译安装难易程度应该是LNMP环境中最简单的首先需要三个源码包,一个zlib(压缩库),一个pcre(正则表达式库),一个openssl(加密库,如果要使用HTTPS,这个库是必须的),当然你如果是通过debian本身的包管理器安装的,这个可以省略,但是一定要安装两个,一个是软件本身,同时还要安装开发库,像这种,apt -y install openssl opensll-dev。命令:–configure –prefix=/opt/soft/nginx --user=nginx --group=nginx --with-http_ssl_module \ # 这个默认是不开启的,如需使用TLS,请带上这一项编译。–with-pcre=../pcre-8.41 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.1.0g 然后,make 和 make install注意,如果是使用二进制包安装了zlib,pcre,openssl,及相应的开发库,不需要指定路径。配置:编写nginx守护进程文件,还是利用systemd工具vim /etc/sytemd/system/nginx.service[Unit]Description=The NGINX HTTP and reverse proxy serverAfter=syslog.target network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/opt/soft/nginx/logs/nginx.pidExecStartPre=/opt/soft/nginx/sbin/nginx -tExecStart=/opt/soft/nginx/sbin/nginxExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target这个可以在nginx 官网找到,可以按照自己需求修改。注意路径修改成自己的安装路径。systemctl start nginx.service 启动Nginxsystemctl enable nginx.service 开机启动记得,如果中途修改了service文件,一定要先运行systemctl daemon-reload重新加载守护进程文件。然后运行 systemctl start nginx.service重启服务。四、APPEND后续会添加一键安装脚本。五、参考资料systemd 入门教程CentOS7.3编译安装MariaDB10.2.6CentOS7.3编译安装php7.1GNU bisonGD-support configure PHPArgon2The Sodium crypto library (libsodium)")get the mariadb code,buildit,test itGeneric Build InstructionsInstalling System Tables (mysql_install_db)")“Compiling MariaDB From Source"ncursesCMakephp-manulPHP7.2 NEW FEATUREBuilding nginx from Sources
...