Debian9(Stretch) 下编译安装LNMP环境

Debian9下源码安装LNMP

1、前言

以前,个人开发环境是Windows-10+PHP-7.1+Nginx-1.10+MariaDB-10.1。php

后面开发须要使用到memcached,redis等nosql比较多,而在Windows下定制难度,不少PHP拓展并无.dll文件,且PHP拓展在Windows下compile难度仍是比较大的。html

因此促使我转向Linux下开发。mysql

首先,我search了一下,主要是Red Hat 与Debian。nginx

基于Red Hat:商业版,Centos,Fedora
基于Debian: Debian,Ubuntu

我选择了Debian 9,PHP-7.2,MariaDB-10.2,Nginx-1.13web

2、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 autoconf
apt 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
## gzip
apt install gzip
## bz2
apt 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-dev

2.2 Nginx 须要的额外库

主要是三个,openssl,zlib,pcre,能够经过Debian自己的库安装,也能够选择源码安装。我选择后者,因此,正则表达式

并不会与上面的冲突,后面会涉及到缘由。redis

2.3 MariaDB 须要的额外库

## bison词法分析器
apt install bison
## libncurses 一个可用于编写独立终端基于文本的的程序库
apt install libncurses5 libncurses5-dev
## libevent-dev 一个事件库
apt install libevent-dev
## openssl 一个加密库
apt install openssl

3、 安装过程

按照MariaDB > Nginx > PHP的顺序安装,安装前请再次检查上述所需的额外库都已安装。sql

3.1 对应的系统用户建立

为何要建立用户?
答:由于安装完成后,咱们只须要这些程序只用于系统服务就好(daemon或者其余本身运行的进程),并不须要使用一个具体用户身份去操做他。即建立系统帐户,以及系统用户组。shell

groupadd -r mysql
useradd -r -g mysql -s /bin/false   -M mysql
mkdir /usr/local/data/mysql
chown -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-fpm数据库

groupadd -r php-fpm
useradd -r -g php-fpm -s /bin/false -M php-fpm

groupadd -r nginx
useradd -r -g nginx -s /bin/false -M nginx

3.2 MariaDB

MariaDB 安装可能略显麻烦,并非常见的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.gz
mkdir build-mariadb
cd build-mariadb
cmake ../ -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=ON
make && make install

若是失败 使用 rm -rf CMakeCache.txt

3.2.1 配置MariaDB

vim /etc/profile.d/mariadb.sh

add
export PATH=$PATH:/opt/soft/mariadb-10.2/bin

source /etc/profile.d/mariadb.sh

cd /opt/soft/mariadb-10.2
scripts/mysql_install_db --user=mysql --datadir=/usr/local/data/mysql

成功输出信息:

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:

'./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 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/maria'

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/

复制

cd /opt/soft/mariadb-10.2
cp support-files/my-large.cnf /etc/my.cnf

或者

cp support-files/my-large.cnf /etc/mysql/my.cnf

建立系统启动脚本(使用systemd)

cd /etc/systemd/system
vim mysqld.service 

[Unit]
Description=MariaDB Server
After=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.sock
User=mysql
Group=mysql
WorkingDirectory=/opt/soft/mariadb-10.2

[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl restart mysqld.service
systemctl 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 anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

默认状况下,MariaDB安装有一个匿名用户,
容许任何人登陆MariaDB而他们无需建立用户账户。
这个目的是只用于测试,安装去更平缓一些。
你应该进入前删除它们生产环境。

Remove anonymous users? [Y/n]         删除匿名用户?(是/否)

Normally, root should only be allowed to connect from 'localhost'.  This
ensures 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 can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

默认状况下,MariaDB提供了一个名为“测试”的数据库,任何人均可以访问。
这也只用于测试,在进入生产环境以前应该被删除。

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

从新加载权限表将确保全部到目前为止所作的更改将当即生效。

Reload privilege tables now? [Y/n]      如今从新加载权限表(是/否)

All done!  If you've completed all of the above steps, your MariaDB
installation 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.bz2
cd 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=mysqli
time_zone=PRC

同时要添加php-fpm配置文件,安装目录下 etc/cp php-fpm.conf.default php-fpm.confcp php.conf.d/www.conf.default php.conf.d/www.conf

PHP-FPM启动脚本(systemd)
PHP 很是人性化,在源码目录下/sapi/fpm下能够找到php-fpm.service文件,复制到/etc/systemd/system/php-fpm.service
systemdctl start php-fpm.service
systemdctl status php-fpm.service
若是发生错误,使用journalctl -xn查看具体错误信息
开机启动,sytemctl enable php-fpm.service

3.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

而后,makemake install

注意,若是是使用二进制包安装了zlib,pcre,openssl,及相应的开发库,不须要指定路径。

配置:
编写nginx守护进程文件,仍是利用systemd工具
vim /etc/sytemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/opt/soft/nginx/logs/nginx.pid
ExecStartPre=/opt/soft/nginx/sbin/nginx -t
ExecStart=/opt/soft/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

这个能够在nginx 官网找到,能够按照本身需求修改。注意路径修改为本身的安装路径。

systemctl start nginx.service 启动Nginx
systemctl enable nginx.service 开机启动

记得,若是中途修改了service文件,必定要先运行 systemctl daemon-reload从新加载守护进程文件。而后运行 systemctl start nginx.service重启服务。

4、APPEND

后续会添加一键安装脚本。

5、参考资料

  1. systemd 入门教程
  2. CentOS7.3编译安装MariaDB10.2.6
  3. CentOS7.3编译安装php7.1
  4. GNU bison
  5. GD-support configure PHP
  6. Argon2
  7. The Sodium crypto library (libsodium)")
  8. get the mariadb code,buildit,test it
  9. Generic Build Instructions
  10. Installing System Tables (mysql_install_db)")
  11. "Compiling MariaDB From Source"
  12. ncurses
  13. CMake
  14. php-manul
  15. PHP7.2 NEW FEATURE
  16. Building nginx from Sources
相关文章
相关标签/搜索