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
相關文章
相關標籤/搜索