LNMP 环境搭建

搭建LNMP环境主要是为了练习PHP用,也是为了以后搭建自己的个人网站做准备。
首先,我的环境是CentOS 7.0.1406,内核3.10.0-123.el7.x86_64Nginx 1.10.1Mysql 5.7.13PHP 7.0.8
参考文章:

安装nginx

更新nginx源

CentOS 中的yum库默认情况下没有提供nginx源,从nginx官网下载更新yum库的软件包,安装。

wget  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
rpm  -ivh   nginx-release-centos-7-0.el7.ngx.noarch.rpm

然后从官网下载GPG数字签名(这步可以省略,在此记录仅仅是为了学习怎样使用GPG签名)

wget   http://nginx.org/keys/nginx_signing.key

导入该GPG数字签名文件:

rpmkeys --import nginx_signing.key

再修改/etc/yum.repos.d/nginx.repo文件中下面这一项:
gpgcheck=1 这样以后使用nginx.repo这个yum库来安装软件时就会检查软件的GPG签名了。刚刚下载的那个用于更新yum库的软件包,也可以使用下面的命令来检查它的GPG签名:

rpmkeys -K nginx-release-centos-7-0.el7.ngx.noarch.rpm 

安装

使用yum install nginx发现最新版本是1.6.3,所以从官网下载最新稳定版1.10.1。
在安装nginx之前,先安装一些依赖库。直接用yum安装这三个基础库:pcre,openssl,zlib。
获取源码:

wget http://nginx.org/download/nginx-1.10.1.tar.gz

解压缩,然后就是源码编译安装(configure;make;make install)nginx。编译选项参考http://nginx.org/en/docs/configure.html,如果有错误,根据编译错误提示来操作。检测安装是否成功,在安装目录找到执行文件,运行。用 ps aux | grep nginx 查看服务是否运行。

配置nginx服务管理。

vim /usr/lib/systemd/system/nginx.service
#输入以下内容:
[Unit]
Description=nginx - high performance web server 
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

(注意:上面配置文件中的nginx.pid文件,nginx可执行文件和nginx.conf配置文件的路径要修改成自己安装时候设置的路径)

开启开机启动
systemctl enable nginx.service
接着就可以用systemctl来管理nginx服务了(start,stop,reload,status,restart等命令)
启动nginx服务后,在浏览器中输入服务器地址来验证是否成功。看到以下显示,说明nginx服务运行正常。 LNMP

安装mysql

  1. 到官网下载mysql CentOS7 系列的社区版rpm包,用rpm命令安装需要的组件(查看官网的安装说明)
  2. 配置文件在/etc/my.cnf, 注意文件中的socket=/var/lib/mysql/mysql.sock在后面的配置中要用到。
  3. 因为是rpm安装的,所以默认就可以使用systemctl来管理服务(service命令不能用),启动数据库服务,查看状态,看是否正常启动。
  4. MySQL 5.7 和之前版本很大区别是在安装后会自动为 root@localhost 用户设置一个随机初始密码,之前的版本密码为空的。
  5. 使用下面的命令从日志文件中获取这个随机的密码。
    grep 'temporary password' /var/log/mysqld.log 登录服务器,修改root密码。
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpasswd'
    (注意密码的要求很严格至少要有小写字母,大写字符,数字,特殊字符,超过8位)。

安装PHP

PHP7在2015年年底推出,PHP官方说的比PHP5快2倍,不过有个很值得注意的地方是,虽然PHP7增加了不少新特性,但也很多地方是向后不兼容的, 例如mysql扩展,在PHP7中已经被删除。 这些向后不兼容导致很多程序在PHP7中运行不了,例如Discuz。但其实也不需要特别担心,因为我们可以在同一服务器上安装多个版本的PHP。
安装步骤如下:

下载源码到/usr/local/src

cd /usr/local/src
wget -c http://cn2.php.net/distributions/php-7.0.8.tar.gz
tar -zxvf php-7.0.5.tar.gz
cd php-7.0.5/

