LNMP环境搭建手把手教程

Author: droid4me      Publish date: 2016-12-08      Tags: Linux, Nginx, MySQL, 教程

前言

按说网上关于徒手(da)撕(jian)鬼(huan)子(jing)的教程已经不少了,更有 LNMP 的 一键安装包 可以使用,傻瓜化操作一路到底,那么问题来了,为什么还要写这篇手把手系列文章班门弄斧咧?一来笔者有 PC 转化的习惯——软件绿色化,希望自己对每个使用的软件有相对深入的认识,自己装配的情况下能够加深学习的感悟;二来觉得虽然没什么人看,但是万一被看到的同时能够解惑读者,那也是再好不过的事情。

环境介绍

Web 服务随着互联网的普及日益成熟,长期以来,Apache 一统天下,多数网站都是依托于 LAMP(Linux/Apache/MySQL/PHP)环境进行搭建的。不过近年来,Nginx 大有成为后起之秀的趋势,根据 netcraft 的统计,截至 2016 年 10 月,Nginx 已经成为市场占有率第三的 Web 服务器程序。与 Apache 相比,Nginx 能够支持跟多的并发连接访问,但占用的资源却更少,效率更高,在功能上也强大了很多——Nginx 除了利用反向代理实现负载均衡,还可以通过自身的 proxy_cache 模块实现类似 Squid 等专业缓存软件的功能。

sp161115_163636.png (Source:Netcraft)

安装和设置

本文基于 Linux 实现独立编译安装 Nginx、MySQL、PHP 而作,下文中 $ 后为运行的命令。

准备工作

关闭selinux和防火墙

$ setenforce 0
$ service iptables stop

安装基础依赖包 PCRE-devel、OpenSSL-devel

$ yum update
$ yum install pcre pcre-devel openssl openssl-devel gcc gcc-c++ lsof libaio -y

检查两者是否安装成功:

$ rpm -qa pcre-devel pcre
pcre-7.8-7.el6.x86_64                        #显示结果
pcre-devel-7.8-7.el6.x86_64                  #显示结果

$ rpm -qa openssl-devel openssl
openssl-1.0.1e-48.el6_8.1.x86_64             #显示结果
openssl-devel-1.0.1e-48.el6_8.1.x86_64       #显示结果

Nginx

安装 Nginx

$ useradd www -s /sbin/nologin -M            #添加用户 www 并禁止 SSH 登录
$ mkdir -p /data/software/                   #建立一个放各种软件的目录
$ cd /data/software/                         #进入目录
$ wget http://nginx.org/download/nginx-1.10.1.tar.gz    #下载 Nginx 软件包
$ tar zxvf nginx-1.10.1.tar.gz                          #解压
$ cd nginx-1.10.1                                       #进入目录
$ ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module          #配置编译
$ make                                                  #编译
$ make install                                          #安装

检查 Nginx 是否安装成功:

$ ll /usr/local/nginx/
总用量 16
drwxr-xr-x 2 root root 4096 8月  14 15:47 conf       #显示结果
drwxr-xr-x 2 root root 4096 8月  14 15:47 html       #显示结果
drwxr-xr-x 2 root root 4096 8月  14 15:47 logs       #显示结果
drwxr-xr-x 2 root root 4096 8月  14 15:47 sbin       #显示结果

Nginx 安装到此完成,就是这么 so easy!

测试启动 Nginx

仅仅安装是远远不够的,还需要测试一下是否配置正常并启动 Nginx:

$ /usr/local/nginx/sbin/nginx -t         #启动前检查配置文件语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok    #显示结果
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful  #显示结果

$ /usr/local/nginx/sbin/nginx            #启动 Nginx

$ lsof -i :80                            #查看 nginx 服务对应的端口是否成功启动
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   34317 root    6u  IPv4  39180      0t0  TCP *:http (LISTEN)     #显示结果
nginx   34318  www    6u  IPv4  39180      0t0  TCP *:http (LISTEN)     #显示结果

$ netstat -lntup | grep 80                #查看 80 端口的设置
tcp     0     0 0.0.0.0:80     0.0.0.0:*     LISTEN     34317/nginx     #显示结果

使用 Web 方式访问本机的外网 IP 时显示如下图:

