阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP)
LNMP环境和软件版本:
名称 | 版本号 | 查询命令 |
---|---|---|
Linux系统 | CentOS Linux release 8.1.1911 (Core) | cat /etc/redhat-release |
Nginx | nginx-1.14.1-9.module_el8.0.0+184+e34fea82.x86_64 | rpm -qa | grep nginx |
MySQL | mysql-8.0.17-3.module_el8.0.0+181+899d6349.x86_64 | rpm -qa | grep mysql |
PHP | php-7.2.11-2.module_el8.1.0+209+03b9a8ff.x86_64 | rpm -qa | grep php |
一、安装Nginx
1、查看是否安装过Nginx。
rpm -qa | grep nginx
2、 有就卸载Nginx。
yum remove -y "nginx*"
3、重新安装Nginx。
yum install -y nginx
4、查看启动状态。
systemctl status nginx
5、启动Nginx。
systemctl start nginx
6、添加开机启动。
systemctl enable nginx
7、设置防火墙开放tcp80端口。
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
firewall-cmd --query-port=80/tcp
8、使用浏览器访问http://外网ip/,显示如下界面,说明安装的Nginx服务正常运行。
9、由以上内容可知,默认主页index.html位于默认目录/usr/share/nginx/html中。若要发布自己的网站内容,替换index.html主页内容即可。例:主页内写入内容 “This is a Nginx test.” 。使用浏览器访问http://外网ip,则显示内容‘This is a Nginx test’。若要更换主页目录位置,需在nginx配置文件/etc/nginx/nginx.conf中设置目录路径。
echo "This is a Nginx test." > /usr/share/nginx/html/index.html
10、部署项目之后,如果用的是thinkPHP框架,一定要记得 给Runtime 文件夹写的权限。
二、安装MySQL数据库
1、查看是否安装过MySQL。
rpm -qa | grep mysql
2、有就卸载MySQL。
yum remove -y "mysql*"
3、查看之前安装的Mysql的目录并删除。
find / -name mysql
如果有结果,例如:
/var/lib/mysql
/usr/share/mysql
则进行删除
rm -rf /var/lib/mysql
rm -rf /usr/share/mysql
4、手动删除my.cnf配置文件
rm -rf /etc/my.cnf
5、确保您的系统已更新。
sudo yum update
6、MySQL8.0包在AppStream存储库中可用,可以通过运行以下命令来安装:
sudo dnf install @mysql:8.0
提示时确认安装(不同的版本一些参数可能有所差异)
Transaction Summary
Install 7 Packages
Total download size: 35 M
Installed size: 229 M
Is this ok [y/N]: y
将安装以下软件包
`Installed:
mysql-8.0.12-6.el8+1923+5642a751.x86_64
mysql-server-8.0.12-6.el8+1923+5642a751.x86_64
mecab-0.996-1.el8+1521+e4919bed.9.x86_64
mysql-common-8.0.12-6.el8+1923+5642a751.x86_64
mariadb-connector-c-config-3.0.6-2.el8.noarch
protobuf-lite-3.5.0-7.el8.x86_64
mysql-errmsg-8.0.12-6.el8+1923+5642a751.x86_64
Complete!`
7、启动MySQL。
systemctl start mysqld
如果启动失败,用 systemctl status mysqld
命令查看报错信息。
Status: "Data Dictionary upgrade from MySQL 5.7 in progress"
Error: 2 (No such file or directory)
如果有上面的这条报错信息。可以尝试在MySQL的配置文件中修改 datadir 的值来解决。(MySQL的配置文件一般是 /etc 下面的my.cnf及其指定的文件,具体的寻找方法可以参考linux下查看mysql的配置文件(查看加载的那个配置文件) 这篇博文)
首先把配置文件中的
datadir=/var/lib/mysql
改为
datadir=/var/lib/mysql/data
保存退出。然后在原来的MySQL的数据存储文件夹(yum 安装,一般是/var/lib/mysql)下新建 data 文件夹,并赋予写权限(这一点一定不要忘,否则启动不成功)。然后再一次启动MySQL。
8、添加开机启动。
systemctl enable mysqld
9、启动服务后,运行命令mysql_secure_installation来加强MySQL数据库服务器
mysql_secure_installation
运行这个命令之后主要的操作包括:
-
设置数据库root用户密码 Please set the password for root here.
-
删除匿名用户 Remove anonymous users?(Press y|Y for Yes, any other key for No)
-
不允许root用户远程登录 Disallow root login remotely?(Press y|Y for Yes, any other key for No)
-
删除测试数据库并访问它 Remove test database and access to it?(Press y|Y for Yes, any other key for No)
-
重新加载特权表 Reload privilege tables now? (Press y|Y for Yes, any other key for No)
设置root密码之后,其他的都可以选择 y ,然后回车。
10、完成后,使用root用户测试访问
mysql -uroot -p
11、登陆MySQL之后,创建一个新用户newuser,密码为123456,授权远程计算机使用账号newuser登陆数据库,并立刻刷新权限。
CREATE USER 'newuser'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'%' WITH GRANT OPTION;
flush privileges;
上述语句表示使用"newuser"账户,"123456“”密码从任何主机连接到mysql服务器,并赋予所有的权限。
12、退出MySQL数据库。
quit;
或
exit;
13、设置防火墙开放tcp3306端口。
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --query-port=3306/tcp
三、 安装PHP
1、查看是否安装过PHP。
rpm -qa | grep php
2、有就卸载PHP。
yum remove -y "php*"
3、重新安装PHP。
yum install -y php
4、创建文件/usr/share/nginx/html/index.php,写入内容 “”。
touch /usr/share/nginx/html/index.php
echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/index.php
5、重启Nginx服务,使用浏览器访问http://外网ip/index.php,如果显示PHP的消息,则说明php安装成功。
systemctl restart nginx
6、完成后还需要添加PHP常用扩展。
yum install -y php-opcache php-pdo php-json php-mysqlnd php-devel php-mbstring php-ldap php-gd php-odbc php-pear php-xml php-xmlrpc php-soap curl-devel
PHP的扩展目录是 /usr/include/php/ext( 可以通过 rpm -qal |grep ext
这个命令来查找扩展目录),可以在这里选择安装自己需要的扩展。
7、一些常用扩展缺失的报错
‘Call to undefined function Think\simplexml_load_string()’
缺少 php-xml 扩展
无法加载数据库驱动: Think\Db\Drive
如果thinkPHP框架,报这个错误,是缺失mysql相关的扩展
如果PHP的图片验证码加载不出来,是缺失 php-gd 扩展
如果ajax不能正常返回 json字符串,可能是缺少 php-json 扩展
写在最后
至此,LNMP环境就安装好了。
我在具体的实践中,主要有两个地方浪费了不少时间:
一是项目部署到服务器之后,Nginx一直报404,我花了差不多半天时间,最后发现竟是Runtime文件夹(本人这次项目中PHP框架用的是thinkPHP3.2.3)没给写的权限;
这个问题解决之后,接踵而至的又是,PHP缺少xml、gd、pdo_mysql等相关扩展导致的问题。
而其中又数pdo_mysql的扩展的安装最是曲折。我一开始是用编译的方法安装pdo_mysql扩展,但是安装时一直提示找不到MySQL数据库。于是我把一开始安装的MariaDB(MariaDB是MySQL关系数据库管理系统的一个复刻,与MySQL的
高度兼容)卸载,重新安装了MySQL8.0,但提示信息还是和原来一样。在我用这个rpm -qal |grep mysql
命令查找服务器上所有的含有‘mysql’关键字的文件和文件夹时,发现在 “/usr/include/php/ext/” 这个文件夹下有一个
‘mysqlnd’的文件夹,下图是我搜索结果的‘mysqlnd’部分:
除此还有 xml、json等等文件夹。而这些文件夹的名字就是我安装过的PHP扩展的名字。我猜测这是服务器上可以安装的PHP的扩展库。当我用yum install -y php-mysqlnd
命令尝试安装mysqlnd的扩展时,
果然成功。
到这一步,整个项目才顺利运行。
接下来,就是对并发的调试。
并发的调试包括针对Web服务器Nginx、PHP进程管理器PHP-FPM、数据库MySQL的配置修改,以及对Linux操作系统内核参数的调整。
后来我还安装了Redis来应对并发中的大量读写。
现在,我把我所有踩过的坑,标记一下,填补一下。以提醒日后的自己,或许也可以帮助其他的人。
下一篇随笔总结一下Nginx针对高并发的一些配置。
本文参考的主要文章有:
Linux安装LNMP(Linux+Nginx+MySQL+PHP)(centos8)
CentOS8或RHEL8系统如何安装MySQL 8.0
centos7下 mysql5.7.9(8.0)启动失败问题
在CentOS7中部署php7.1及开启MySQL扩展
Mysql8.0卸载教程【linux】