安装之前要先安装那些准备装的扩展要用到的软件模块

yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel

安装php:

./configure --prefix=/usr/local/php7 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-mysqli --with-zlib   --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo -enable-tokenizer --enable-zip

make
make install

上面已经提到,PHP7已经删除了MySQL扩展,所以 -with-mysql不再是一个有效的选项。这里用 MySQLi 或 PDO 代替。

配置

配置之前,先说明一下nginx运行用户,php-fpm运行用户,mysql运行用户的关系。参考http://www.ilanni.com/?p=7438。   

说明

Nginx本身不能处理PHP,它只是个web服务器。当接收到客户端请求后,如果是php请求,则转发给php解释器处理,并把结果返回给客户端。如果是静态页面的话,nginx自身处理,然后把结果返回给客户端。
Nginx下php解释器使用最多的就是fastcgi。一般情况nginx把php请求转发给fastcgi管理进程处理,fastcgi管理进程选择cgi子进程进行处理,然后把处理结果返回给nginx。
在这个过程中就牵涉到两个用户,一个是nginx运行的用户,一个是php-fpm运行的用户。如果访问的是一个静态文件的话,则只需要nginx运行的用户对文件具有读权限或者读写权限。
而如果访问的是一个php文件的话,则首先需要nginx运行的用户对文件有读取权限,读取到文件后发现是一个php文件,则转发给php-fpm,此时则需要php-fpm用户对文件具有有读权限或者读写权限。

操作

ps aux | grep nginx查看nginx的运行用户,可知,与配置文件nginx.conf中配置一致(不配置默认是nobody这个用户)
ps aux |grep php-fpm查看php-fpm的运行用户,与其对应的配置文件是www.conf。
我们现在需要做的就是统一nginx与php-fpm运行用户为nobody(通过以上两个配置文件,注意修改完后要重启php-fpm服务,重新加载nginx配置文件),然后把nginx的虚拟主机网站根目录对nobody用户及nobody用户组具有所有权限。

经验

在实际生产环境中,我们一般的配置是nginx与php-fpm都运行在nobody用户下,而且网站的根目录也要属于nobody用户,并且根目录对nobody用户具有所有权限。这样配置是最安全的,因为nobody用户最安全。即使黑客攻破了网站,但是也不能登录系统。

php配置

先是 PHP 的配置文档

[root@lnmp php-7.0.8]# cp php.ini-development /usr/local/php7/lib/php.ini

php.ini 路径应该放在 PREFIX/lib 文件夹,除非在安装的时候通过这个选项修改
--with-config-file-path=PATH
如果安装 PHP 时没有指明 --prefix ,那么就 php.ini 路径就是 /usr/local/lib/php.ini 。刚才安装时有指明 --prefix ,所以是 /usr/local/php7/lib/php.ini。 然后根据实际自己需要修改 php.ini。

[root@lnmp ~]# vim /usr/local/php7/lib/php.ini

查找 mysqli.default_socket,修改成:

mysqli.default_socket = /var/lib/mysql/mysql.sock

其中 /var/lib/mysql/mysql.sock 就是上面安装 MySQL 时提到的。这个值必须填,否则会出现如下错误:
Warning: mysqli_connect(): (HY000/2002): No such file or directory
修改时区,查找 date.timezone,改成(主要将前面的 ; 去掉,这个是注释用的):
date.timezone = PRC
好了,PHP 7 已经安装好,下面验证一下

[root@lnmp php-7.0.8]# /usr/local/php7/bin/php -v
PHP 7.0.8 (cli) (built: Jul 10 2016 06:59:19) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

再查看下已经安装的模块

[root@lnmp php-7.0.8]# /usr/local/php7/bin/php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
gd
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zip
zlib
[Zend Modules]

配置 php-fpm

copy php-fpm 的配置文档