Nginx 初始界面

如上图正常显示,则表示 Nginx 已成功安装并能正常使用 如果未能正常显示,请检查 80 端口是否被 Apache 占用,关闭 Apache 并重启 Nginx

$ service httpd stop                          #关闭 Apache 服务
$ /usr/local/nginx/sbin/nginx -s reload       #重启 Nginx

配置 Nginx

Nginx 的主配置文件为 /usr/local/nginx/conf/nginx.conf,其配置详细含义如下:

worker_processes  1;                              #worker进程的数量
events {
    worker_connections  1024;                     #每个worker进程支持的最大连接数
}

http {
    include       mime.types;                     #nginx支持的媒体类型库文件
    default_type  application/octet-stream;       #默认的媒体类型
    sendfile        on;                           #开启高效传输模式
    keepalive_timeout  65;                        #连接超时

    server {                                      #第一个server区块,
                                                   表示一个独立的虚拟主机站点
        listen       80;                          #提供服务的端口,默认80
        server_name  localhost;                   #提供服务的域名主机名
        location / {
            root   html;                          #站点的根目录
            index  index.html index.htm;          #默认的首页文件,多个用空格分开
        }
        error_page   500 502 503 504  /50x.html;  #出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html {                    #location区块,访问50x.html
            root   html;                          #指定对应的站点目录
        }
    }
}

规范配置文件

