搭建LNMP环境主要是为了练习PHP用,也是为了以后搭建自己的个人网站做准备。
首先,我的环境是CentOS 7.0.1406,内核3.10.0-123.el7.x86_64
,Nginx 1.10.1
,Mysql 5.7.13
,PHP 7.0.8
。
参考文章:
- http://www.lnmp.cn/installing-php7-mysql57-nginx18-under-centos7.html
- http://www.osyunwei.com/archives/2353.html
- http://5323197.blog.51cto.com/5313197/1295151
- http://nginx.org/en/docs/configure.html
- http://dev.mysql.com/doc/refman/5.7/en/linux-installation-rpm.html
安装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服务运行正常。
安装mysql
- 到官网下载mysql CentOS7 系列的社区版rpm包,用rpm命令安装需要的组件(查看官网的安装说明)
- 配置文件在/etc/my.cnf, 注意文件中的
socket=/var/lib/mysql/mysql.sock
在后面的配置中要用到。 - 因为是rpm安装的,所以默认就可以使用systemctl来管理服务(service命令不能用),启动数据库服务,查看状态,看是否正常启动。
MySQL 5.7
和之前版本很大区别是在安装后会自动为 root@localhost 用户设置一个随机初始密码,之前的版本密码为空的。- 使用下面的命令从日志文件中获取这个随机的密码。
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
- index index.php index.html index.htm; #增加index.php
- 取消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地址,可以看到相关的配置信息! 配置成功。
配置网站(还有疑问。。。)
先建立一个 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中测试的配置信息网页