CentOS 7搭建LNMP教程
Nginx (读“engine x”)是一款免费、开源、高性能的HTTP服务器。
Nginx 因性能稳定、功能丰富、配置简单、资源消耗低而著称。
本文介绍如何在Linux服务器(CentOS 7)上安装Nginx、MySQL和PHP7(或者PHP5),这个环境也简称LNMP或LEMP。
其中,Nginx和PHP的采用PHP-FPM方式通信。
1 约定
本问中的测试主机名用本地IP地址:http://127.0.0.1,请根据具体情况替换。
教程中的命令都是在 root 权限下操作,请切换到 root 用户,命令:
su
输入密码后进入 root 用户控制台。
2 安装 MySQL5
与CentOS 6不同,CentOS 7服务器必须通过社区仓库来安装MySQL。
如果像CentOS 6中用:
yum install mysql
默认就会安装 MariaDB 数据库。
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。
开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险。
因此,社区采用分支的方式来避开这个风险,目前来看没有太大必要。
MySQL的社区仓库:https://dev.mysql.com/downloads/repo/yum/。
安装步骤:
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum update yum install mysql-server
在询问的时候键入y
确定安装。
完成后,MySQL默认安装到/var/lib/mysql
目录下。
然后启动MySQL,并设置开机启动:
systemctl start mysqld # 启动 MySQL systemctl enable mysqld # 开机启动ySMySQL
MySQL安装后会绑定到地址 localhost
(127.0.0.1
),默认用户名是root
,密码为空。
使用下面的命令修改root
密码:
mysql_secure_installation
MySQL5.7.6+版本修改root
密码稍有不同,请看这里:MySQL5.7修改默认root密码。
3 安装 Nginx
如果系统上有安装了Apache,先卸载。
service httpd stop systemctl disable httpd yum remove httpd
再安装 Nginx:
yum install epel-release yum -y install nginx
启动 Nginx,并设置为开机启动:
systemctl start nginx systemctl enable nginx
在浏览器中输入服务器的域名或IP地址(如:http://127.0.0.1 ),会看到如下的内容,说明安装成功:
Nginx 默认的HTML根目录是:/usr/share/nginx/html,可以修改其下的 index.html 的内容再看看效果。
为让web应用能读写HTML根目录下的目录和文件,需将其拥有者改为 nginx 用户:
chown -R nginx:nginx html/
4 安装 PHP-FPM
PHP 通过 PHP-FPM(FastCGI进程管理器)可以很好地与 Nginx 协同工作。
PHP-FPM 针对不同规模的网站功能和性能都非常优良,尤其是高并发大型网站。
如下,安装PHP5或PHP7都可以,两者安装其一即可。
PHP5安装步骤:
yum install php php-mysql php-fpm
PHP7.1/7.2/7.3/7.4安装步骤:
# 必要工具
$ yum -y install gcc gcc-c++ yum-utils
# 安装和启用EPEL和Remi存储库
$ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
# 启用Remi存储库作为安装不同PHP版本的默认存储库
$ yum-config-manager --enable remi-php71 # 安装PHP 7.1
$ yum-config-manager --enable remi-php72 # 安装PHP 7.2
$ yum-config-manager --enable remi-php73 # 安装PHP 7.3
$ yum-config-manager --enable remi-php74 # 安装PHP 7.4
# 安装PHP 7以及所有必需的模块,其中PHP 5.3.0以上推荐使用mysqlnd驱动,而不是msyql
$ yum -y install php php-fpm php-devel php-cli php-gd php-pear php-curl php-mysqlnd php-ldap php-zip php-fileinfo php-opcache php-mbstring
然后是配置。打开文件 /etc/php.ini,删除cgi.fix_pathinfo
前面的;
注释符,再赋值为0
,如下:
[...] cgi.fix_pathinfo=0 [...]
再配置PHP-FPM。打开文件 /etc/php-fpm.d/www.conf,
- 将
listen
改为127.0.0.1:9000
- 取消
listen.owner
和listen.group
前面的注释 - 将
user
和group
的值由apache
改为nginx
如下:
[...] listen = 127.0.0.1:9000 [...] listen.owner = nobody listen.group = nobody [...] user = nginx group = nginx [...]
启动 PHP-FPM,并设置为开机启动:
systemctl start php-fpm systemctl enable php-fpm
PHP-FPM 启动之后,会生成 socket 文件 /var/run/php-fpm/php-fpm.sock
作为守护进程运行 FastCGI 服务。
接下来配置 Nginx 的时候会用到这个 socket 文件。
5 配置 Nginx
Nginx 的配置文件是:/etc/nginx/nginx.conf,使用 vi
打开:
vi /etc/nginx/nginx.conf
配置项非常简单,如果需要了解详细内容,可看:https://www.nginx.com/resources/wiki/start/topics/examples/full/。
下面介绍基本的配置。
首先,根据情况调整worker_processes
和keepalive_timeout
(可选):
[...] worker_processes 4; [...] keepalive_timeout 2; [...]
虚拟主机定义在 server{}
容器中,修改为如下内容:
[...] server { listen 80; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # 设置默认主页 index index.php index.html index.htm; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # PHP脚本转发至PHP-FPM解析 location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; # 监听的 php-fpm IP和端口 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; include fastcgi_params; } } [...]
关于配置的一些说明:
- 首先,我们打开两个
listen
,让 Nginx 同时侦听 IPv4 和 IPv6 的80
端口。 server_name _;
绑定所有的域名(可以指定主机名,如www.example.com
)。- 脚本根目录 root 不变,依然是
/usr/share/nginx/html
。 - 索引首页文件 index 添加上
index.php
。 - 其中针对 PHP 很重要的部分在
location ~\.php$ {}
中。为防止零日攻击(详见:http://wiki.nginx.org/Pitfalls#Passing_Uncontrolled_Requests_to_PHP andhttp://forum.nginx.org/read.php?2,88845,page=3),该部分开头设置了try_files $uri =404;
。
保存配置文件后,检查配置文件的语法,再重新加载 Nginx:
nginx -t # 检查配置文件语法 systemctl reload nginx # 重新加载nginx
在 /usr/share/nginx/html 目录下创建文件 index.php,内容为:
<?php phpinfo();
再次访问 http://127.0.0.1,如下:
可以看到,PHP5 已经工作,根据 Server API 行看出,是通过 FPM/FastCGI 方式工作的,往下拉会看到 PHP5 加载的其他模块,如MySQL、cURL、sqlite模块的支持。
6 PHP-FPM 使用 TCP 连接
默认情况下,PHP-FPM 通过 /var/run/php-fpm/php-fpm.sock 文件侦听 socket。
当然,也可以设置 PHP-FPM 使用 TCP 连接。
打开文件 /etc/php-fpm.d/www.conf,设置 listen
值如下:
[...] ;listen = /var/run/php-fpm/php-fpm.sock listen = 127.0.0.1:9000 [...]
这样 PHP-FPM 会侦听地址 127.0.0.1
(localhost)和端口9000
,确保这个端口没有被其他程序占用。
然后重新加载 PHP-FPM:
systemctl reload php-fpm
接下来,编辑 /etc/nginx/nginx.conf 文件,修改如下一行:
[...] #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_pass 127.0.0.1:9000; [...]
然后,重载 nginx 就可以了:
sytemctl reload nginx
这样,整个LNMP环境就搭好了。
参考资料:
- Centos7 安装 PHP7最新版
- CentOS 7 安裝 Nginx、PHP7、PHP-FPM
- How To Install Linux, Nginx, MySQL, PHP (LEMP) stack On CentOS 7
- Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support (LEMP) On Ubuntu 14.04 LTS
- How to Install MySQL on CentOS 7
- HOW TO INSTALL AND CONFIGURE NGINX ON CENTOS 7
非常感谢!!
安装php7的时候那个php70w是什么意思呢?现在是php7.1的该怎么安装呢
这是webstatic源规定的。
webstatic源有PHP7.0扩展,地址:https://webtatic.com/packages/php70/。
也有PHP7.1扩展,把地址中的
php70
改成php71
即可。我按照你的方法配的lnmp,可是不成功。域名和ip都能ping通,可是通过浏览器无法访问。nginx的配置文件没找出什么问题,google了很久也没有找到可能出问题的地方。
我这是可以的呢,自己亲自配了几个环境了。
建议一步步排除,感觉是nginx的配置问题。
修改/var/run/php-fpm/php-fpm.sock 的所有者和用户组 改成nginx就行了
辛苦了 谢谢
rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm 这句报404错误
估计是官方更换了这个发行包,报404说明已经没有这个包了,可以到 http://dl.fedoraproject.org/pub/epel/7/x86_64/e/ 查看新的包名。
目前可以用这个:http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm 执行这个的时候,出现一些错误
错误:打开 失败: 没有那个文件或目录
要先用wget下载这个文件哟~
不错,目测mysql支持只要yum install php-mysql
按照顺序安装的,.sock也生成了,创建一个index.php后,输入相应网址,直接下载。。。,这是啥问题呢。
估计是Nginx没配置好,设置个index
按照方法安装完了 怎么会是php5 版本呢? 你那个修改PHP70 为71的没写明白吧是那个连接里把php70改成71
非常感谢!配置过程很详细,赞!
指出一处错误:vi /etc/nginx/nginx.conf
”index index.php index.html index.htm;“这一行应该加到location大括号里面,类似与这样:
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
否则就会报打不开index.php 并且报错:nginx error !The page you are looking for is temporarily unavailable。。。