LNMP环境搭建手把手教程
前言
按说网上关于徒手(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 等专业缓存软件的功能。
(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 已成功安装并能正常使用 如果未能正常显示,请检查 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 #安装
疑难杂症
Configure 报错
configure: error: Don’t know how to define struct flock on this system, set –enable-opcache=no
解决:$ echo /usr/local/mysql/lib >> /etc/ld.so.conf.d/mysql-x86_64.conf $ ldconfig -v
make 报错
make: *** [sapi/cli/php] Error 1
解决:$ make clean $ make ZEND_EXTRA_LIBS='-liconv'
配置 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 环境测试
PHP 可用性测试
$ echo "<?php phpinfo(); ?>" >/data/web/<IP>/phpinfo.php
访问
http://<IP>/phpinfo.php
可看到 phpinfo 页面:MySQL 可用性测试
$ vi /data/web/<IP>/phpinfo.php <?php $link_id=mysql_connect('localhost','root','<MySQL Root 密码>') or mysql_error(); if($link_id){ echo "mysql successful !"; }else{ echo mysql_error(); }
访问 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 中看到插件详情: