centos7安装LNMP

centos7安装LNMP

简要介绍:

一般来说,LNMP是Linux+Nginx+MySQL+PHP的简称,是一种用于替代LAMP的解决方案。在本文档中,我使用CentOS 7来搭建LNMP平台,其中,PHP采用FastCGIserver方式部署。此外,还介绍了如何部署Memcached和phpMyadmin。

CentOS系统安装时选择的是basic server版本,详细版本号为CentOS 7.0.1406,核心版本号为3.10.0-123.el7.x86_64。系统安装在虚拟机上,IP为172.31.2.3,其可与物理机和外界网络正常通信。如未特别说明,本文档所涉及的所有操作均使用root账号进行。

安装Nginx

默认情况下,centos中的yum库并没有提供nginx的源,所以没有办法直接安装nginx。不过,nginx官网上有提供可以更新yum库的软件包,可以到nginx官网http://nginx.org/en/linux_packages.html下载该软件包,或者直接使用下面的命令将该软件包下载下来,并安装它:

[root@www ~]# wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@www ~]# rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm

(这部分可略过)然后,到nginx官网下载它提供的GPG数字签名,或直接使用下面的命令:

[root@www ~]# wget http://nginx.org/keys/nginx_signing.key

 

导入该GPG数字签名文件:

[root@www ~]# rpmkeys –import nginx_signing.key

 

再修改/etc/yum.repos.d/nginx.repo文件中下面这一项:

vi /etc/yum.repos.d/nginx.repo

gpgcheck=1

 

这样以后使用nginx.repo这个yum库来安装软件时就会检查软件的GPG签名了。刚刚下载的那个用于更新yum库的软件包,也可以使用下面的命令来检查它的GPG签名:

[root@www ~]# rpmkeys -K nginx-release-centos-7-0.el7.ngx.noarch.rpm

 

然后就可以安装nginx了:

[root@www ~]# yum install nginx

简要介绍:

一般来说,LNMP是Linux+Nginx+MySQL+PHP的简称,是一种用于替代LAMP的解决方案。在本文档中,我使用CentOS 7来搭建LNMP平台,其中,PHP采用FastCGIserver方式部署。此外,还介绍了如何部署Memcached和phpMyadmin。

CentOS系统安装时选择的是basic server版本,详细版本号为CentOS 7.0.1406,核心版本号为3.10.0-123.el7.x86_64。系统安装在虚拟机上,IP为172.31.2.3,其可与物理机和外界网络正常通信。如未特别说明,本文档所涉及的所有操作均使用root账号进行。

 

安装Nginx

默认情况下,centos中的yum库并没有提供nginx的源,所以没有办法直接安装nginx。不过,nginx官网上有提供可以更新yum库的软件包,可以到nginx官网http://nginx.org/en/linux_packages.html下载该软件包,或者直接使用下面的命令将该软件包下载下来,并安装它:

[root@www ~]# wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

[root@www ~]# rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm

 

 

(这部分可略过)然后,到nginx官网下载它提供的GPG数字签名,或直接使用下面的命令:

[root@www ~]# wget http://nginx.org/keys/nginx_signing.key

 

导入该GPG数字签名文件:

[root@www ~]# rpmkeys –import nginx_signing.key

 

再修改/etc/yum.repos.d/nginx.repo文件中下面这一项:

vi /etc/yum.repos.d/nginx.repo

gpgcheck=1

 

这样以后使用nginx.repo这个yum库来安装软件时就会检查软件的GPG签名了。刚刚下载的那个用于更新yum库的软件包,也可以使用下面的命令来检查它的GPG签名:

[root@www ~]# rpmkeys -K nginx-release-centos-7-0.el7.ngx.noarch.rpm

 

然后就可以安装nginx了:

[root@www ~]# yum install nginx

安装的nginx版本是1.6.3版,是目前稳定版的最新版本。

 

启动nginx服务并将其设为开机启动:

[root@www ~]# systemctl start nginx

[root@www ~]# systemctl enable nginx

然后,检查nginx服务状态:

[root@localhost ~]# systemctl status nginx.service      

假设我们以后的网页数据都放置在/data/www目录下,那么,需要在nginx的配置文件/etc/nginx/nginx.conf的http区块中加入下面内容(include/etc/nginx/conf.d/*.conf;语句前):

vi /etc/nginx/conf.d/default.conf

server{

location / {

root /data/www;

index index.php index.html index.htm;

}

}

 

Nginx 会在 http 头,或者出现错误页的时候会有醒目的版本号提示。
为了安全,可以关闭这些信息。
方法很简单,只需在 nginx.conf 的 http {  里头加入 server_tokens 的参数 }

vi /etc/nginx/nginx.conf

server_tokens off;           

 

修改完配置文件后,让nginx重新加载配置以生效:

[root@www ~]# nginx -s reload

 

创建/data/www目录:

[root@www ~]# mkdir -p /data/www             

 

因为SELinux的关系,即便nginx程序有r权限读取/data/www下的文件,也是会读取失败的。我们需要semanage这个工具来更改/data/www目录的默认SELinux设置,通过命令yum provides semanage查找到这个工具是由policycoreutils-python这个软件包提供的,因此:

[root@www ~]# yum install policycoreutils-python

将/data/www目录(及其子目录和文档)的默认SELinux类型设定为nginx可以读取的httpd_sys_content_t:

[root@www ~]# semanage fcontext -a -t httpd_sys_content_t “/data/www(/.*)?”

确认上面的规则是否添加成功:

[root@www ~]# semanage fcontext -l | grep ‘/data/www’

让/data/www目录的SELinux类型恢复成上面设定的默认值

[root@www ~]# restorecon -Rv /data/www

确认/data/www目录的SELinux类型是否的确为httpd_sys_content_t:

[root@www ~]# ls -dZ /data/www

 

让防火墙放通tcp的 80端口:

[root@localhost ~]# firewall-cmd –zone=public –add-port=80/tcp –permanent

重启防火墙以让更改生效:

[root@localhost ~]# firewall-cmd –reload

使用以下命令确认防火墙配置是否成功:

[root@localhost ~]# firewall-cmd –list-all

 

在/data/www目录目录下创建一个测试页面index.html:

[root@www ~]# echo “This a test page.” >/data/www/index.html

 

如无意外的话,此时使用浏览器访问http://172.31.2.3/index.html应该就可以看到上面的“This is a test page.”文字了:

《centos7安装LNMP》

虽然上面是测试成功了,但此时查看nginx的错误日志文件/var/log/nginx/error.log,可以发现有一个找不到favicon.ico的报错,这个favicon.ico是收藏网页时网页标题旁的那个小图标。要解决这个问题,可以放一个favicon.ico在你所设定的网页根目录下面(这里是/data/www),也可以设定nginx让它不要报这个错。

备注:

nginx的配置文件为:/etc/nginx/conf.d/default.conf

/etc/nginx/nginx.conf

nginx的错误日志为:/var/log/nginx/error.log

nginx的访问日志为:/var/log/nginx/access.log

nginx的相关文档:http://nginx.org/en/docs/

设置nginx以支持PHP(FastCGI方式)

 

为了让nginx以FastCGI的方式与PHP协同工作,让nginx将对于.php文件的请求都传送给PHP进行处理,需要向nginx的配置文件/etc/nginx/nginx.conf中再添加一个location区块,即,将前面的那个server区块改成这样:(      vi /etc/nginx/conf.d/default.conf       )

server{

location / {

root /data/www;

index index.php index.html index.htm;

}

location ~* \.php$ {

root /data/www;

fastcgi_index index.php;

fastcgi_pass   127.0.0.1:9000;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include       fastcgi_params;

}                                       

}

注意:fastcgi_pass那里使用了127.0.0.1:9000而不是localhost:9000,否则日志中会有upstream: “fastcgi://[::1]:9000″之类的报错。

 

修改完成后,让nginx重新加载配置以生效:

[root@www ~]# nginx -s reload

 

 

 

安装PHP(FastCGI方式)

要让PHP以FastCGI的方式与nginx进行交互,需要有PHP-FPM模块的支持。由于这个模块需要集成到PHP的核心中,也就是说,在编译PHP时需要同时将PHP-FPM模块编译进去,所以安装PHP需要从源码进行安装。

 

安装前.先安装些软件和库文件

因为要编译PHP源码,所以需要先安装必要的编译器:

PHP编译时所需用到的支持库也要安装:

yum install -y gcc gcc-c++  make zlib zlib-devel pcre pcre-devel  libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers

 

 

PHP的源码可从PHP官网(http://php.net/downloads.php)获得,或者也可以直接按照下面的步骤进行(所安装版本为目前为止最新的稳定版PHP 5.6.14):

如果未安装bzip2则无法解压tar.bz2文件:  yum install bzip2 bzip2-devel

[root@www ~]# wget http://cn2.php.net/distributions/php-5.6.14.tar.bz2

[root@www ~]# tar -jx -f php-5.6.14.tar.bz2

[root@www ~]# cd ./php-5.6.14

[root@www php-5.6.7]# ./configure –enable-fpm –with-mysql –with-mysqli  –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib-dir –with-libxml-dir  –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –with-curl  –with-curlwrappers –enable-mbregex –enable-mbstring   –with-mcrypt  –with-mhash  –with-gd –enable-gd-native-ttf   –enable-pcntl –enable-sockets –with-xmlrpc –enable-zip –enable-ftp –with-bz2 –without-iconv –with-gettext –with-pear –enable-calendar  –enable-exif

[root@www php-5.6.7]# make

[root@www php-5.6.7]# make install

 

 

 

./configure –enable-fpm –with-mysql –with-mysqli  –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib-dir –with-libxml-dir  –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –with-curl  –with-curlwrappers –enable-mbregex –enable-mbstring   –with-mcrypt  –with-mhash  –with-gd –enable-gd-native-ttf   –enable-pcntl –enable-sockets –with-xmlrpc –enable-zip –enable-ftp –with-bz2 –without-iconv –with-gettext –with-pear –enable-calendar  –enable-exif

 

如果报错

configure: error: mcrypt.h not found. Please reinstall libmcrypt

wget http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz/download

mkdir /usr/local/libmcrypt

gunzip -c download | tar xf –

cd libmcrypt-2.5.8

./configure –disable-posix-threads

make && make install

 

 

 

 

将适用于生产环境的配置文件复制成为PHP的实际配置文件:

[root@www php-5.6.7]# cp php.ini-production /usr/local/lib/php.ini

复制生成PHP-FPM模块的配置文件:

[root@www php-5.6.7]# cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf

将PHP-FPM的执行程序复制到/usr/local/bin目录下:

[root@www php-5.6.7]# cp sapi/fpm/php-fpm /usr/local/bin        

 

 

修改配置文件/usr/local/lib/php.ini中cgi.fix_pathinfo这一项,将它前面的分号去掉,并修改它的值(这样修改的意义是,如果文件不存在,则阻止nginx将请求发送到后端的PHP-FPM模块,以避免遭受恶意脚本注入的攻击): vi /usr/local/lib/php.ini

cgi.fix_pathinfo=0

 

创建一个用户www-data以供php-fpm使用:

[root@www ~]# useradd -s /sbin/nologin www-data

修改配置文件/usr/local/etc/php-fpm.conf中user和group这两项,让php-fpm模块使用www-data用户和www-data用户组的身份运行:   vi /usr/local/etc/php-fpm.conf

user= www-data

group= www-data

 

再来需要将php-fpm程序设为开机启动,这需要将php-fpm做成系统服务。

首先,修改php-fpm的配置文件/usr/local/etc/php-fpm.conf,找到下面这一项,将它前面的分号去掉:

pid= run/php-fpm.pid

 

启动php-fpm程序:

[root@www ~]# /usr/local/bin/php-fpm

在/etc/systemd/system目录下创建文件php-fpm.service,将它的内容修改成如示:

vi /etc/systemd/system/php-fpm.service

 

 

[Unit]

Description=php-fpm

After=network.target remote-fs.target nss-lookup.target

 

[Service]

Type=simple

PIDFile=/usr/local/var/run/php-fpm.pid

ExecStart=/usr/local/bin/php-fpm

ExecReload=/bin/kill -s USR2 $MAINPID

ExecStop=/bin/Kill -s QUIT $MAINPID

 

[Install]

WantedBy=multi-user.target

《centos7安装LNMP》

重新加载systemd管理器配置以使修改生效:

[root@www ~]# systemctl daemon-reload

这样以后就可以使用systemctl命令来管理php-fpm程序了。将php-fpm设为开机启动:

[root@www ~]# systemctl enable php-fpm

启动php-fpm程序:

[root@www ~]# systemctl start php-fpm

如果启动正常的话,可以看到php-fpm在监听tcp的9000端口。

 

到这,PHP就设定好了。接下来就需要进行测试了,在所设置的网页根目录下生成phpinfo页面:

[root@www ~]# echo “<?php phpinfo (); ?>” > /data/www/index.php

使用浏览器访问服务器,如果没什么问题的话,应该就可以看到下面的页面了:

《centos7安装LNMP》

 

备注:

PHP的配置文件为:/usr/local/lib/php.ini

php-fpm的配置文件为:/usr/local/etc/php-fpm.conf

php-fpm的错误日志为:/usr/local/var/log/php-fpm.log

php-fpm.conf文件的在线说明文档:http://php.net/manual/en/install.fpm.configuration.php

 

安装MySQL

由于从RHEL 7开始Red Hat公司推荐使用MariaDB替换MySQL,因此默认情况下,并没有提供MySQL的安装包,也就是没办法直接使用yum命令安装MySQL软件。为了要安装MySQL,我选择的是去官网http://dev.mysql.com/downloads/repo/yum/下载安装包,不过在下载之前需要先注册。因为使用的是CentOS 7系统,所以我下载的是mysql-community-release-el7-5.noarch.rpm这个文件。下载下来后,将它放在/root目录下,然后使用命令:

[root@localhost ~]# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

[root@localhost ~]# rpm -ivh mysql-community-release-el7-5.noarch.rpm

使用上面这个命令可以将MySQL Yum Repository添加到系统的软件库列表(repositorylist)。然后可以使用下面的命令检查添加是否成功:

[root@localhost ~]# yum repolist enabled | grep mysql

然后,使用下面的命令安装MySQL:

[root@localhost ~]# yum install mysql-community-server

 

《centos7安装LNMP》

如上图所示,这个命令会安装MySQL server,附带的,它会安装一些支撑软件,包括MySQL client、共享客户端库(mysql-community-libs)等软件。注意到,这里安装的MySQL版本为5.6版。

安装完成后,启动mysqld服务并将其设为开机启动:

[root@localhost ~]# systemctl start mysqld      

[root@localhost ~]# systemctl enable mysqld

 

然后,检查mysqld服务状态:

[root@localhost ~]# systemctl status mysqld

MySQL侦听tcp端口3306。但因为防火墙并未放通该端口,所以从其它设备上是无法访问本服务器的MySQL数据库的。但因为这里的MySQL也仅是提供给本机的PHP使用的,所以也就不必放通tcp端口3306。如果需要远程登陆mysql则需要开放tcp端口3306:

 

让防火墙放通tcp的 3306端口:

[root@localhost ~]# firewall-cmd –zone=public –add-port=3306/tcp –permanent

重启防火墙以让更改生效:

[root@localhost ~]# firewall-cmd –reload

使用以下命令确认防火墙配置是否成功:

[root@localhost ~]# firewall-cmd –list-all

 

 

根据MySQL官方手册,建议安装完MySQL数据库后使用下面的命令来增强数据库的安全性:

[root@localhost ~]# mysql_secure_installation

该命令程序可以协助你设置数据库root账号的密码,移除匿名用户账号,是否允许远程登录root账号,移除自带的test数据库,最后还会问你是否要重新加载特权表以让修改生效。我是设置了数据库root账号密码,其它的都选是(Y)。

如果不想使用上面的命令,那可以使用下面的命令来给root账号设置密码,回车后它会提示你输入密码的:

[root@localhost ~]# mysqladmin -u root password

如果要修改root账号的密码,可使用下面的命令,回车后,它会提示你输入密码,然后再设置新密码:

补充说明 :上面那两个mysqladmin命令其实是有问题的,因为默认的话,mysql数据库上是有4个root账号的,分别是’root’@’localhost’,’root’@’localhost.localdomain’,’root’@’127.0.0.1’,’root’@’::1’,而mysqladmin命令对’root’@’127.0.0.1’和’root’@’::1’这两个root账号是不生效的。这是我后来看官方文档才知道的,看来不懂数据库真的是容易错漏百出呢。要为所有root账号设置密码,可以进入mysql管理后台后,使用命令UPDATEmysql.user SET Password = PASSWORD(‘新密码‘) WHERE User = ‘root’;来设置或修改密码,使用命令SELECT User, Host, Password FROM mysql.user;来查看修改的效果,使用命令flush privileges;来保存修改。这里的补充说明是后来追加上去的,附件的文档里面并没有这个说明,注意。

 

然后进行下面的操作:

[root@localhost~]# mysql -u root -p                              //以root账号登入MySQL

Enterpassword:

mysql>create user ‘usera’@’localhost’ identified by ‘1234’;       //新建本地用户usera,密码为1234

mysql>create database testdb;                                   //新建数据库mydb

mysql>grant all privileges on testdb.* to usera@localhost;       //将数据库testdb的所有权限授权给本地用户usera

mysql> GRANT ALL PRIVILEGES ON *.* TO root@”%” IDENTIFIED BY ‘123456’  WITH GRANT OPTION;                                  //用户root可以远程连接mysql

mysql>flush privileges;                                          //刷新系统权限表

mysql>use mysql;                                              //进入数据库mysql(该数据库为系统自带)

mysql>select * from user where user = ‘usera’;                  //查询数据库mysql中是否存在用户usera

mysql>show databases;                                         //显示所有已有的数据库

mysql>exit

上面设定好后,就可以使用usera这个账号登录MySQL了,并且可以发现该用户拥有一个数据库testdb。

备注:

MySQL的配置文件:/etc/my.cnf

MySQL的错误日志文件:/var/log/mysqld.log

数据库实际存放目录:/var/lib/mysql

 

 

测试

为了测试PHP能否连接到MySQL数据库,在/data/www目录下新建一个文档testmysql.php。因为之前已经在MySQL中新建了一个数据库testdb,并给这个数据库建了个用户usera,密码是1234,所以test.php的内容是这样的:

vi /data/www/testmysql.php

 

<?php

$mydbhost = ‘localhost’;

$mydbuser = ‘usera’;

$mydbpwd = ‘1234’;

$mydbname = ‘testdb’;

 

$db = mysql_connect($mydbhost,$mydbuser,$mydbpwd) or die(‘cannot find the database.’);

mysql_select_db($mydbname,$db) or die(‘cannot connect the database.’);

?>

Everything is Ok!

《centos7安装LNMP》

上面这个测试页面的内容纯粹是我百度出来的,不过测试后的确有用。在浏览器中访问testmysql.php这个页面,如果测试失败的话(可以试着改一下用户名或数据库名称),那么就会显示Cannot find the databaseCannot connect the database;如果测试成功的话,就会显示Everythingis OK!。如下所示:

《centos7安装LNMP》

上面的那个测试一开始是失败的,查看nginx的错误日志,发现有报“PHP message: PHP Warning: mysql_connect(): No such file or directory”这个错误。解决办法是,进入MySQL数据库的管理后台,执行命令status;,记下UNIXsocket的值。在这我的是:/var/lib/mysql/mysql.sock 再在PHP的配置文件/usr/local/lib/php.ini中找到pdo_mysql.default_socket、mysql.default_socket、mysqli.default_socket这三项,将它们的值都改成与UNIXsocket的值相同。然后再使用命令systemctl restart php-fpm命令重启php-fpm程序就可以了。

 

到这里为止,基本的LNMP平台就搭建好了。




                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值