一般来说,为了便于各虚拟主机的管理,我们将所有虚拟主机的自配置文件会统一放入 vhost 目录中,并在 Nginx 的主配置文件中添加配置 include vhost/*.conf; 来使 vhost 目录中的虚拟主机的自配置文件加载进来。公共的配置项写在主配置文件中,各虚拟主机的自配置文件则用于差异化,比如规定虚拟主机配置的网站域名或功能取名等等。

如下提供一个主配置文件 /usr/local/nginx/conf/nginx.conf 的规范化模板,仅供参考:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include vhost/*.conf;
}

如下提供一个域名主机名为本机 <IP> 的虚拟主机的配置文件 /usr/local/nginx/conf/vhost/<IP>.conf 的规范化模板,仅供参考。实际使用时请将 <IP> 替换为实际 IP 或访问域名。

server {
    listen       80;
    server_name  <IP>;
    location / {
      stub_status on;
      access_log  logs/access.log main;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

Nginx 访问日志

上文中 Nginx 主配置文件内设置的日志格式参数配置如下:

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;

可通过查看 /usr/local/nginx/logs/access.log 获取日志信息:

$ tail /usr/local/nginx/logs/access.log

你可以根据以下 Nginx 日志变量说明改写 Nginx 主配置文件内设置的日志格式参数配置,实现日志格式的自定义:

| Nginx日志变量 | 说明 | e.g. | |———- | – | – | | $remote_addr | 访问网站的客户端地址 | 192.168.0.5 | | $remote_user | 远程客户端用户名称 | 无远程用户,用 - 填充 | | $time_local | 访问时间与时区 | [16/Aug/2016:20:29:14 +0800] | | $request | 用户的 HTTP 请求起始行信息 | GET /browserconfig.xml HTTP/1.1 | | $status | HTTP 状态码 | 200 | | $body_bytes_sent | 服务器发送给客户端的响应 body 字节数 | 101 | | $http_referer | 此次请求是从哪个链接访问过来的,可以根据 referer 进行防盗链设置 | | $http_user_agent | 客户端访问信息,如终端信息等 | Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko | | $http_x_forwarded_for | 当前端有代理服务器时,设置 web 节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的 x_forwarder_for 设置 |

MySQL

安装 MySQL

1.创建 MySQL 用户及用户组:

$ groupadd mysql                               #添加用户组 mysql
$ useradd -s /sbin/nologin -g mysql -M mysql   #添加用户 mysql,禁止其 SSH 登录

2.下载 MySQL 安装包,采用二进制方式安装 MySQL:

$ cd /data/software/                                       #进入目录
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz   #下载 MySQL 软件包
$ tar xf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz         #解压
$ mv mysql-5.7.16-linux-glibc2.5-x86_64 /usr/local/mysql   #移动到指定目录
$ cd /usr/local/mysql/                                     #进入目录

$ ls -l /usr/local/mysql/support-files/                    #检查 MySQL 是否解压成功
total 28                                                          #显示结果
-rw-r--r-- 1 7161 31415   773 Sep 28 13:02 magic                  #显示结果
-rw-r--r-- 1 7161 31415  1126 Sep 28 14:02 my-default.cnf         #显示结果
-rwxr-xr-x 1 7161 31415   894 Sep 28 14:02 mysql-log-rotate       #显示结果
-rwxr-xr-x 1 7161 31415 10886 Sep 28 14:02 mysql.server           #显示结果
-rwxr-xr-x 1 7161 31415  1061 Sep 28 14:02 mysqld_multi.server    #显示结果

3.系统配置 MySQL:

$ cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf #拷贝配置文件到系统目录
$ vi /etc/my.cnf                 #编辑配置文件

文件末尾添加如下内容:

[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/data
port = 3306
socket = /tmp/mysql.sock
character-set-server = utf8
default-storage-engine = INNODB

4.初始化MySQL数据库文件

$ mkdir -p /data/mysql/data           #新建数据库目录
$ chown -R mysql.mysql /data/mysql/   #授予用户 mysql 对应的目录权限
$ /data/mysql/data/…..err             #查看日志

#二进制安装
$ bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/data/

$ cat ~/.mysql_secret      #查看 MySQL 的 root 账户密码
# Password set for user 'root@localhost' at 2016-08-26 07:46:46
<password>                 #显示 MySQL 的 root 账户密码

5.配置启动脚本

$ cp support-files/mysql.server /etc/init.d/mysql    #拷贝配置文件到系统目录
$ chmod +x /etc/init.d/mysql                         #授可执行权限

$ vi /etc/init.d/mysql                               #修改启动脚本
basedir=/usr/local/mysql                             #修改项
datadir=/data/mysql/data                             #修改项

$ service mysql start                                #启动 MySQL 服务
$ netstat -lntup | grep mysql                        #查看 MySQL 对应端口的设置
tcp  0  0  :::3306  :::*  LISTEN  11437/mysqld       #显示结果


$ chkconfig --add mysql                              #将 MySQL 添加为系统服务
$ chkconfig mysql on                                 #开启 MySQL 服务
$ chkconfig --list mysql                             #查看 MySQL 服务的运行状态
mysql   0:off   1:off   2:on   3:on   4:on   5:on   6:off   #显示结果

6.配置 MySQL 命令为全局使用路径

$ echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile  #添加到系统环境变量,并写入自启
$ source /etc/profile       #刷新运行自启文件

配置 MySQL

重置 MySQL 密码命令:

$ mysql_secure_installation

查看 MySQL 密码命令:

$ cat /root/.mysql_secret
# Password set for user 'root@localhost' at 2016-08-16 22:26:49
<password>                 #显示 MySQL 的 root 账户密码

MySQL 登录命令:

$ mysql -u root -p

MySQL 用户设置:

mysql> set global validate_password_policy=0;
mysql> set password=password('123456789');                    #修改密码
mysql> alter user 'root'@'localhost' password expire never;
mysql> flush privileges;

PHP

FastCGI 介绍

FastCGI(Fast Common Gateway Interface,快速通用网关接口)是一种让交互程序与 Web 服务器通信的协议。FastCGI 是早期通用网关接口(CGI)的增强版本。FastCGI 致力于减少网页服务器与 CGI 程序之间互动的开销,从而使服务器可以同时处理更多的网页请求。 FastCGI 的主要优点是把动态语言和 HTTP 服务器分离开来。多数流行的 HTTP 服务器都支持 FastCGI,包括 Apache、Nginx 和 Lighttpd 等。

准备工作

我们在此使用 FastCGI 方式安装 PHP 服务,在此之前需要进行一些准备工作,安装一些依赖库。

1.检查确认 Ngnix 及 MySQL 的安装

$ netstat -lntup | egrep "nginx|mysql"
tcp    0    0    0.0.0.0:80    0.0.0.0:*    LISTEN    3573/nginx      #显示结果
tcp    0    0    :::3306       :::*         LISTEN    12268/mysqld    #显示结果

2.安装 PHP 所需的 lib 库

$ yum install zlib libxml libjpeg freetype libpng gd curl libiconv zlib-devel libxml2-devel libjpeg-devel freetype-devel libpng-devel gb-devel curl-devel libxslt* -y

3.安装 libiconv 库

$ cd /data/software/                         #进入目录
$ wget https://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz  #下载 libiconv 库软件包
$ tar zxf libiconv-1.14.tar.gz               #解压
$ cd libiconv-1.14                           #进入目录
$ ./configure --prefix=/usr/local/libiconv   #配置编译
$ make                                       #编译
$ make install                               #安装

4.安装 libmcrypt 库

$ cd /data/software/                         #进入目录
$ wget https://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz   #下载 libmcrypt 库软件包
$ tar zxf libmcrypt-2.5.8.tar.gz             #解压
$ cd libmcrypt-2.5.8                         #进入目录
$ ./configure                                #配置编译
$ make                                       #编译
$ make install                               #安装

5.安装 mhash 加密扩展库

$ cd /data/software/                         #进入目录
$ wget https://sourceforge.net/projects/mhash/files/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz   #下载 mhash 加密扩展库软件包
$ tar zxf mhash-0.9.9.9.tar.gz               #解压
$ cd mhash-0.9.9.9                           #进入目录
$ ./configure                                #配置编译
$ make                                       #编译
$ make install                               #安装

6.安装 mcrypt 加密扩展库

$ cd /data/software/                         #进入目录
$ wget https://sourceforge.net/projects/mcrypt/files/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz   #下载 mcrypt 加密扩展库软件包
$ tar zxf mcrypt-2.6.8.tar.gz                #解压
$ cd mcrypt-2.6.8                            #进入目录
$ /sbin/ldconfig                             #加载配置
$ ./configure LD_LIBRARY_PATH=/usr/local/lib #配置编译
$ make                                       #编译
$ make install                               #安装

7.准备工作的收尾

$ rm -f /usr/lib64/libmcrypt.*                #删除旧的 libmcrypt 库
$ rm -f /usr/lib64/libmhash*                  #删除旧的 libmhash 库

#链接到新安装的库
$ ln -s /usr/local/lib64/libmcrypt.la /usr/lib64/libmcrypt.la
ln -s /usr/local/lib64/libmcrypt.so /usr/lib64/libmcrypt.so
ln -s /usr/local/lib64/libmcrypt.so.4 /usr/lib64/libmcrypt.so.4
ln -s /usr/local/lib64/libmcrypt.so.4.4.8 /usr/lib64/libmcrypt.so.4.4.8
ln -s /usr/local/lib64/libmhash.a /usr/lib64/libmhash.a
ln -s /usr/local/lib64/libmhash.la /usr/lib64/libmhash.la
ln -s /usr/local/lib64/libmhash.so /usr/lib64/libmhash.so
ln -s /usr/local/lib64/libmhash.so.2 /usr/lib64/libmhash.so.2
ln -s /usr/local/lib64/libmhash.so.2.0.1 /usr/lib64/libmhash.so.2.0.1
ln -s /usr/local/lib64/libmcrypt-config /usr/lib64/libmcrypt-config
ln -s /usr/local/lib/libiconv.so.2 /usr/lib64/

安装 PHP

$ cd /data/software/                          #进入目录
$ echo "/usr/local/lib/" >> /etc/ld.so.conf   #添加动态链接库
$ ldconfig
$ echo /usr/local/mysql/lib >> /etc/ld.so.conf.d/mysql-x86_64.conf   #添加动态链接库
$ ldconfig -v                                 #显示正在扫描的目录及搜索到的动态链接库

$ wget http://am1.php.net/get/php-5.6.24.tar.gz/from/this/mirror  #下载 PHP 软件包
$ mv mirror php-5.6.24.tar.gz                 #重命名下载的文件
$ tar zxvf php-5.6.24.tar.gz                  #解压
$ cd php-5.6.24                               #进入目录

#配置编译,下同
$ ./configure \
--prefix=/usr/local/php \
--with-mysql=/usr/local/mysql \
--with-iconv-dir=/usr/local/libiconv \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-safe-mode \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--with-curlwrappers \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--enable-short-tags \
--enable-zend-multibyte \
--enable-static \
--with-xsl \
--with-fpm-user=www \
--with-fpm-group=www \
--disable-fileinfo \
--enable-ftp
$ make                                       #编译
$ make install                               #安装

疑难杂症

配置 PHP

配置 php.ini

$ cd /data/software/php-5.6.24                         #进入目录
$ cp php.ini-production /usr/local/php/lib/php.ini     #拷贝配置文件到 PHP 默认目录

配置 php-fpm.conf

$ cd /usr/local/php/etc                            #进入目录
$ cp php-fpm.conf.default php-fpm.conf             #拷贝配置文件到 PHP 默认目录
$ cd /data/software/php-5.6.24                     #进入目录
$ cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm   #拷贝配置文件到系统目录
$ chmod +x /etc/init.d/php-fpm                     #授可执行权限
$ service php-fpm start                            #开启 php-fpm 系统服务

$ ps -ef | grep php                                #查看 PHP 进程
root     61524     1  2 22:54 ?        00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)   #显示结果
www      61525 61524  0 22:54 ?        00:00:00 php-fpm: pool www    #显示结果
www      61526 61524  0 22:54 ?        00:00:00 php-fpm: pool www    #显示结果
root     61528 61496  0 22:54 pts/2    00:00:00 grep php             #显示结果

$ netstat -lntup | grep 9000                       #查看 PHP 监听的端口
tcp    0    0    127.0.0.1:9000    0.0.0.0:*    LISTEN    61524/php-fpm   #显示结果

配置 Nginx 支持 PHP

1.修改 Nginx 的子配置文件,此处假设虚拟主机绑定的域名主机名为本机 <IP>

$ cd /usr/local/nginx/conf/vhost/
$ vi /usr/local/nginx/conf/vhost/<IP>.conf
以下为虚拟主机子配置文件:
server {
    listen       80;
    server_name  <IP>;
    root /data/web/<IP>/;
    index index.html index.htm;

    location ~ .*\.(php|php5)?$ {
        #fastcgi_pass   unix:/tmp/php-cgi.sock;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        include        fastcgi.conf;
    }

    access_log  logs/access.log main;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    }
}
```
$ mkdir -p /data/web/<IP>/           #建立 <IP> 对应的虚拟主机目录
$ chown www.www /data/web/<IP>/      #授予 www 用户 Web 目录权限
```

2.检查并启动 Nginx

$ /usr/local/nginx/sbin/nginx -t              #启动前检查配置文件语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok    #显示结果
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful  #显示结果

$ /usr/local/nginx/sbin/nginx -s reload       #重启 Nginx

3.LNMP 环境测试

访问 http://<IP>/phpinfo.php 显示如下提示:

mysql successful !

至此,LNMP 搭建完成。

安装数据库缓存及其他 PHP 扩展插件

安装 Memcached 缓存 PHP 扩展插件

$ cd /data/software/                                     #进入目录
$ wget https://pecl.php.net/get/memcache-2.2.7.tgz       #下载 Memcached 软件包
$ tar zxvf memcache-2.2.7.tgz                            #解压
$ cd memcache-2.2.7                                      #进入目录
$ /usr/local/php/bin/phpize                              #建立 PHP 扩展模块
$ ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config    #配置编译
$ make                                                   #编译
$ make install                                           #安装

检查 Memcached 是否安装成功:

$ ll /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
总用量 1912
-rwxr-xr-x 1 root root  260155 8月  21 22:43 memcache.so       #显示结果
-rwxr-xr-x 1 root root 1105184 8月  17 23:36 opcache.a         #显示结果
-rwxr-xr-x 1 root root  586472 8月  17 23:36 opcache.so        #显示结果

配置 Memcached 模块生效

$ vi /usr/local/php/lib/php.ini
:733

编辑 PHP 配置文件的第 733 行为如下内容:

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"
extension = memcache.so
$ /etc/init.d/php-fpm reload

Memcached 可用性测试:

echo "echo phpinfo();" >> /data/web/<IP>/phpinfo.php

访问 http://<IP>/phpinfo.php 可在 phpinfo 中看到插件详情: phpinfo

comments powered by Disqus