[root@lnmp php-7.0.8]# cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
[root@lnmp php-7.0.8]# cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf

其中 www.conf 中要留意以下这个值
listen = 127.0.0.1:9000
这里使用 9000 端口,这个选项在配置 Nginx 网站时要用到的。
配置 php-fpm 启动服务脚本

[root@lnmp php-7.0.8]# cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/

修改启动脚本,把里边 prefix 相关的内容用实际路径代替

[root@lnmp php-7.0.8]# vim /usr/lib/systemd/system/php-fpm.service

PIDFile=${prefix}/var/run/php-fpm.pid
ExecStart=${exec_prefix}/sbin/php-fpm --nodaemonize --fpm-config ${prefix}/etc/php-fpm.conf

修改成

PIDFile=/usr/local/php7/var/run/php-fpm.pid
ExecStart=/usr/local/php7/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php7/etc/php-fpm.conf

重新载入 systemd

[root@lnmp php-7.0.8]# systemctl daemon-reload

让 php-fpm 随机启动

[root@lnmp php-7.0.8]# systemctl enable php-fpm
ln -s '/usr/lib/systemd/system/php-fpm.service' '/etc/systemd/system/multi-user.target.wants/php-fpm.service'

立即启动 php-fpm

[root@lnmp php-7.0.8]# systemctl start php-fpm

查看状态

[root@lnmp php-7.0.5]# systemctl status php-fpm
php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled)
   Active: active (running) since Fri 2016-04-08 00:50:54 CST; 3s ago
 Main PID: 13609 (php-fpm)
   CGroup: /system.slice/php-fpm.service
           ├─13609 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
           ├─13610 php-fpm: pool www
           └─13611 php-fpm: pool www
Apr 08 00:50:54 lnmp.cn systemd[1]: Started The PHP FastCGI Process Manager.

php-fpm 已经成功启动。

配置nginx.conf

  1. index index.php index.html index.htm; #增加index.php
  2. 取消FastCGI server部分location的注释,并要注意fastcgi_param行的参数,改为$document_root$fastcgi_script_name,或者使用绝对路径

测试

进入nginx默认网站根目录(参考:/usr/local/nginx/html)

vi  index.php   #新建index.php文件
#输入
<?php
	phpinfo();
#保存
:wq!
#设置目录所有者
chown nobody:nobody /usr/share/nginx/html/ -R  

在客户端浏览器输入服务器IP地址,可以看到相关的配置信息! php.png 配置成功。

配置网站(还有疑问。。。)

先建立一个 lnmp 站点,路径是 /www/lnmp/web

[root@lnmp php-7.0.8]# mkdir -p /www/lnmp/web

并准备好 phpinfo 测试文件

[root@lnmp php-7.0.8]# vim /www/lnmp/web/phpinfo.php

输入如下内容保存:

<?php
phpinfo();

每个站点建一个 Nginx 配置文件放到 /usr/local/nginx/conf/

[root@lnmp php-7.0.8]# cd /usr/local/nginx/conf/
[root@lnmp conf]# vim myphp.com.conf

在 myphp.com.conf 中加入以下内容然后保存

server {
    listen       80;
    server_name  www.myphp.com;
    root         /www/lnmp/web;
    location / {
        index  index.php index.html index.htm;
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

其中 server_name www.myphp.com; 中的 www.myphp.com 改成你自己的域名
其中 root /www/lnmp/web; 就是刚才创建的站点目录
其中 fastcgi_pass 127.0.0.1:9000; 就是上面配置 php-fpm 提到要留意的值
修改配置后一定要记得 reload nginx 才能生效

[root@lnmp conf]# systemctl reload nginx

好了,大功告成,就打开刚才的域名验证下(前提是域名已经指向配置好的服务器 IP: 在windows上的hosts文件设置域名映射到服务器ip) 浏览器输入:http://www.myphp.com/phpinfo.php看是否能获得7中测试的配置信息网页