Linux+Nginx+MariaDB+PHP,LNMP架构的动态网站服务器是比较流行的web服务器整体结构方案,由前几年比较流行的LAMP(Linux+Apache+Mysql+PHP)发展而来。其中将Apache替换成对硬件要求更低,并发数更高并且开源的Nginx;将被Oracle收购了的Mysql换成了完全兼容Mysql的MariaDB;其他不变。

本次突发奇想决定玩一下PHP,所以在VPS上搭了个LNMP环境。

Linux

选择VPS提供商镜像。KVM架构的VPS也可以自行安装各大Linux发行版。
此处安装的是

# cat /etc/redhat-release 
CentOS release 6.6 (Final)
# uname -a  
Linux LA 2.6.32-042stab113.21 #1 SMP Wed Mar 23 11:05:25 MSK 2016 i686 i686 i386 GNU/Linux

Nginx

VPS提供的镜像的yum源的各个软件版本都较低,为了安装更新版的nginx,此处选择自行编译源码安装nginx。
此处nginx安装参考这篇博客

需要首先安装gccgcc-c++openssl此处选择简单的yum安装

yum install -y gcc gcc-c++ openssl

下载nginx源码和其所需的PCRE库与zlib库源码

mkdir nginx
cd nginx
wget http://nginx.org/download/nginx-1.8.1.tar.gz
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
wget https://ncu.dl.sourceforge.net/project/libpng/zlib/1.2.8/zlib-1.2.8.tar.gz
tar zxvf nginx-1.8.1.tar.gz
tar zxvf pcre-8.38.tar.gz
tar zxvf zlib-1.2.8.tar.gz

编译安装nginx

cd nginx-1.8.1
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8
make
make install

安装目录以及其他配置等目录可以自定义。
--with-pcre=--with-zlib=源码路径根据实际填写。
直接启动/usr/local/nginx/nginx即可。

curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
...

nginx
表示安装成功。如果未成功,请查看80端口是否占用,或者使用其他端口。
/usr/local/nginx/nginx有一下几个参数选择,可自行研究。

Options:
  -?,-h         : this help    
  -v            : show version and exit   
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/local/nginx/)
  -c filename   : set configuration file (default: /usr/local/nginx/nginx.conf)
  -g directives : set global directives out of configuration file  

可以在/etc/rc.local中添加开机启动

PHP

此处MariaDB安装参考这篇博客
下载PHP源码,解压。

wget http://cn2.php.net/distributions/php-7.1.0.tar.gz
tar zxvf php-7.1.0.tar.gz

安装PHP的各类依赖包

yum -y install libxml2 libxml2-devel openssl openssl-devel curl curl-devel libjpeg install libjpeg-devel install libpng install libpng-devel install freetype install freetype-devel install pcre install pcre-devel install libxslt install libxslt-devel

编译安装

cd php-7.1.0
./configure --prefix=/usr/local/php --with-curl --with-freetype-dir --with-gd --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-libxml-dir --with-mysqli --with-openssl --with-pcre-regex --with-pdo-mysql --with-pdo-sqlite --with-pear --with-png-dir --with-jpeg-dir --with-xmlrpc --with-xsl --with-zlib --with-bz2 --with-mhash --enable-fpm --enable-bcmath --enable-libxml --enable-inline-optimization --enable-gd-native-ttf --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-xml --enable-zip
make
make install

注意编译时间较久。
接下来配置PHP和nginx。首先从PHP源码目录中复制默认配置到相应目录

cp php.ini-development /usr/local/php/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp sapi/fpm/php-fpm /usr/local/bin

创建web用户

groupadd www-data
useradd -g www-data www-data

修改php-fpm.conf中包含的php-fpm.d目录实际路径

vim /usr/local/php/etc/php-fpm.conf

修改其中包含配置的路径include=NONE/etc/php-fpm.d/*.conf/usr/local/php/etc/php-fpm.d/

cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
vim /usr/local/php/etc/php-fpm.d/www.conf

添加用户名和用户组

user = www-data
group = www-data

接下来修改nginx配置vim /usr/local/nginx/nginx.conf。修改nginx的运行用户和用户组为www-data:www-data。在server{}中的location / {}模块中加入index.php项,并删除释掉启动location ~* \.php$ {}模块,使php生效。修改fastcgi路径fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

user www-data www-data;
...
...
location / {
    root   html;
    index  index.html index.htm index.php;
}
...
...
location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

启动nginx和php-fpm

/usr/local/nginx/nginx -s restart
/usr/local/bin/php-fpm

可通过查看php-fpm的9000端口是否在监听来判断php-fpm是否启动

# netstat -tln | grep 9000
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      

接下里一般会在nginx的html目录下新建一个vim info.php来验证php能否正好解析。

<?php
    phpinfo();
?>

访问http://ip/info.php可以看到安装的php的版本和支持库之类的信息。
phpinfo

MariaDB

MariaDB是Mysql的一个分支,目前还是完全兼容Mysql的,所以在安装的时候目录和名称依然采用mysql的名字。
此处MariaDB安装参考这篇博客
下载MariaDB源码,并解压

mkdir mariadb
cd mariadb
wget https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.1.20/source/mariadb-10.1.20.tar.gz
tar zxvf mariadb-10.1.20.tar.gz

yum安装MariaDB依赖包

yum -y install readline-devel zlib-devel openssl-devel libaio-devel

数据库设计到原始数据,所以一般需要新建专用的用户和用户来运行。这里新建mysql:mysql用户和用户组,并不允许ssh远程登录。

groupadd -r mysql			#创建系统用户组
useradd -g mysql -s /sbin/nologin mysql	#创建用户,归属于mysql组,不允许远程登录

接下来创建数据库目录,并更改为拥有者。此处将数据库数据存放在/data/mysql目录中。

mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql/

现在可以安装MariaDB了。

cd mariadb-10.1.20
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc -DWITHOUT_TOKUDB=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
make
make install

此处编译时间较长,需要耐心等待,若出现编译失败的情况,请删除目录下的编译缓存文件CMakeCache.txt后,更改相关依赖关系重新编译。
安装成功后,进入安装目录,初始化mysql服务器,并安装服务到系统服务中,设置开机启动服务。

cd /usr/local/mysql/
chown -R mysql:mysql *
scripts/mysql_install_db --user=mysql
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld	# 添加至系统服务
chkconfig mysqld on	# 设置开机自启动

最后将/var/lib/mysql/mysql.sock链接到/tmp/mysql.sock,否者无法进入mysql。启动mysql服务。

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
service mysqld start

后续操作参考mysql入门教程。